Attach a file to the message given a filename.

        :param filename: Name of the file to attach.
        :param content_type: mimetype of the data. It will be guessed from the
            filename if not provided.
        :param content_id: ContentID URL of the attachment.  A RFC 2392-
            compliant URL for the attachment that allows it to be referenced
            from inside the body of the message.  Must start with 'cid:'

def attach_file(self, filename, content_type=None,
                    content_id=None):
        '''Attach a file to the message given a filename.

        :param filename: Name of the file to attach.
        :param content_type: mimetype of the data. It will be guessed from the
            filename if not provided.
        :param content_id: ContentID URL of the attachment.  A RFC 2392-
            compliant URL for the attachment that allows it to be referenced
            from inside the body of the message.  Must start with 'cid:'
         '''
        # Open the file, grab the filename, detect content type
        name = os.path.basename(filename)
        if not name:
            err = 'Filename not found in path: {0}'
            raise MessageError(err.format(filename))
        with open(filename, 'rb') as f:
            data = f.read()
        self.attach_binary(data, name, content_type=content_type,
                           content_id=content_id)