当前位置:首页>python>Python从入门到精通day29

Python从入门到精通day29

  • 2026-10-11 17:30:23
Python从入门到精通day29

Python 自动化办公:邮件 / 短信发送实战

在掌握了 Python 生成 Excel、Word、PDF 的技能后,下一步就是让这些文档 “自动送达”—— 通过邮件批量发送文件,再用短信通知收件人查收。不管是办公场景的通知推送,还是项目中的验证码 / 告警发送,Python 都能一站式搞定。今天就手把手教你实现邮件(含附件)和短信的自动化发送,代码封装好直接用!

一.发送电子邮件:从基础到实战

电子邮件仍是职场 / 项目中最正式的沟通方式,Python 通过smtplib模块基于 SMTP 协议实现邮件发送,无需搭建服务器,借助 126/163/QQ 等第三方邮箱即可快速实现。

1. 核心原理:SMTP 协议快速理解

  • SMTP
    (简单邮件传输协议):规定了邮件如何从发件人服务器传输到收件人服务器,建立在 TCP 协议之上,保证数据可靠传输;
  • Python 实现
    :smtplib.SMTP_SSL对象封装了 SMTP 协议的通信细节,只需调用login()(登录)和sendmail()(发送)即可完成操作;
  • 前提准备
    :需开启第三方邮箱的 SMTP 服务,获取授权码(不是邮箱登录密码,是 SMTP 专用密码)。

2. 准备工作:开启邮箱 SMTP 服务(以 126 邮箱为例)

这是新手最容易卡壳的步骤,按以下流程操作:

  1. 登录 126 邮箱(<www.126.com>),进入 “设置”→“POP3/SMTP/IMAP”;
  2. 开启 “SMTP 服务”,按提示用手机扫码发送短信验证;
  3. 验证成功后,复制系统生成的授权码(妥善保管,泄露会导致邮箱被冒用发邮件)。

补充:QQ 邮箱开启 SMTP 的步骤类似,授权码在 “账户设置”→“开启 POP3/SMTP” 后获取;企业邮箱需联系管理员配置。

用手机扫码上面的二维码可以通过发送短信的方式来获取授权码,短信发送成功后,点击“我已发送”就可以获得授权码。授权码需要妥善保管,因为一旦泄露就会被其他人冒用你的身份来发送邮件。接下来,我们就可以编写发送邮件的代码了,如下所示。

3. 实战1:发送纯文本邮件(无附件)

先实现最基础的纯文本邮件发送,代码加详细注解,替换占位符即可用:

import smtplibfrom email.header import Headerfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMEText# 创建邮件主体对象email = MIMEMultipart()# 设置发件人、收件人和主题email['From'] = 'xxxxxxxxx@126.com'email['To'] = 'yyyyyy@qq.com;zzzzzz@1000phone.com'email['Subject'] = Header('上半年工作情况汇报', 'utf-8')# 添加邮件正文内容content = """据德国媒体报道,当地时间9日,德国火车司机工会成员进行了投票,定于当地时间10日起进行全国性罢工,货运交通方面的罢工已于当地时间10日19时开始。此后,从11日凌晨2时到13日凌晨2时,德国全国范围内的客运和铁路基础设施将进行48小时的罢工。"""email.attach(MIMEText(content, 'plain', 'utf-8'))# 创建SMTP_SSL对象(连接邮件服务器)smtp_obj = smtplib.SMTP_SSL('smtp.126.com', 465)# 通过用户名和授权码进行登录smtp_obj.login('xxxxxxxxx@126.com', '邮件服务器的授权码')# 发送邮件(发件人、收件人、邮件内容(字符串))smtp_obj.sendmail('xxxxxxxxx@126.com',    ['yyyyyy@qq.com', 'zzzzzz@1000phone.com'],    email.as_string())

