Python自动化办公进阶——轻松实现邮件与短信发送

学习概述

在前面的课程中,我们已经学会了如何使用Python自动化生成各类文档。今天,我们将更上一层楼,学习如何让Python程序自动发送电子邮件和短信!无论是批量发送报告、自动通知团队成员,还是集成验证码发送功能,这些看似复杂的任务,用Python都能轻松搞定。掌握这些技能,你将能构建更完整的自动化工作流,大大提升工作效率。让我们开始探索Python在通信领域的应用吧!


专栏同步更新中,本专栏所有源码与资料已整理打包,欢迎订阅学习,一起前行。下面就正式开始今天的学习内容:


Python发送邮件和短信

自动化办公的终极目标之一是让计算机自动处理通信任务。今天,我们就来学习如何用Python发送电子邮件和短信,实现通知、报告、验证码等信息的自动投递。

发送电子邮件

电子邮件仍然是企业和个人之间正式通信的主要方式。Python通过内置的smtplibemail库,可以轻松实现邮件的发送。

1. 准备工作:获取SMTP授权

要发送邮件,首先需要一个邮件服务器。我们可以使用第三方邮件服务商(如126、QQ、Gmail等)提供的SMTP服务。以126邮箱为例:

  1. 登录126邮箱,进入“设置” → “POP3/SMTP/IMAP”
  2. 开启SMTP服务
  3. 根据提示获取授权码(注意:授权码不是邮箱密码,需要妥善保管)
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

注意事项与最佳实践

  1. 安全性

    • 不要将授权码、API密钥等敏感信息硬编码在代码中
    • 建议使用环境变量或配置文件存储敏感信息
    • 考虑使用加密方式存储和传输敏感数据
  2. 错误处理

    • 添加完整的异常处理机制
    • 记录发送日志,便于排查问题
    • 设置重试机制,提高发送成功率
  3. 性能优化

    • 对于批量发送,考虑使用异步或队列机制
    • 控制发送频率,避免被邮件服务器或短信平台限制
    • 使用连接池管理SMTP连接
  4. 遵守法规

    • 短信内容需符合平台规范
    • 营销类短信需要用户明确同意
    • 注意发送时间,避免骚扰用户

扩展学习:使用更高级的库

除了标准库,还有一些第三方库可以简化邮件发送:

# 使用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网络爬虫技术,学习如何从互联网上自动获取数据,为数据分析和机器学习项目提供原材料!

坚持学习,让自动化成为你的超级技能!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