Python实现邮件与短信发送功能
在之前的教学内容中,我们已经介绍了如何使用 Python 自动生成 Excel、Word 和 PDF 等文档。接下来,我们可以在此基础上进一步自动化流程:通过程序将生成的文件以电子邮件形式发送给指定接收人,并通过短信通知对方邮件已发出。这些操作均可由 Python 高效完成,无需人工干预。
电子邮件的发送机制
尽管即时通讯工具日益普及,电子邮件依然是互联网上最广泛使用的通信方式之一。无论是企业发放录用通知、网站发送账户激活链接,还是金融机构推广理财产品,多数情况下都依赖电子邮件进行批量或定向传递。而这类任务通常由后台程序自动执行。
在技术层面,HTTP(超文本传输协议)用于访问网页资源,它是一种建立在 TCP(传输控制协议)之上的应用层协议。类似地,发送电子邮件则依赖于 SMTP(简单邮件传输协议),同样是基于 TCP 的应用级协议,专门规定了客户端与邮件服务器之间的通信规则。Python 提供了内置模块来简化这一过程。
smtplib
该模块将复杂的网络交互封装为一个易于操作的对象:
SMTP_SSL
通过调用其特定方法:
login
send_mail
即可完成整个邮件发送流程。
发送基础邮件示例
首先尝试发送一封不包含附件、图片或富文本格式的纯文本邮件。要实现此功能,必须连接到邮件服务器。虽然可以自行搭建邮件服务器,但对初学者而言较为复杂,因此推荐使用第三方邮箱服务。例如,在 注册账号并登录后,可在“设置”中开启 SMTP 功能,从而获得对外发送邮件的权限。具体步骤如下:
扫描上方二维码后,可通过手机短信获取授权码。发送短信后点击“我已发送”按钮即可显示授权码。请注意妥善保管该码,一旦泄露,他人可能冒用您的身份发送邮件。
接下来编写发送邮件的核心代码:
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from 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 编码格式。这种编码方式利用64个可打印字符表示二进制数据,适用于需要传输或存储二进制信息的场景,如电子邮件系统中的附件处理。
对于不了解 BASE64 原理的读者,建议参考相关资料深入学习。Python 标准库中也提供了相应的支持模块:
base64
以下代码展示了如何发送带有附件的邮件:
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from urllib.parse import quote
# 创建邮件主体对象
email = MIMEMultipart()
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from urllib.parse import quote
# 邮件服务器配置信息(可根据实际情况调整)
EMAIL_HOST = 'smtp.126.com'
EMAIL_PORT = 465
EMAIL_USER = 'xxxxxxxxx@126.com'
EMAIL_AUTH = '邮件服务器的授权码'
def send_email(*, from_user, to_users, subject='', content='', filenames=[]):
"""
发送电子邮件,支持纯文本内容与多个附件
:param from_user: 发件人邮箱地址
:param to_users: 收件人列表,多个邮箱使用英文分号隔开
:param subject: 邮件主题
:param content: 邮件正文(支持纯文本格式)
:param filenames: 要附加的文件路径列表
"""
# 构建多部分邮件对象
email_message = MIMEMultipart()
email_message['From'] = from_user
email_message['To'] = to_users
email_message['Subject'] = Header(subject, 'utf-8')
# 添加邮件正文
body = MIMEText(content, 'plain', 'utf-8')
email_message.attach(body)
# 处理附件
for file_path in filenames:
with open(file_path, 'rb') as f:
# 提取文件名用于显示
position = file_path.rfind('/')
display_name = file_path[position + 1:] if position >= 0 else file_path
encoded_filename = quote(display_name)
# 创建附件对象并设置编码和类型
attachment = MIMEText(f.read(), 'base64', 'utf-8')
attachment['Content-Type'] = 'application/octet-stream'
attachment['Content-Disposition'] = f'attachment; filename="{encoded_filename}"'
email_message.attach(attachment)
# 建立安全连接并登录邮件服务器
smtp_client = smtplib.SMTP_SSL(EMAIL_HOST, EMAIL_PORT)
smtp_client.login(EMAIL_USER, EMAIL_AUTH)
# 发送邮件
smtp_client.sendmail(from_user, to_users.split(';'), email_message.as_string())
smtp_client.quit()
# 示例调用:发送带附件的离职证明邮件
send_email(
from_user='xxxxxxxxx@126.com',
to_users='zzzzzzzz@1000phone.com',
subject='请查收离职证明文件',
content='亲爱的前同事:\n\n你需要的离职证明在附件中,请查收!\n\n祝,好!\n\n孙美丽 即日',
filenames=['resources/王大锤离职证明.docx']
)
上述代码已封装成一个通用的邮件发送函数,便于在不同项目中复用。只需根据实际需求修改邮件服务器参数、发件人信息及授权码即可。
通过该方法可实现自动化邮件通知功能,适用于文件分发、系统提醒等场景。注意确保附件路径正确,并且SMTP服务已在邮箱账户中启用。

在现代Web项目开发中,发送短信是一项常见功能,广泛应用于用户注册、验证码发送以及营销通知等场景。实现该功能通常需要借助第三方平台的支持。本文将以螺丝帽平台为例,介绍如何使用Python程序实现短信发送功能。关于账号注册及购买短信服务的具体流程,此处不再展开,可参考平台官方客服指引。
要通过Python调用螺丝帽平台的短信接口,我们可以使用requests库向其提供的HTTP短信网关发起请求。只需将目标手机号和短信内容作为参数传递即可完成发送。以下为具体实现代码:
import random
import requests
def send_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()
def gen_mobile_code(length=6):
"""生成指定长度的手机验证码"""
return ''.join(random.choices('0123456789', k=length))
def main():
code = gen_mobile_code()
message = f'您的短信验证码是{code},打死也不能告诉别人哟!【Python小课】'
print(send_message_by_luosimao('13500112233', message))
if __name__ == '__main__':
main()
requests
当我们向螺丝帽平台的短信网关发起请求时,服务器会返回JSON格式的响应数据。若返回结果中包含特定成功标识
http://sms-api.luosimao.com/v1/send.json
则表示短信已成功提交发送。如果返回中的状态码或提示信息显示异常
{'error': 0, 'msg': 'OK'}
建议查阅平台提供的官方
error
开发文档,定位问题所在。常见的错误类型如下图所示,可能涉及密钥无效、IP未授权、短信内容不合规等情况。
目前大多数正规短信平台都要求短信内容中必须包含已备案的签名信息。下图展示了在螺丝帽平台上配置的签名示例:“【Python小课】”。对于涉及敏感关键词的短信内容,还需预先申请并通过短信模板审核后方可发送。此外,为了防止API密钥泄露导致短信被恶意调用,平台通常支持设置“IP白名单”功能,限制仅允许指定IP地址访问接口。相关配置如有疑问,可联系平台技术支持获取帮助。
国内提供短信服务的平台众多,开发者可根据实际需求进行选择,主要考虑因素包括成本费用、短信到达率、接口稳定性以及集成难易程度等。若用于正式上线的商业项目,推荐购买平台提供的套餐服务以保障通信质量与系统可靠性。
总结:无论是发送邮件还是发送短信,均可通过调用第三方服务来实现。在实际项目中,不建议自行搭建邮件服务器,而应优先选用成熟的第三方邮件服务或购买专业厂商的服务方案,这样更稳定、安全且易于维护。