Python的 smtplib返回250 OK,但Gmail的收件人始终收不到邮件(发件人使用的是公司域名)
我正在使用Python (smtplib + email.mime),通过我们公司域名邮箱账户向用户发送一次性密码(OTP)邮件(很多用户在使用Gmail)。
尽管客户端显示200,但我的测试邮件中从未收到发送的邮件。
我的发件邮箱是公司的邮箱,因此该账户是他们自有业务域名邮箱。
在构造好邮件之后
msg = MIMEText(body)
msg["Subject"] = subject
msg["From"] = sender_email
msg["To"] = to_email
我创建了SMTP客户端。我承认把客户端命名为“server”可能不是最佳选择,但把这点信息说清楚也很重要。以后我可能会把client这个变量名改成“_client”。
然后通过传入构造好的邮件来发送。对于现在,我把公司邮箱(发件人邮箱)写死为发送邮箱,外发端口设为456,至于入站端口是否需要使用,我现在认为暂时不会使用。
import smtplib
from email.mime.text import MIMEText
...
.
.
.
try:
# server = smtplib.SMTP_SSL("smtp.gmail.com", 465)
server = smtplib.SMTP_SSL("<my-company-name>.com", 465)
server.set_debuglevel(1)
server.login(sender_email, sender_password)
server.send_message(msg)
server.quit()
except Exception as e:
raise EmailServiceError(
f"Error sending email: {e}",
recipient=to_email,
purpose=purpose,
details={"error": str(e)}
)
以下是我收到的日志,涉及对gatorxxxx.hostgator.com、
Logs:
SMTP Connection Established: gatorxxxx.hostgator.com
Authentication:
235 Authentication succeeded
Sender Accepted:
250 OK - mail from: no-reply@<my-company-email>.com
Recipient Accepted:
250 Accepted - rcpt to: <receiver-test-email>@gmail.com
Message Data Sent:
250 OK - id=1w22kd-00000001mHT-3KDl
Content:
Subject: Email Verification Code
From: no-reply@<my-company-email>.com
To: <receiver-test-email>@gmail.com
Body: Your email verification code is: 004040
Please enter this code to verify your account.
SMTP Session Closed:
221 gatorxxxx.hostgator.com closing connection
因此SMTP中继接受了该邮件,但Gmail收件人并未收到(在我的测试中连收件箱/垃圾邮件都没有看到)。
从之前的一个类似但并非完全相同的问题中,我记得在调试时使用上面相同的代码,向我们自有域名下的同事发送了一封测试邮件(coworker@<my-company-email>.com)。他们成功收到了。这表明SMTP发送流程在工作,投递问题很可能只与Gmail相关(可能是过滤或认证策略所致),而不是普遍的发送失败。
问题:
- 我的Python SMTP用法在概念上正确吗?
- 根据这些日志,这更可能是投递/认证问题(SPF/DKIM/DMARC、发件人声誉、中继策略),而不是代码问题吗?
- 应该请我们的基础设施/管理员团队运行哪些具体检查(因为我没有cPanel访问权限)?
最后,我确实检查了公司域名是否被列入黑名单,但我相信在过去我们开发的应用也能够向Gmail和其他邮箱账户发送邮件。 虽然这问题看起来是重复的,或者我应该先尝试所有选项(我显然还没有到cPanel),但我仍然在提这个问题,是因为我今天有一次评审,需要向上级明确解释我们面临的问题是什么,以便如果确实需要配置cPanel,我们可以迅速开始。如果不需要,我会在评审前解决。
解决方案
该邮件no-reply@
在Stack Overflow上可能会有专门的文档帖子(未来也可能成为以文档为中心的帖子,只是我一个想法),因此如果有人知道“authentication requirements”实际指的是什么意思,这篇帖子将更有价值。就我而言,我已经找到了一个足以指引我从这里往前走的线索。非常感谢大家。谢谢!
