在很多业务系统中,XML格式的文件常被用来传输结构化数据,比如订单信息、配置数据等,这些文件往往需要定期通过邮件发送给指定的接收方。手动发送不仅耗时,还容易遗漏,因此通过脚本实现自动发送带XML附件的邮件是很实用的需求。
实现自动发送XML附件邮件的核心思路
要实现这个功能,核心步骤包含三个部分:一是准备需要发送的目标XML文件,二是配置邮件发送的相关参数,三是编写脚本调用邮件发送接口,将XML文件作为附件添加到邮件中并发送。目前Python的smtplib和email库已经封装好了邮件发送的相关功能,不需要额外安装第三方依赖,适合快速实现需求。
需要提前准备的信息
- 发件方邮箱地址和对应的授权码,注意这里不是邮箱登录密码,需要在邮箱设置中开启SMTP服务后获取
- 收件方邮箱地址,支持单个或多个收件人
- 邮件服务器地址和端口,比如QQ邮箱的SMTP服务器是smtp.qq.com,端口是465
- 待发送的XML文件的完整路径
完整实现脚本示例
以下是一个可直接运行的Python脚本,实现了自动发送带XML附件的邮件功能,代码中包含详细注释,可根据实际需求调整参数。
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import os
def send_xml_email(smtp_server, smtp_port, sender_email, sender_password, receiver_emails, subject, body, xml_file_path):
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = sender_email
# 多个收件人用逗号分隔
msg['To'] = ','.join(receiver_emails)
msg['Subject'] = subject
# 添加邮件正文
msg.attach(MIMEText(body, 'plain', 'utf-8'))
# 添加XML附件
if not os.path.exists(xml_file_path):
raise FileNotFoundError(f"XML文件不存在: {xml_file_path}")
with open(xml_file_path, 'rb') as f:
xml_content = f.read()
# 创建附件对象,指定 subtype 为 xml
attachment = MIMEApplication(xml_content, _subtype='xml')
# 获取文件名,用于附件显示
file_name = os.path.basename(xml_file_path)
attachment.add_header('Content-Disposition', 'attachment', filename=file_name)
msg.attach(attachment)
# 连接SMTP服务器并发送邮件
try:
# 使用SSL加密连接
server = smtplib.SMTP_SSL(smtp_server, smtp_port)
server.login(sender_email, sender_password)
server.sendmail(sender_email, receiver_emails, msg.as_string())
server.quit()
print("邮件发送成功")
except Exception as e:
print(f"邮件发送失败: {str(e)}")
if __name__ == "__main__":
# 配置参数,替换为实际信息
SMTP_SERVER = "smtp.qq.com"
SMTP_PORT = 465
SENDER_EMAIL = "test@ipipp.com"
SENDER_PASSWORD = "邮箱授权码"
RECEIVER_EMAILS = ["receiver1@ipipp.com", "receiver2@ipipp.com"]
SUBJECT = "测试XML附件邮件"
BODY = "这是一封自动发送的带XML附件的邮件,请查收附件中的XML文件。"
XML_FILE_PATH = "./test_data.xml"
# 调用发送函数
send_xml_email(
smtp_server=SMTP_SERVER,
smtp_port=SMTP_PORT,
sender_email=SENDER_EMAIL,
sender_password=SENDER_PASSWORD,
receiver_emails=RECEIVER_EMAILS,
subject=SUBJECT,
body=BODY,
xml_file_path=XML_FILE_PATH
)
脚本使用注意事项
XML文件编码处理
如果XML文件包含中文等非ASCII字符,需要确保文件保存时使用的是UTF-8编码,否则附件内容可能会出现乱码。可以在读取文件时指定编码,不过上面的脚本使用二进制读取方式,已经避免了大部分编码问题,只要XML文件本身的编码正确即可。
邮箱授权码获取
不同邮箱服务商的授权码获取方式不同,比如QQ邮箱需要在设置-账户页面开启POP3/SMTP服务,按照提示生成授权码;网易邮箱也有类似的SMTP服务开启入口,生成授权码后替换脚本中的SENDER_PASSWORD即可。
多个附件的扩展
如果需要发送多个XML文件,只需要修改添加附件的部分,循环读取所有待发送的XML文件路径,依次创建MIMEApplication对象并添加到邮件中即可,核心逻辑和单个附件一致。
常见问题排查
如果脚本运行后提示发送失败,可以先检查以下几点:一是SMTP服务器地址和端口是否正确,二是授权码是否填写正确,三是收件人邮箱地址是否有效,四是XML文件路径是否正确。如果是网络问题,可以尝试切换网络或者检查防火墙是否拦截了SMTP端口的访问。