'Add message and return assigned key.'

def add(self, message):

    tmp_file = self._create_tmp()
    try:
        self._dump_message(message, tmp_file)
    except BaseException:
        tmp_file.close()
        os.remove(tmp_file.name)
        raise
    _sync_close(tmp_file)
    if isinstance(message, MaildirMessage):
        subdir = message.get_subdir()
        suffix = (self.colon + message.get_info())
        if (suffix == self.colon):
            suffix = ''
    else:
        subdir = 'new'
        suffix = ''
    uniq = os.path.basename(tmp_file.name).split(self.colon)[0]
    dest = os.path.join(self._path, subdir, (uniq + suffix))
    if isinstance(message, MaildirMessage):
        os.utime(tmp_file.name, (os.path.getatime(tmp_file.name), message.get_date()))
    try:
        if hasattr(os, 'link'):
            os.link(tmp_file.name, dest)
            os.remove(tmp_file.name)
        else:
            os.rename(tmp_file.name, dest)
    except OSError as e:
        os.remove(tmp_file.name)
        if (e.errno == errno.EEXIST):
            raise ExternalClashError(('Name    clash    with    existing    message:    %s' % dest))
        else:
            raise
    return uniq
