Python中flask-mail发不出邮件,被邮件服务器以“垃圾邮件”拒绝了怎么办?
最近用 flask 在开发一个个人网站,使用 flask-mail 发验证邮件,发送失败,看错误提示是被邮件服务器当成发送垃圾邮件拒绝发送了。但我用 smtplib 写了个脚本来发送,是可以正常发送的。
pyer 们,我是要将 flask-mail 换成 smtplib,还是要换邮箱呀?
另外,我用的是 yandex 的域名邮箱,刚从 zoho 转过来的。
Python中flask-mail发不出邮件,被邮件服务器以“垃圾邮件”拒绝了怎么办?
邮件反垃圾策略各家都不一样,但大抵是跟发送域名、发送 IP、发送频率、发送内容(标题、正文内容关键词等)的评级相关,被 spam 的话,从这几点查起。
向国内邮箱服务商发送邮件建议用国内的 EDM 发送服务,比如 sendcloud
这个问题挺常见的,邮件服务器反垃圾策略越来越严了。核心是你的邮件看起来“不像正经程序发的”,或者你的发送配置有问题。
最直接的解决办法是正确配置Flask-Mail,让你的邮件“看起来正常”。下面是一个完整的、包含关键配置的示例:
from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)
# 以下是关键配置,特别是MAIL_DEFAULT_SENDER和TLS/SSL
app.config['MAIL_SERVER'] = 'smtp.your-email-provider.com' # 例如 smtp.qq.com, smtp.gmail.com
app.config['MAIL_PORT'] = 587 # 通常587 (TLS) 或 465 (SSL)
app.config['MAIL_USE_TLS'] = True # 如果端口是587,就启用TLS
app.config['MAIL_USE_SSL'] = False # 如果端口是465,就启用SSL,与TLS二选一
app.config['MAIL_USERNAME'] = 'your_email@example.com'
app.config['MAIL_PASSWORD'] = 'your_app_specific_password' # 注意:常需“应用专用密码”,非邮箱登录密码
app.config['MAIL_DEFAULT_SENDER'] = ('Your App Name', 'your_email@example.com') # 这是重点!必须有发件人名称
mail = Mail(app)
@app.route('/send')
def send_mail():
msg = Message(
subject='Hello from Your App', # 邮件主题别用测试、垃圾词
recipients=['recipient@example.com'],
# body 和 html 二选一或都提供
body='This is a plain text email sent from my Flask app.',
html='<h1>This is an HTML email</h1><p>Sent from my Flask app.</p>'
)
# 可以额外添加回复地址,更正规
msg.reply_to = 'support@yourdomain.com'
try:
mail.send(msg)
return 'Email sent!'
except Exception as e:
return f'Failed to send email: {str(e)}'
if __name__ == '__main__':
app.run(debug=True)
关键点解释:
MAIL_DEFAULT_SENDER:必须设置成元组(‘显示名’, ‘邮箱地址’)。只有邮箱地址会被很多服务器判定为垃圾。- 端口与加密:
587端口配合MAIL_USE_TLS = True是最通用的选择。465端口则用MAIL_USE_SSL = True。加密是必须的。 - 密码:现在大多数邮箱(如QQ、Gmail、163)都不能直接用登录密码,需要在邮箱设置里生成“授权码”或“应用专用密码”来替换这里的
MAIL_PASSWORD。 - 邮件内容:避免使用像“test”、“sample”这类主题和空内容。提供纯文本(
body)或HTML(html)正文。
检查清单:
- 发件人名称和邮箱是否正确、完整?
- 是否使用了应用专用密码/授权码?
- 端口(587/465)和加密设置(TLS/SSL)是否匹配你的邮箱服务商要求?
- 邮件主题和内容是否过于简单或像垃圾广告?
一句话建议: 确保发件人信息完整、使用加密连接和应用专用密码,并完善邮件内容。
多谢,我先用 sendcloud 试试。网站发送验证邮件都被 spam 的话会影响注册。
客气,注册信这块确实比较难办,Sendcloud 相对稳定些,可以试试,他们官方有文档,按照需要做好配置就好,文档里有一些科普性的说明,也可以多了解下。
发邮件,代码是一件比较简单的事
但是,你想要进收件箱,就不是单单代码可以解决的问题
建议你还是用第三方的邮件发送服务
我之前用的就是网易的邮箱,flask-mail 发送邮件,同一封发送多了就会被 ban,发送不出去,必须要用第三方邮件发送服务,比如 mailgun、sparkpost、sendcloud
sparkpost 不能用腾讯的 dns 服务,会被禁用的。

