Python 自动化通信:发送邮件与短信

Python 发送邮件和短信

在完成了文档的自动生成(Excel, Word, PDF)后,最后一步通常是将其发送给相关人员。在 Daoman Python AI 的业务场景中,通过 Python 自动发送通知邮件或短信验证码,是实现企业级自动化的核心环节。

1. 发送电子邮件:基于 SMTP 协议

发送邮件并不需要打开浏览器,而是通过 SMTP (简单邮件传输协议) 直接与邮件服务器通信。Python 内置的 smtplib 模块封装了这一复杂的底层逻辑。

1.1 准备工作:获取授权码

出于安全考虑,网易 (126/163) 或 QQ 邮箱不允许第三方程序直接使用登录密码。你需要在邮箱设置中开启 POP3/SMTP 服务,并获取一个专用的 “授权码”

1.2 发送基础文本邮件

邮件内容由 email.mime 模块构建。如果是纯文本,使用 MIMEText;如果包含附件或图片,则需使用 MIMEMultipart

import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# 1. 构建邮件容器
email = MIMEMultipart()
email['From'] = 'daoman_ai@126.com'
email['To'] = 'client@qq.com'
email['Subject'] = Header('季度报表通知', 'utf-8')

# 2. 注入正文
body = "您好,您申请的自动化报表已生成,请查看附件。"
email.attach(MIMEText(body, 'plain', 'utf-8'))

# 3. 连接服务器并发送 (使用 SSL 加密端口 465)
try:
    smtp = smtplib.SMTP_SSL('smtp.126.com', 465)
    smtp.login('daoman_ai@126.com', '你的授权码')
    smtp.sendmail('daoman_ai@126.com', ['client@qq.com'], email.as_string())
    print("邮件发送成功!")
except Exception as e:
    print(f"发送失败: {e}")
finally:
    smtp.quit()

1.3 发送带附件的邮件

发送附件的关键是将文件内容进行 Base64 编码。这种编码方式能将二进制数据(如 .docx 或 .pdf)转为可传输的文本字符。

from urllib.parse import quote

# 读取文件并作为附件添加
filename = 'resources/月度总结.docx'
with open(filename, 'rb') as f:
    # 编码附件
    attachment = MIMEText(f.read(), 'base64', 'utf-8')
    attachment['Content-Type'] = 'application/octet-stream'
    # quote 处理文件名中的中文,防止乱码
    safe_filename = quote('月度总结.docx')
    attachment['Content-Disposition'] = f'attachment; filename="{safe_filename}"'
    email.attach(attachment)

2. 发送短信:集成第三方网关

短信发送无法直接通过协议完成,必须调用运营商或第三方短信服务商(如螺丝帽、阿里云、腾讯云)提供的 HTTP API

2.1 发送流程

  1. 注册账号:获取 API Key。
  2. 配置签名:如 【道满科技】,国家规定短信必须带签名。
  3. 发起请求:通过 requests 库将手机号和内容推送到网关。

2.2 实战代码(以螺丝帽为例)

import requests

def send_sms(phone, code):
    """发送短信验证码"""
    api_url = 'http://sms-api.luosimao.com/v1/send.json'
    api_key = 'key-xxxxxxxxxxxxxxxx' # 替换为你的 API Key
    
    payload = {
        'mobile': phone,
        'message': f'您的验证码是{code},请于5分钟内输入。【道满科技】'
    }
    
    resp = requests.post(
        url=api_url,
        auth=('api', api_key),
        data=payload,
        timeout=10
    )
    return resp.json()

# 使用示例
result = send_sms('13800000000', '8888')
if result.get('error') == 0:
    print("短信下发成功")

3. 总结与建议

  • 安全性:绝不要在代码中硬编码授权码或 API Key,建议使用环境变量(Environment Variables)存储。
  • 可靠性:邮件发送可能会被识别为垃圾邮件,建议在正文中加入一些个性化称呼(如“亲爱的 XXX”)。
  • 合规性:发送短信必须遵守相关法规,严禁发送未经许可的营销信息,且必须配置 IP 白名单防止接口被盗刷。