如果要发送带有附件的邮件,只需要将附件的内容处理成 BASE64 编码,那么它就和普通的文本内容几乎没有什么区别。BASE64 是一种基于 64 个可打印字符来表示二进制数据的表示方法,常用于某些需要表示、传输、存储二进制数据的场合,电子邮件就是其中之一。对这种编码方式不理解的同学,推荐阅读《Base64笔记》一文。在之前的内容中,我们也提到过,Python 标准库的base64模块提供了对 BASE64 编解码的支持。

4.实战 2:发送带附件的邮件(支持中文文件名)

工作中常需发送文档 / 表格附件,核心是将附件转 Base64 编码(二进制数据转文本,适配邮件传输),并处理中文附件名乱码问题:

import smtplibfrom email.header import Headerfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom urllib.parse import quote# 创建邮件主体对象email = MIMEMultipart()# 设置发件人、收件人和主题email['From'] = 'xxxxxxxxx@126.com'email['To'] = 'zzzzzzzz@1000phone.com'email['Subject'] = Header('请查收离职证明文件', 'utf-8')# 添加邮件正文内容(带HTML标签排版的内容)content = """<p>亲爱的前同事:</p><p>你需要的离职证明在附件中,请查收!</p><br><p>祝,好!</p><hr><p>孙美丽 即日</p>"""email.attach(MIMEText(content, 'html', 'utf-8'))# 读取作为附件的文件withopen(f'resources/王大锤离职证明.docx', 'rb') as file:    attachment = MIMEText(file.read(), 'base64', 'utf-8')# 指定内容类型    attachment['content-type'] = 'application/octet-stream'# 将中文文件名处理成百分号编码    filename = quote('王大锤离职证明.docx')# 指定如何处置内容    attachment['content-disposition'] = f'attachment; filename="{filename}"'# 创建SMTP_SSL对象(连接邮件服务器)smtp_obj = smtplib.SMTP_SSL('smtp.126.com', 465)# 通过用户名和授权码进行登录smtp_obj.login('xxxxxxxxx@126.com', '邮件服务器的授权码')# 发送邮件(发件人、收件人、邮件内容(字符串))smtp_obj.sendmail('xxxxxxxxx@126.com','zzzzzzzz@1000phone.com',    email.as_string())

5.通用封装:一键发送邮件(支持多收件人 / 多附件)

将上述逻辑封装成函数,后续只需修改配置即可复用,支持多收件人、多附件:

import smtplibfrom email.header import Headerfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom urllib.parse import quote# 邮件服务器域名(自行修改)EMAIL_HOST = 'smtp.126.com'# 邮件服务端口(通常是465)EMAIL_PORT = 465# 登录邮件服务器的账号(自行修改)EMAIL_USER = 'xxxxxxxxx@126.com'# 开通SMTP服务的授权码(自行修改)EMAIL_AUTH = '邮件服务器的授权码'defsend_email(*, from_user, to_users, subject='', content='', filenames=[]):"""发送邮件    :param from_user: 发件人    :param to_users: 收件人,多个收件人用英文分号进行分隔    :param subject: 邮件的主题    :param content: 邮件正文内容    :param filenames: 附件要发送的文件路径    """    email = MIMEMultipart()    email['From'] = from_user    email['To'] = to_users    email['Subject'] = subject    message = MIMEText(content, 'plain', 'utf-8')    email.attach(message)for filename in filenames:withopen(filename, 'rb') as file:            pos = filename.rfind('/')            display_filename = filename[pos + 1:] if pos >= 0else filename            display_filename = quote(display_filename)            attachment = MIMEText(file.read(), 'base64', 'utf-8')            attachment['content-type'] = 'application/octet-stream'            attachment['content-disposition'] = f'attachment; filename="{display_filename}"'            email.attach(attachment)    smtp = smtplib.SMTP_SSL(EMAIL_HOST, EMAIL_PORT)    smtp.login(EMAIL_USER, EMAIL_AUTH)    smtp.sendmail(from_user, to_users.split(';'), email.as_string())

二.发送短信:对接第三方平台(螺丝帽为例)

短信发送无法直接实现,需对接第三方短信平台(提供短信网关和通道),下面以 “螺丝帽” 平台为例,实现验证码 / 通知短信发送。

