Python 中 IMAP 追加命令的正确格式? (雅虎邮箱)
Correct format for IMAP append command in Python? (Yahoo mail)
以下 Python 函数适用于 outlook、gmail 和我的共享托管 exim 服务器,但是当通过 yahoo.com 发送邮件时 returns 出现此错误:
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}
为了比较,前景returns:
('OK', ['[APPENDUID 105 2] APPEND completed.'])
Gmail returns:
('OK', ['[APPENDUID 14 2] (Success)'])
和 Exim returns:
('OK', ['[APPENDUID 1472211409 44] Append completed (0.788 + 0.076 secs).'])
我的函数使用的是imaplib2,传递给它的参数都是字符串,self.username是发件地址,地址为@domain.com
我的函数是:
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
失败
我已经解决了这个问题。我注意到消息文本没有以 CRLF 结尾。其他邮件服务器附加此服务器端以接受命令,但雅虎不会。以下现在有效。
我已将消息负载行修改为:
msg.set_payload("%s \r\n" % msgtext) # Yahoo 在 IMAP 命令末尾严格使用 CRLF
以下 Python 函数适用于 outlook、gmail 和我的共享托管 exim 服务器,但是当通过 yahoo.com 发送邮件时 returns 出现此错误:
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}
为了比较,前景returns:
('OK', ['[APPENDUID 105 2] APPEND completed.'])
Gmail returns:
('OK', ['[APPENDUID 14 2] (Success)'])
和 Exim returns:
('OK', ['[APPENDUID 1472211409 44] Append completed (0.788 + 0.076 secs).'])
我的函数使用的是imaplib2,传递给它的参数都是字符串,self.username是发件地址,地址为@domain.com
我的函数是:
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
失败我已经解决了这个问题。我注意到消息文本没有以 CRLF 结尾。其他邮件服务器附加此服务器端以接受命令,但雅虎不会。以下现在有效。
我已将消息负载行修改为: msg.set_payload("%s \r\n" % msgtext) # Yahoo 在 IMAP 命令末尾严格使用 CRLF