使用docmd发送邮件的Python smtplib

使用docmd发送邮件的Python smtplib,python,smtplib,Python,Smtplib,我目前有一个使用sendmail的smtplib客户端。我需要捕获接收服务器提供给发送消息的消息id,并且根据我所读的内容,我需要使用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

我目前有一个使用sendmail的smtplib客户端。我需要捕获接收服务器提供给发送消息的消息id,并且根据我所读的内容,我需要使用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 here”)时,它会挂起吗?类似地,我假设我应该执行
r=svr.docmd(“send“,”)
来发送终止的“.”字符来发送邮件,并获取服务器响应(理论上包括msg id!),作为返回元组的一部分

如果有人能指出我在最后的步骤中的错误,我会非常感激的


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

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响应的内容。指定此答复包含一个3位数字,后跟一个文本解释。如果数字后面跟一个
-
,则它可以是多行的。但是smtplib模块对您隐藏了所有这些。如果使用低级命令,主要关注点是数字的第一位:

1yz正面初步答复
2yz肯定完成回复
3yz肯定中间答复
4yz瞬态否定完成回复
5yz永久否定完成回复
如果是4或5,则命令被拒绝;如果是1、2或3,则命令成功

如果使用directly sendmail命令,如果未收到异常,则表明服务器已成功接收邮件,并且至少在收件人上接受了邮件。返回值是一个字典,每个被拒绝的收件人有一个条目。每个条目都包含一个SMTP错误代码元组,以及服务器发送的伴随错误消息(摘自模块文档)


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

谢谢@SergeBallesta。。。我很欣赏“sendmail”是发送邮件的更好方式,但它不会从远程服务器返回任何信息。据我所知,docmd返回一个元组,该元组将(希望!)包含服务器给消息的引用。。。除非您能建议一种更好的方式获取此信息?@SteveHall:SMTP协议没有将邮件引用返回给发件人的规定。看我的编辑。我担心你会说。。。。但我非常希望你不会。。。。奇怪的是,我得到了上面的docmd解决方案(虽然显然没有返回我想要的参考)-我实际上成功地传递了消息,尽管docmd序列返回了5xx。。。不管怎样,我想这些都是无关紧要的。。。。非常感谢您的时间和帮助:)