阿里云邮件推送(DirectMail)开通与Python配置指南

Frieren 发布于 2025-12-01 99 次阅读


在项目开发时,我们往往会需要配置邮箱发送服务。但是在这之前,我们得要有一部分准备工作:

  • 一个域名(任意服务商,有管理权限即可)
  • 一个阿里云账号(开通服务时要用)

一、邮箱推送服务开通

进入邮箱推送的产品页面,点击申请开通:

之后点击右下角的立即开通,即可开通成功。

二、邮箱配置

进入邮件推送控制台,可以看到如下页面:

按照步骤一步步开通即可:

  1. 创建发信域名
  2. 创建发信地址
  3. 发送邮件

2.1 创建发信域名

点击控制台左边的“邮箱设置-发信域名”,然后点击右上角的“新建域名”,输入你要使用的域名。

这里建议使用主域名的二级域名:比如域名为 example.com,那么这里可以填写子域名 notify.example.com 。这样不会影响主域名企业邮箱的使用。

填写好之后,点击控制台里刚刚填写的域名右边的“配置”按钮,会出现如下界面:

你需要前往你购买域名的 DNS 控制台(如阿里云“云解析DNS”或腾讯云“DNSPod”),手动添加这 5条记录。

主机记录怎么填? 如果你的发信域名是 notify.你的域名.com,主机记录只需要填前缀(如 notifyaliyundm.notify)。如果你填了 notify.你的域名.com,最终会变成 notify.你的域名.com.你的域名.com,导致验证失败。

关于生效时间: 配置完成后,DNS 解析通常需要 5~10 分钟 才能生效(最慢可能需要 48 小时,但极少见)。

  • 回到邮件推送控制台,点击 “验证”
  • 如果提示“验证失败”,请不要焦虑,喝杯水等 10 分钟后再试
  • 只有当状态变为 “验证通过” 后,才能进行下一步。

依次添加记录,添加完成之后,页面显示如下:

验证通过之后,该项完成

2.2 创建发信地址

点击邮件推送控制台左侧的“发信地址”,然后点击右侧的“新建发信地址”,填写如下信息:

  • 发信域名:填写刚刚配置的域名
  • 账号:自由配置
  • 回信地址:选填,可以接受用户返回的邮箱信息
  • 发信类型:选择触发邮件

配置之后,点击刚刚配置的项目的右侧的“设置SMTP密码”:密码需要记住,待会要用

3. 发送邮件

完成上述步骤就可以发送邮箱啦。这里我们使用Python来测试发送。

🛡️ 安全提示:在实际生产环境中,绝不建议将密码硬编码在代码里(如直接写在 .py 文件中),防止代码泄露导致账号被盗。建议使用 环境变量配置文件 来管理敏感信息。

下面是一个生产级可用的发送脚本,增加了详细的异常捕获,帮你快速定位问题:

import smtplib
import os
from email.mime.text import MIMEText
from email.utils import formataddr

# === 配置区域 ===
SMTP_SERVER = "smtpdm.aliyun.com"  # 阿里云邮件推送专用服务器
SMTP_PORT = 465                    # 必须使用 465 (SSL加密),阿里云云服务器默认封禁 25 端口

# 建议从环境变量获取密码,或者在本地测试时临时填入
# 在终端设置环境变量:export MAIL_PWD='你的密码'
SENDER_PASSWORD = os.getenv("MAIL_PWD", "在此处填入你的SMTP密码") 

SENDER_EMAIL = "no-reply@notify.egooaia.com"  # 你的发信地址
RECEIVER_EMAIL = "user@example.com"           # 接收测试邮件的邮箱

def send_test_email():
    try:
        # 1. 构建邮件内容
        msg = MIMEText("恭喜!你的邮件推送服务配置成功了。\n这是测试验证码:888888", "plain", "utf-8")
        msg['From'] = formataddr(["EgooAI 安全中心", SENDER_EMAIL])
        msg['To'] = formataddr(["测试用户", RECEIVER_EMAIL])
        msg['Subject'] = "【EgooAI】服务开通测试"

        # 2. 连接服务器并发送 (使用 SMTP_SSL)
        print(f"正在连接 {SMTP_SERVER}:{SMTP_PORT} ...")
        server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
        
        # 3. 登录验证
        print("正在验证身份...")
        server.login(SENDER_EMAIL, SENDER_PASSWORD)
        
        # 4. 发送邮件
        server.sendmail(SENDER_EMAIL, [RECEIVER_EMAIL], msg.as_string())
        server.quit()
        
        print("✅ 邮件发送成功!请检查收件箱(若未收到请检查垃圾箱)")

    except smtplib.SMTPAuthenticationError:
        print("❌ 认证失败:用户名或密码错误。")
        print("   -> 请检查控制台‘发信地址’是否设置了 SMTP 密码,注意不是阿里云登录密码。")
    except smtplib.SMTPConnectError:
        print("❌ 连接失败:无法连接到服务器。")
        print("   -> 请检查是否使用了 465 端口(不要用 25)。")
    except Exception as e:
        print(f"❌ 发送发生未知错误: {e}")
        print("   -> 常见原因:1. 域名解析未生效;2. 控制台未配置 IP 白名单(如有)。")

if __name__ == "__main__":
    send_test_email()

代码关键点解析:

  1. 端口选择 (465):代码使用了 smtplib.SMTP_SSL 配合 465 端口。这是因为阿里云(以及大多数云厂商)为了防止滥发垃圾邮件,默认封禁了传统的 25 端口。如果你尝试用 25 端口,代码会一直卡住直到超时。
  2. 环境变量 (os.getenv):示例展示了如何从系统环境变量读取密码,这是一种更安全的开发习惯。当然,你在本地快速测试时,也可以直接将默认值替换为真实密码。
  3. 异常处理 (try-except)
    • SMTPAuthenticationError:专门捕获密码错误,提示你去重置 SMTP 密码。
    • SMTPConnectError:专门捕获网络不通,提示你检查端口。

三、开发者避坑指南

配置完成只是第一步,在实际业务上线前,请务必关注以下 3 个关键点,否则可能会导致验证码延迟或发送失败。

1. 严选“触发邮件”类型

在创建发信地址时,务必选择“触发邮件”,千万不要选“批量邮件”。

  • 触发邮件:拥有最高优先级,适合验证码、订单通知、密码重置等,系统会极速推送。
  • 批量邮件:主要用于营销推广,优先级低,可能会进入阿里云的发送队列排队,导致用户过了几分钟才收到验证码,严重影响体验。

2. 留意每日发送额度

新开通的邮件推送服务,默认每日发送额度通常为 2000 封。每日免费额度200封,如有需要可进行购买。

  • 机制:阿里云会根据你的发信质量(无效地址率、垃圾邮件举报率)动态调整这个额度。质量越高,额度涨得越快。
  • 建议:如果你的业务上线初期预估量级很大,请提前在控制台查看额度,或者通过工单申请提额,以免业务高峰期邮件发不出去。

3. “回信地址”不要留空

虽然“回信地址”是选填项,但强烈建议填入一个真实的客服邮箱(如 support@example.com)。

  • 原因:你发出去的邮件发件人通常是 no-reply,但依然会有很多用户遇到问题时直接点击“回复”。
  • 后果:如果你不填回信地址,用户的回复会直接丢失;填了之后,阿里云会自动把用户的回复转发到你填写的这个客服邮箱里,让你不错过任何用户反馈。

此作者没有提供个人介绍。
最后更新于 2025-12-01