1. 准备工作

注册螺丝帽平台账号,完成实名认证;

购买短信套餐,获取 API KEY(平台分配的接口密钥);
配置短信签名(如【Python 小课】,需审核通过);
设置 IP 白名单(仅允许指定 IP 调用接口,防止密钥泄露)。

2. 实战:发送验证码短信(封装函数)

用requests库调用平台 HTTP 接口,实现短信发送,补充异常处理和验证码生成逻辑:

import randomimport requestsdefsend_message_by_luosimao(tel, message):"""发送短信(调用螺丝帽短信网关)"""    resp = requests.post(        url='http://sms-api.luosimao.com/v1/send.json',        auth=('api', 'key-注册成功后平台分配的KEY'),        data={'mobile': tel,'message': message        },        timeout=10,        verify=False    )return resp.json()defgen_mobile_code(length=6):"""生成指定长度的手机验证码"""return''.join(random.choices('0123456789', k=length))defmain():    code = gen_mobile_code()    message = f'您的短信验证码是{code},打死也不能告诉别人哟!【Python小课】'print(send_message_by_luosimao('13500112233', message))if __name__ == '__main__':    main()

上面请求螺丝帽的短信网关http://sms-api.luosimao.com/v1/send.json会返回JSON格式的数据,如果返回{'error': 0, 'msg': 'OK'}就说明短信已经发送成功了,如果error的值不是0,可以通过查看官方的开发文档了解到底哪个环节出了问题。螺丝帽平台常见的错误类型如下图所示。

目前,大多数短信平台都会要求短信内容必须附上签名,下图是我在螺丝帽平台配置的短信签名“【Python小课】”。有些涉及到敏感内容的短信,还需要提前配置短信模板,有兴趣的读者可以自行研究。一般情况下,平台为了防范短信被盗用,还会要求设置“IP 白名单”,不清楚如何配置的可以咨询平台客服。

当然国内的短信平台很多,读者可以根据自己的需要进行选择(通常会考虑费用预算、短信达到率、使用的难易程度等指标),如果需要在商业项目中使用短信服务建议购买短信平台提供的套餐服务。

三.避坑指南(新手必看)

  • 邮件授权码问题
    授权码≠登录密码,忘记可在邮箱设置中重新生成;
  • 中文乱码
    邮件主题用Header(..., 'utf-8'),附件名用quote()编码,正文指定utf-8;
  • 邮件发送失败
    检查 SMTP 服务器 / 端口(126=smtp.126.com:465,QQ=smtp.qq.com:465)、收件人格式、网络是否通;
  • 短信发送失败
    检查 API KEY 是否正确、IP 白名单是否配置、短信签名是否审核通过、手机号格式是否为 11 位;
  • 附件路径错误
    优先用绝对路径(如D:/files/文件.docx),避免相对路径找不到文件。

四.总结

Python 实现邮件 / 短信发送的核心是对接标准化接口:

  • 邮件:基于 SMTP 协议对接第三方邮箱服务器,重点处理编码和附件;
  • 短信:基于 HTTP 接口对接第三方短信平台,重点配置签名 / 模板 / IP 白名单。

在实际项目中,建议:

  1. 邮件:少量发送用第三方邮箱 SMTP,大量发送(如营销邮件)建议购买专业邮件服务(如 SendCloud);
  2. 短信:优先选择阿里云 / 腾讯云等大厂平台,到达率更高、稳定性更好;
  3. 代码层面:封装通用函数,添加异常处理,避免单次失败导致程序崩溃。

学会这些技能,你可以实现 “生成报表→自动发邮件→短信通知” 的全流程自动化,彻底摆脱重复的手动操作!如果需要对接其他邮件 / 短信平台的教程,欢迎在评论区留言~

下面给大家推荐一些AI工具,可辅助大家效率学习:

国内直接使用顶级AI工具

谷歌浏览器访问:https://www.nezhasoft.cloud/r/vMPJZr

最新文章

随机文章