在使用 Python smtplib 时检查电子邮件日志

Posted

技术标签:

【中文标题】在使用 Python smtplib 时检查电子邮件日志【英文标题】:Checking the emails logs while using Python smtplib 【发布时间】:2021-12-18 20:21:54 【问题描述】:

我编写了一个使用 smtplib 发送电子邮件的简单程序。该程序完美运行并发送电子邮件。有没有什么选项可以让我在通信过程中查看所有日志?意思是可以打印或查看发生的 smtp 对话吗?

【问题讨论】:

是的,当然,但我们需要有关您的项目的更多详细信息。首先是:什么日志?你想要什么样的信息? 我的项目是分析smtp通信输出的差异。例如,我想获取我之前的所有日志,客户端到我发送邮件的服务器,例如: Trying 147.102.222.210... Connected to achilles.noc.ntua.gr。转义字符是'^]'。 220 ntua.gr ESMTP 发送邮件 8.9.3/8.9.3; 2001 年 5 月 12 日星期六 05:15:11 +0300 (EET DST ) HELO localhost 250 ntua.gr 你好 hill.ucr.edu [138.23.169.9],很高兴见到你 邮件来自:thanos@cs.ucr.edu 250 thanos @cs.ucr.edu... 发件人正常 RCPT 至:thanos@photonics.ece.ntua.gr 250 thanos@photonics.ece.ntua.gr... 收件人正常 【参考方案1】:

首先您应该检查smtplib 的文档 - 请参阅set_debuglevel

with smtplib.SMTP_SSL(f'host:port') as server:

    server.set_debuglevel(1)

    server.login(login, password)
    server.sendmail(sender_email, recipients, message.as_string())

对于.set_debuglevel(1),它会显示

send: 'ehlo [127.0.1.1]\r\n'
reply: b'250-smtp.googlemail.com at your service, [79.163.228.253]\r\n'
reply: b'250-SIZE 35882577\r\n'
reply: b'250-8BITMIME\r\n'
reply: b'250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH\r\n'
reply: b'250-ENHANCEDSTATUSCODES\r\n'
reply: b'250-PIPELINING\r\n'
reply: b'250-CHUNKING\r\n'
reply: b'250 SMTPUTF8\r\n'
reply: retcode (250); Msg: b'smtp.googlemail.com at your service, [79.163.228.253]\nSIZE 35882577\n8BITMIME\nAUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH\nENHANCEDSTATUSCODES\nPIPELINING\nCHUNKING\nSMTPUTF8'
send: 'AUTH PLAIN ********\r\n'
reply: b'235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: b'2.7.0 Accepted'

对于.set_debuglevel(2),它会添加时间戳

21:26:26.602350 send: 'ehlo [127.0.1.1]\r\n'
21:26:26.632756 reply: b'250-smtp.googlemail.com at your service, [79.163.228.253]\r\n'
21:26:26.632871 reply: b'250-SIZE 35882577\r\n'
21:26:26.632917 reply: b'250-8BITMIME\r\n'
21:26:26.632957 reply: b'250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH\r\n'
21:26:26.633022 reply: b'250-ENHANCEDSTATUSCODES\r\n'
21:26:26.633072 reply: b'250-PIPELINING\r\n'
21:26:26.633112 reply: b'250-CHUNKING\r\n'
21:26:26.633151 reply: b'250 SMTPUTF8\r\n'
21:26:26.633201 reply: retcode (250); Msg: b'smtp.googlemail.com at your service, [79.163.228.253]\nSIZE 35882577\n8BITMIME\nAUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH\nENHANCEDSTATUSCODES\nPIPELINING\nCHUNKING\nSMTPUTF8'

它在standard error 上发送它,所以如果你想在文件'output.txt' 中获取它,那么你必须重定向sys.stderr

import sys

old_stderr = sys.stderr

sys.stderr = open('output.txt', 'w')

with smtplib.SMTP_SSL(f'host:port') as server:

    server.set_debuglevel(1)

    server.login(login, password)
    server.sendmail(sender_email, recipients, message.as_string())

sys.stderr = old_stderr

【讨论】:

现在有一些关于该问题的以下问题是否可以在不发送任何电子邮件的情况下以某种方式检查 smtp 日志对话?例如,我想分析我的电子邮件和另一个邮件服务器而不向它发送任何真正的消息?在 2 个随机电子邮件之间?即使这些电子邮件地址不属于我个人 在大多数系统上,都有程序 telnettelnet server 连接,但如果您将其与 smtp server(如 telnet smtp.gmail.com 465)或 http server(如 telnet ***.com 80)一起使用,那么您可以看到来自服务器的消息,但首先您必须手动向服务器发送命令 - 这是一项艰苦的工作(特别是如果服务器使用与SSL 的安全连接)。同样的方式你可以使用openssl,它使用SSL。见Connecting to smtp.gmail.com via command line。 而不是telnet,您可以使用标准模块socket 编写Python 代码,但同样您必须知道要发送哪些命令(因此您必须知道SMTP 协议)。应该有更专业的程序来测试 SMTP,但您应该在门户网站上搜索 Security 您好,我想尝试说明我的问题:我想检查我公司的某些电子邮件是否在其他组织的邮件服务器的白名单或黑名单中。我想尝试使用 smtplib 使用 python 脚本执行此操作并检查日志,也许分析时间差异(不想发送很多电子邮件,因为我不希望我的域被标记为垃圾邮件发送者)。有没有办法在不发送活动电子邮件的情况下做到这一点?如果我知道 smtp 中的命令,那么像你建议的那样使用套接字? 我认为你不能不发送电子邮件检查它。服务器仅在收到电子邮件时才决定是否过滤电子邮件。而且您无法连接到其他服务器并获取信息。如果您尝试使用smtp 连接到其他服务器并尝试使用您的电子邮件,那么它只能说此邮箱在此服务器上不存在。它无法将邮件从您的本地计算机发送到此服务器。您的电子邮件必须发送到您服务器上的邮箱,并且该服务器可以发送到其他服务器,该服务器将其放入其他人邮箱。

以上是关于在使用 Python smtplib 时检查电子邮件日志的主要内容,如果未能解决你的问题,请参考以下文章

Python:使用 smtplib 模块发送电子邮件时未显示“主题”

Python 邮件发送

为什么发送电子邮件时不显示消息? - smtplib - Python

使用flask-mail扩展发送邮件

如何使用 python smtplib 向多个收件人发送电子邮件?

python 2.7 smtplib 和 mime 的电子邮件附件问题