Python smtplib使用docmd发送邮件

时间:2014-11-28 15:49:34

标签: python smtplib

我目前有一个使用sendmail的smtplib客户端。我需要捕获接收服务器给发送消息的消息ID - 从我读过的here我需要使用smtplib的docmd命令。到目前为止我所做的工作相当容易:

import smtplib
svr = smtplib.SMTP("localhost",26)
r = svr.docmd("ehlo", "me")
r = svr.docmd("mail from:","me@home.com")
r = svr.docmd("rcpt to:","you@work.com")
r = svr.docmd("data","")

但是现在当我尝试svr.docmd("send","Hello there")它只是挂起?同样,我假设我应该r = svr.docmd("send",".")发送终止“。”发送邮件的字符,并获得服务器响应(理论上包括msg id!)作为返回元组的一部分?

如果有人能指出我在最后一步出错的地方,我真的很感激吗?

或者我完全误解了 - 使用docmd而不是在发送邮件时获取服务器响应的方式?如果我错了,我应该做什么呢?

1 个答案:

答案 0 :(得分:1)

smtplib模块无法像那样工作。它是一个更高级别的库,您应尝试使用docmd发送简单邮件。 docmd只能传递特殊命令。你应该简单地使用:

svr.sendmail('me@home', 'you@work', 'msg')

如果你真的想这么做困难,你应该只用docmd发送所有数据:

...
r = svr.docmd("data")
r = svr.docmd("line 1\r\nline 2\r\n.\r\n")

这样它就是一个接收其SMTP响应的完整命令

编辑:

返回低级别命令是SMTP响应的内容。 RFC 2821指定此回复包含3位数字,后跟文本说明。如果数字后跟-,则可以是多行。但是smtplib模块对你隐藏了所有这些。如果使用低级命令,主要关注点是数字的第一位数字:

1yz   Positive Preliminary reply
2yz   Positive Completion reply
3yz   Positive Intermediate reply
4yz   Transient Negative Completion reply
5yz   Permanent Negative Completion reply

如果它是4或5,则命令被拒绝,1,2或3成功

如果您直接使用sendmail命令,如果您没有收到例外,则服务器已成功接收邮件,并且至少在收件人上接受该邮件。返回值是字典,每个收件人都有一个被拒绝的条目。每个条目都包含SMTP错误代码的元组和服务器发送的随附错误消息(从模块文档中提取)。

我建议您使用sendmail命令,除非您想学习SMTP协议或有其他特殊要求。