如何编写邮件发送脚本

wen 实用脚本 27

如何编写邮件发送脚本(完整指南)

目录导读

  1. 为什么需要邮件发送脚本?
  2. 邮件发送脚本的核心技术原理
  3. 主流编程语言与工具选择(Python/Shell/Node.js)
  4. 零基础实战:Python邮件发送脚本全流程
  5. 常见错误排查与安全注意事项
  6. 问答环节:你关心的邮件脚本问题

为什么需要邮件发送脚本?

在日常工作或项目管理中,手动发送大量邮件(如批量通知、报表分发、系统告警)不仅耗时,而且容易出错,编写邮件发送脚本可以:

如何编写邮件发送脚本

  • 提升效率:一键发送数百封邮件,无需逐一点击发送。
  • 精准控制:可自定义发件人、收件人、抄送、附件、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(无需额外库,smtplibemail为内置模块)。

步骤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配置和邮箱安全设置。

抱歉,评论功能暂时关闭!