Python 发送邮件
一、介绍
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
二、需求分析
有一个shell脚本,需要有发送邮件的功能。如果直接使用shell自带的mail发送
echo 邮件正文” | mail -s 邮件主题 收件地址
这种邮件收到后,会被邮箱服务器拦截到。可能会进入到垃圾收件箱中,可能连垃圾箱都没有(被拦截了)。
但是又不想搭建邮箱服务器,太麻烦了!
怎么办呢?使用Python就可以解决。
三、Python发送邮件
我们需要使用shell脚本来调用Python脚本,所以传参数时,需要使用命令行方式传参。
sys.argv
sys.argv[]是用来获取命令行输入的参数的(参数和参数之间空格区分),sys.argv[0]表示代码本身文件路径,所以从参数1开始,表示获取的参数了!
在python3.5.2版本中,默认已经有smtplib和email两个模块,所以不需要安装了!
正式脚本
mail-send.py
注意:此文件名不能是email.py
因为email是python自带的,否则会报错
ModuleNotFoundError: No module named 'email.utils'; 'email' is not a package
完整内容如下:
#!/usr/bin/env python3 # coding:utf-8 import sys import smtplib # 加载smtplib模块 from email.mime.text import MIMEText from email.utils import formataddr class SendMail(object): def __init__(self,sender,title,content): self.sender = sender #发送地址 self.title = title # 标题 self.content = content # 发送内容 self.sys_sender = '123456@163.com' # 系统账户 self.sys_pwd = '123456' # 系统账户密码 def send(self): try: """ 构造一个邮件对象, 第一个参数就是邮件正文, 第二个参数是MIME的subtype,传入'html',最终的MIME就是'text/html'。 最后一定要用utf-8编码保证多语言兼容性。 """ msg = MIMEText(self.content, 'html', 'utf-8') # 发件人格式 msg['From'] = formataddr(["IT事业部系统", self.sys_sender]) # 收件人格式 msg['To'] = formataddr(["", self.sender]) # 邮件主题 msg['Subject'] = self.title # SMTP服务器 server = smtplib.SMTP("smtp.163.com", 25) # 登录账户 server.login(self.sys_sender, self.sys_pwd) # 发送邮件 server.sendmail(self.sys_sender, [self.sender, ], msg.as_string()) # 退出账户 server.quit() return True except Exception as e: print(e) return False if __name__ == '__main__': # 参数个数,由于sys.argv[0]就是脚本名,所以要减1 num = len(sys.argv) - 1 if num < 3 or num > 3: exit("参数错误,必须传3个参数!当前参数个数为%s"%num) sender = sys.argv[1] # 发送地址 title = sys.argv[2] # 标题 content = sys.argv[3] # 发送内容 # 调用send方法,发送邮件 ret = SendMail(sender,title,content).send() if ret: print('发送成功!') else: print('发送失败!')
注意:需要修改系统账户的邮箱和密码!
如果是163邮箱,SMTP服务器无需修改,否则需要修改!
如果是qq邮箱,改动如下:
1.qq邮箱密码换成它提供的16位授权码
2.端口号改为465
3.smtplib.SMTP改为smtplib.SMTP_SSL
可能有些人会有疑惑,为什么要改成smtplib.SMTP_SSL。因为腾讯的邮箱服务器,使用的是SSL加密方式。
运行脚本
将脚本上传到 linux服务器,先用命令行运行。
语法如下:
python3 mail-send.py 发送地址 标题 发送内容
测试执行:
python3 mail-send.py 88888888@qq.com 申请单 '账户: xiao <br>密码:123456 <br>请妥善保管好账户信息,本 邮件由系统发送,请勿回复!谢谢配合!<br>'
这个时候,收到的邮件如下:
使用shell调用
使用shell脚本调用,也是同样的道理。将命令直接写进入就可以了!
脚本如下:
#!/bin/bash python3 mail-send.py 987334176@qq.com 申请单 '账户: xiao <br>密码:123456 <br>请妥善保管好账户信息,本 邮件由系统发送,请勿回复!谢谢配合!<br>'
执行脚本,效果同上!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix