如何捕获SMTPRecipientsRefused异常(使用远程SMTP服务器和django)?

3 投票
2 回答
2237 浏览
提问于 2025-04-17 01:53

我在试着理解这个过程是怎么运作的。

通常情况下,当我发送一封邮件,而收件人不存在或者发生其他错误时,会收到一封邮件回复,里面包含了错误信息和状态。这可能需要一些时间。

我想问的是,smtplib是怎么捕捉到这个错误的,因为这个回复需要时间?当我使用smtplib发送邮件时,它从来不会抛出SMTPRecipientsRefused这个异常。它只是发送邮件,然后当我故意使用一个无效的邮箱地址时,我在回复的邮箱里收到“发送给以下收件人的邮件永久失败”的错误。这对我没有帮助,因为我想从我的邮箱地址数据库中清理掉无效的邮箱地址。

这里有一个验证函数:

SMTP.verify(address)

但我觉得这并不是一个真正的选择。根据python文档上关于VRFY的说明:
"许多网站禁用SMTP VRFY,以防止垃圾邮件发送者."

关于我的测试环境的说明:我正在使用django和一个远程SMTP服务器(gmail/apps)。
问题1:这是否是我无法捕捉到错误的原因?我是否应该使用本地服务器?

问题2:除了从回复邮箱中解析实际的错误邮件,还有其他方法吗?

谢谢你们对此事的任何想法!

2 个回答

0

是的,不幸的是,很多服务器多年来都禁用了SMTP的VRFY功能,主要是因为这个功能可以被垃圾邮件发送者用来快速查找服务器上有效的邮箱地址。你需要手动去做或者抓取邮箱地址。python-imap可以在这方面帮到你。祝你好运!

0
  1. 是的,这就是你为什么没有收到异常提示的原因。使用本地服务器也没用,因为你的本地服务器根本不知道某个邮箱地址是否有效。只有目标域名的MX邮件服务器才有这个信息,而且它通常不会急着告诉你,往往要等很久。
  2. 其实也不完全是这样。正如其他回答所提到的,可以试试Python的imaplib或者poplib来帮助你获取退信信息。

我不知道你的应用是什么,但如果你有相关的网站,可以定期在用户登录时询问他们确认或更新邮箱地址。

撰写回答