Python中flask-mail发不出邮件,被邮件服务器以“垃圾邮件”拒绝了怎么办?

最近用 flask 在开发一个个人网站,使用 flask-mail 发验证邮件,发送失败,看错误提示是被邮件服务器当成发送垃圾邮件拒绝发送了。但我用 smtplib 写了个脚本来发送,是可以正常发送的。
pyer 们,我是要将 flask-mail 换成 smtplib,还是要换邮箱呀?
另外,我用的是 yandex 的域名邮箱,刚从 zoho 转过来的。
Python中flask-mail发不出邮件,被邮件服务器以“垃圾邮件”拒绝了怎么办?

6 回复

邮件反垃圾策略各家都不一样,但大抵是跟发送域名、发送 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)

关键点解释:

  1. MAIL_DEFAULT_SENDER:必须设置成元组 (‘显示名’, ‘邮箱地址’)。只有邮箱地址会被很多服务器判定为垃圾。
  2. 端口与加密587端口配合MAIL_USE_TLS = True是最通用的选择。465端口则用MAIL_USE_SSL = True。加密是必须的。
  3. 密码:现在大多数邮箱(如QQ、Gmail、163)都不能直接用登录密码,需要在邮箱设置里生成“授权码”或“应用专用密码”来替换这里的MAIL_PASSWORD
  4. 邮件内容:避免使用像“test”、“sample”这类主题和空内容。提供纯文本(body)或HTML(html)正文。

检查清单:

  • 发件人名称和邮箱是否正确、完整?
  • 是否使用了应用专用密码/授权码?
  • 端口(587/465)和加密设置(TLS/SSL)是否匹配你的邮箱服务商要求?
  • 邮件主题和内容是否过于简单或像垃圾广告?

一句话建议: 确保发件人信息完整、使用加密连接和应用专用密码,并完善邮件内容。

多谢,我先用 sendcloud 试试。网站发送验证邮件都被 spam 的话会影响注册。

客气,注册信这块确实比较难办,Sendcloud 相对稳定些,可以试试,他们官方有文档,按照需要做好配置就好,文档里有一些科普性的说明,也可以多了解下。

发邮件,代码是一件比较简单的事
但是,你想要进收件箱,就不是单单代码可以解决的问题
建议你还是用第三方的邮件发送服务

我之前用的就是网易的邮箱,flask-mail 发送邮件,同一封发送多了就会被 ban,发送不出去,必须要用第三方邮件发送服务,比如 mailgun、sparkpost、sendcloud
sparkpost 不能用腾讯的 dns 服务,会被禁用的。

回到顶部