如何编写邮件发送脚本(完整指南)
目录导读
- 为什么需要邮件发送脚本?
- 邮件发送脚本的核心技术原理
- 主流编程语言与工具选择(Python/Shell/Node.js)
- 零基础实战:Python邮件发送脚本全流程
- 常见错误排查与安全注意事项
- 问答环节:你关心的邮件脚本问题
为什么需要邮件发送脚本?
在日常工作或项目管理中,手动发送大量邮件(如批量通知、报表分发、系统告警)不仅耗时,而且容易出错,编写邮件发送脚本可以:

- 提升效率:一键发送数百封邮件,无需逐一点击发送。
- 精准控制:可自定义发件人、收件人、抄送、附件、HTML模板等。
- 自动化集成:结合定时任务(如crontab)或CI/CD管道,实现无人值守发送。
真实场景案例:某电商公司每天需要向500名用户发送订单确认邮件,使用Python脚本配合SMTP协议,原本需要2小时的工作缩短至15秒,错误率降低至0%。
邮件发送脚本的核心技术原理
任何邮件脚本都遵循以下流程:
脚本 → 连接SMTP服务器 → 身份认证 → 构建邮件对象(收件人/主题/正文/附件) → 发送 → 断开连接
关键协议解析:
- SMTP(Simple Mail Transfer Protocol):用于发送邮件的标准协议,常见端口:25(未加密)、465(SSL加密)、587(TLS加密)。
- IMAP/POP3:通常用于接收邮件,非发送必需。
- MIME(多用途互联网邮件扩展):允许邮件包含HTML、附件、内嵌图片等。
📌 注意:Gmail、Outlook等主流邮箱已禁用“低安全性应用”,需使用专用密码或OAuth2.0认证。
主流编程语言与工具选择
| 语言/工具 | 适合场景 | 库/模块 | 复杂度 |
|---|---|---|---|
| Python | 通用自动化,学习门槛低 | smtplib, email.mime | |
| Bash Shell | Linux服务器快速发告警 | mail, sendmail | |
| Node.js | Web后端集成 | nodemailer | |
| PHP | 传统CMS系统 | PHPMailer |
推荐首选项:Python,因其内置smtplib无需额外安装,语法清晰,社区资源丰富。
零基础实战:Python邮件发送脚本全流程
步骤1:准备工作
- 启用发件邮箱的SMTP服务(如QQ邮箱需开启“SMTP服务”并生成授权码)。
- 安装Python(无需额外库,
smtplib和email为内置模块)。
步骤2:编写基础脚本(纯文本邮件)
import smtplib
from email.mime.text import MIMEText
# 配置发件人信息
smtp_server = 'smtp.qq.com' # QQ邮箱SMTP地址
port = 465 # SSL端口
sender = 'your-email@qq.com'
password = '你的授权码' # 注意:不是邮箱密码!
receiver = 'recipient@example.com'
subject = '测试邮件'
body = '这是由Python脚本发送的测试邮件。'
# 构建MIMEText对象
msg = MIMEText(body, 'plain', 'utf-8')
msg['From'] = sender
msg['To'] = receiver
msg['Subject'] = subject
# 连接并发送
with smtplib.SMTP_SSL(smtp_server, port) as server:
server.login(sender, password)
server.sendmail(sender, [receiver], msg.as_string())
print('邮件发送成功!')
步骤3:进阶功能(HTML+附件+多人发送)
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
# 构建多部分邮件体
msg = MIMEMultipart()
msg['From'] = sender
msg['To'] = ','.join(['user1@a.com', 'user2@a.com']) # 多人
msg['Subject'] = '月度报告'
# HTML正文(含CSS内联样式)
html = '''
<html>
<body>
<h2>月度销售报告</h2>
<p>附件中为详细数据,请查收。</p>
</body>
</html>'''
msg.attach(MIMEText(html, 'html', 'utf-8'))
# 添加附件
attachment = open('report.pdf', 'rb')
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename= "report.pdf"')
msg.attach(part)
# 发送(与上文相同)
with smtplib.SMTP_SSL(smtp_server, port) as server:
server.login(sender, password)
server.sendmail(sender, ['user1@a.com', 'user2@a.com'], msg.as_string())
步骤4:安全与异常处理
try:
server = smtplib.SMTP_SSL(smtp_server, port)
server.login(sender, password)
server.sendmail(sender, receiver_list, msg.as_string())
print('成功发送给', len(receiver_list), '人')
except smtplib.SMTPAuthenticationError:
print('认证失败:请检查授权码是否正确')
except smtplib.SMTPRecipientsRefused:
print('收件人被拒绝:请检查邮箱地址')
except Exception as e:
print('发送异常:', e)
finally:
server.quit()
常见错误排查与安全注意事项
❌ 常见错误
| 错误现象 | 原因 | 解决方案 |
|---|---|---|
535 Authentication failed |
授权码错误或未开启SMTP | 登录邮箱→设置→生成授权码 |
554 DT:SPM |
被判定为垃圾邮件 | 添加DKIM签名、降低发送频率 |
Connection refused |
端口被禁用(如阿里云25端口) | 改用465或587端口 |
🚨 安全红线
- 切勿将授权码硬编码在脚本中:使用环境变量(
os.environ['MAIL_PASS'])或配置文件(权限设为600)。 - 限制单次发送数量:建议每次不超过50封,避免被封IP。
- 使用TLS/SSL加密:绝不用明文端口25传输密码。
问答环节:你关心的邮件脚本问题
Q1:为什么我的脚本总是连接超时?
A:检查是否使用正确的SMTP地址和端口(常用表见第2章),如果使用公司网络,可能需要联系IT开放端口。
Q2:如何批量发送个性化邮件(不同收件人不同内容)?
A:读取CSV文件,循环构建msg对象,示例:
import csv
with open('users.csv', 'r') as f:
reader = csv.DictReader(f)
for row in reader:
msg['To'] = row['email']
body = f'尊敬的{row["name"]},您好...'
# 发送逻辑
Q3:能否在邮件中插入表格或图片?
A:可以,表格用HTML<table>标签;图片用<img src="cid:image1">,然后msg.attach(MIMEImage(图片数据, 'image1'))。
Q4:脚本发送后,收件人收到乱码怎么办?
A:指定编码为utf-8,并在HTML中声明<meta charset="UTF-8">。
编写邮件发送脚本的核心在于:理解SMTP协议、构建MIME邮件对象、处理认证与异常,推荐使用Python的smtplib模块作为起点。最后记住:保护好授权码,控制发送频率,并与系统日志结合实现可追溯性,如果遇到问题,优先检查SMTP配置和邮箱安全设置。