Правильный формат для команды добавления IMAP в Python? (Yahoo Mail)

Следующая функция Python работает для Outlook, Gmail и моего exim-сервера общего хостинга, но при отправке почты через yahoo.com она возвращает эту ошибку:

APPEND command error: BAD ['[CLIENTBUG] Additional arguments found after last expected argument']. Data: FHDJ4 APPEND inbox.sent "31-Aug-2016 12:30:45 +0100" {155}

Для сравнения, Outlook возвращает:

('OK', ['[APPENDUID 105 2] APPEND completed.'])

Gmail возвращает:

 ('OK', ['[APPENDUID 14 2] (Success)'])

и Exim возвращает:

('OK', ['[APPENDUID 1472211409 44] Append completed (0.788 + 0.076 secs).'])

Моя функция использует imaplib2, аргументы, передаваемые ей, представляют собой строки, а self.username — это адрес электронной почты отправителя в виде [email protected].

Моя функция:

def send_mail(self, to_addrs, subject, msgtext, verbose=False):
    # build message to send
    msg = email.message.Message()
    msg.set_unixfrom('pymotw')
    msg['From'] = self.username
    msg['To'] = to_addrs
    msg['Subject'] = subject
    msg.set_payload(msgtext)

    if verbose: print("Sending Mail:\n ", msg)

    # connect and send message
    server = self.connect_smtp()
    server.ehlo()
    server.login(self.username, self.password)
    server.sendmail(self.username, to_addrs, str(msg))
    server.quit()
    print("Saving mail to sent")
    sentbox_connection = self.imap_connection
    print(sentbox_connection.select('inbox.sent'))
    print(sentbox_connection.append('inbox.sent', None, imaplib2.Time2Internaldate(time.time()) , str(msg)))

Вместо этого я попытался сгенерировать переменную msg с помощью этой строки:

        msg = "From: %s\r\n" % self.username + "To: %s\r\n" % to_addrs + "Subject: %s\r\n" % subject + "\r\n" + msgtext

и добавление сообщения с использованием "" вместо None следующим образом:

        print(sentbox_connection.append('inbox.sent', None, imaplib2.Time2Internaldate(time.time()) , str(msg)))

Можете ли вы сказать мне, что я делаю неправильно? Или если у Yahoo есть особый способ обработки команд добавления, который мне нужно учитывать?

Изменить: чтобы уточнить, отправка почты работает нормально для всех smtp-серверов, но добавление отправленной почты в inbox.sent не удается для yahoo


person Awebb    schedule 31.08.2016    source источник


Ответы (1)


Я решил это. Я заметил, что текст сообщения не заканчивается на CRLF. Другие почтовые серверы добавляли эту серверную часть, чтобы принять команду, Yahoo этого не делает. Нижеприведенное теперь работает.

Я изменил строку полезной нагрузки сообщения на: msg.set_payload("%s \r\n" % msgtext) # Yahoo строг с CRLF в конце команды IMAP

person Awebb    schedule 31.08.2016
comment
вау, это работает!, в C# builder.Text = "text email body" + Environment.NewLine; - person Jaider; 02.08.2017