Python 100天,从新手到大师——Python自动化办公进阶:轻松实现邮件与短信发送(day29)
摘要:本文介绍了如何使用Python实现邮件和短信的自动化发送。主要内容包括:1) 通过smtplib和email库发送邮件,包括纯文本、HTML格式和带附件的邮件;2) 封装通用邮件发送函数实现复用;3) 介绍通过第三方平台(如螺丝帽)发送短信的方法,包括验证码短信的实现。文章提供了详细的代码示例,帮助读者快速掌握自动化通信技能,提升办公效率。
Python自动化办公进阶——轻松实现邮件与短信发送
学习概述
在前面的课程中,我们已经学会了如何使用Python自动化生成各类文档。今天,我们将更上一层楼,学习如何让Python程序自动发送电子邮件和短信!无论是批量发送报告、自动通知团队成员,还是集成验证码发送功能,这些看似复杂的任务,用Python都能轻松搞定。掌握这些技能,你将能构建更完整的自动化工作流,大大提升工作效率。让我们开始探索Python在通信领域的应用吧!
专栏同步更新中,本专栏所有源码与资料已整理打包,欢迎订阅学习,一起前行。下面就正式开始今天的学习内容:
Python发送邮件和短信
自动化办公的终极目标之一是让计算机自动处理通信任务。今天,我们就来学习如何用Python发送电子邮件和短信,实现通知、报告、验证码等信息的自动投递。
发送电子邮件
电子邮件仍然是企业和个人之间正式通信的主要方式。Python通过内置的smtplib和email库,可以轻松实现邮件的发送。
1. 准备工作:获取SMTP授权
要发送邮件,首先需要一个邮件服务器。我们可以使用第三方邮件服务商(如126、QQ、Gmail等)提供的SMTP服务。以126邮箱为例:
- 登录126邮箱,进入“设置” → “POP3/SMTP/IMAP”
- 开启SMTP服务
- 根据提示获取授权码(注意:授权码不是邮箱密码,需要妥善保管)
2. 发送简单文本邮件
让我们从最简单的纯文本邮件开始:
import smtplib
from email.header import Header
from email.mime.text import MIMEText
# 邮件配置
SMTP_SERVER = 'smtp.126.com'
SMTP_PORT = 465
SENDER = 'your_email@126.com'
AUTH_CODE = '你的授权码' # 不是邮箱密码!
def send_simple_email(receiver, subject, content):
"""发送简单文本邮件"""
# 创建邮件内容对象
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = Header(SENDER)
message['To'] = Header(receiver)
message['Subject'] = Header(subject, 'utf-8')
try:
# 连接邮件服务器
smtp_obj = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
smtp_obj.login(SENDER, AUTH_CODE)
# 发送邮件
smtp_obj.sendmail(SENDER, [receiver], message.as_string())
smtp_obj.quit()
print("邮件发送成功!")
return True
except Exception as e:
print(f"邮件发送失败: {e}")
return False
# 使用示例
send_simple_email(
receiver='recipient@example.com',
subject='Python邮件测试',
content='这是一封来自Python程序的测试邮件!'
)
3. 发送HTML格式邮件
HTML邮件可以包含丰富的格式和样式:
def send_html_email(receiver, subject, html_content):
"""发送HTML格式邮件"""
message = MIMEText(html_content, 'html', 'utf-8')
message['From'] = Header(SENDER)
message['To'] = Header(receiver)
message['Subject'] = Header(subject, 'utf-8')
# 发送逻辑与上面相同...
4. 发送带附件的邮件
附件是邮件的常见需求。我们可以使用MIMEMultipart来处理多部分邮件:
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import os
def send_email_with_attachment(receiver, subject, content, attachment_paths):
"""发送带附件的邮件"""
# 创建多部分邮件对象
message = MIMEMultipart()
message['From'] = SENDER
message['To'] = receiver
message['Subject'] = subject
# 添加正文
message.attach(MIMEText(content, 'plain', 'utf-8'))
# 添加附件
for file_path in attachment_paths:
if os.path.exists(file_path):
with open(file_path, 'rb') as file:
# 创建MIMEBase对象
mime_base = MIMEBase('application', 'octet-stream')
mime_base.set_payload(file.read())
# 编码并添加头信息
encoders.encode_base64(mime_base)
filename = os.path.basename(file_path)
mime_base.add_header(
'Content-Disposition',
f'attachment; filename="{filename}"'
)
message.attach(mime_base)
# 发送邮件(连接和发送逻辑同上)
# ...
5. 封装邮件发送函数
为了方便复用,我们可以将所有功能封装到一个函数中:
def send_email(receiver, subject, content, is_html=False, attachments=None):
"""
发送邮件通用函数
:param receiver: 收件人邮箱(多个用分号分隔)
:param subject: 邮件主题
:param content: 邮件内容
:param is_html: 是否为HTML格式
:param attachments: 附件路径列表
"""
# 根据是否需要HTML格式选择MIMEText类型
content_type = 'html' if is_html else 'plain'
if attachments:
message = MIMEMultipart()
# 添加正文
message.attach(MIMEText(content, content_type, 'utf-8'))
# 添加附件(代码同上)
# ...
else:
message = MIMEText(content, content_type, 'utf-8')
message['From'] = SENDER
message['To'] = receiver
message['Subject'] = subject
# 发送邮件
try:
smtp_obj = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
smtp_obj.login(SENDER, AUTH_CODE)
smtp_obj.sendmail(SENDER, receiver.split(';'), message.as_string())
smtp_obj.quit()
return True
except Exception as e:
print(f"发送失败: {e}")
return False
发送短信
短信通常用于发送验证码、通知等时效性强的信息。大多数短信服务需要通过第三方平台发送。
1. 选择短信平台
国内常见的短信平台有:
- 阿里云短信
- 腾讯云短信
- 螺丝帽(Luosimao)
- 云片
这些平台通常提供API接口,我们可以通过HTTP请求调用。
2. 使用螺丝帽平台发送短信
以螺丝帽平台为例:
import requests
import random
import json
class SMSClient:
"""短信发送客户端"""
def __init__(self, api_key):
self.api_key = api_key
self.api_url = 'http://sms-api.luosimao.com/v1/send.json'
def send_verification_code(self, phone_number, code):
"""发送验证码短信"""
message = f'您的验证码是:{code},5分钟内有效。【Python学堂】'
try:
response = requests.post(
self.api_url,
auth=('api', self.api_key),
data={
'mobile': phone_number,
'message': message
},
timeout=10
)
result = response.json()
if result.get('error') == 0:
print(f"短信发送成功到 {phone_number}")
return True
else:
print(f"短信发送失败: {result.get('msg', '未知错误')}")
return False
except Exception as e:
print(f"请求异常: {e}")
return False
@staticmethod
def generate_code(length=6):
"""生成随机验证码"""
return ''.join(random.choices('0123456789', k=length))
# 使用示例
if __name__ == '__main__':
# 初始化客户端(API_KEY从平台获取)
sms_client = SMSClient(api_key='your_api_key_here')
# 生成并发送验证码
phone = '13800138000'
code = sms_client.generate_code()
if sms_client.send_verification_code(phone, code):
print(f"验证码 {code} 已发送到 {phone}")
3. 发送通知类短信
def send_notification_sms(self, phone_number, content):
"""发送通知短信"""
# 大多数平台要求短信末尾加上签名
message = f"{content}【您的公司名】"
# 发送逻辑与验证码类似
# ...
实战应用场景
场景1:自动化日报发送
def send_daily_report(recipients):
"""发送自动化日报"""
# 1. 生成日报内容(可结合之前的Excel/PDF生成技能)
report_content = generate_daily_report()
# 2. 发送邮件
send_email(
receiver=recipients,
subject=f"日报 - {datetime.now().strftime('%Y-%m-%d')}",
content=report_content,
attachments=['daily_report.pdf']
)
# 3. 发送短信提醒
sms_client.send_notification_sms(
phone_number='主管手机号',
content=f"今日日报已发送,请查收邮箱"
)
场景2:用户注册验证
def handle_user_registration(email, phone):
"""处理用户注册流程"""
# 1. 生成验证码
verification_code = generate_verification_code()
# 2. 发送验证邮件
send_email(
receiver=email,
subject='账号注册验证',
content=f'您的验证码是: {verification_code}',
is_html=False
)
# 3. 发送验证短信
sms_client.send_verification_code(phone, verification_code)
return verification_code
注意事项与最佳实践
-
安全性:
- 不要将授权码、API密钥等敏感信息硬编码在代码中
- 建议使用环境变量或配置文件存储敏感信息
- 考虑使用加密方式存储和传输敏感数据
-
错误处理:
- 添加完整的异常处理机制
- 记录发送日志,便于排查问题
- 设置重试机制,提高发送成功率
-
性能优化:
- 对于批量发送,考虑使用异步或队列机制
- 控制发送频率,避免被邮件服务器或短信平台限制
- 使用连接池管理SMTP连接
-
遵守法规:
- 短信内容需符合平台规范
- 营销类短信需要用户明确同意
- 注意发送时间,避免骚扰用户
扩展学习:使用更高级的库
除了标准库,还有一些第三方库可以简化邮件发送:
# 使用yagmail发送邮件(更简洁的API)
import yagmail
yag = yagmail.SMTP(user='your_email@gmail.com', password='your_password')
yag.send(
to='recipient@example.com',
subject='Test',
contents='Hello from yagmail!'
)
总结
今天,我们学习了如何使用Python发送电子邮件和短信,掌握了从简单文本到复杂附件的邮件发送,以及通过第三方平台发送短信的技术。这些技能可以广泛应用于:
- 自动化报告发送
- 系统监控告警
- 用户注册验证
- 营销活动通知
- 任务进度提醒
在实际项目中,建议:
- 邮件服务:自建邮件服务器或使用企业邮件服务
- 短信服务:选择稳定可靠的第三方平台(考虑到达率、成本等因素)
掌握这些通信自动化技能后,你的Python工具箱将更加完善,能够构建真正意义上的端到端自动化解决方案。继续加油,明天的学习将带你探索更广阔的Python应用领域!
下期预告:我们将探索Python网络爬虫技术,学习如何从互联网上自动获取数据,为数据分析和机器学习项目提供原材料!
坚持学习,让自动化成为你的超级技能!
更多推荐


所有评论(0)