你被发邮件这事折磨过吗?每天上班第一件事就是打开邮箱给客户发报表。一个附件一个附件地选,一次一次地输地址。要是你只发几封还好,碰上几十个客户,那手指头都要断了。更烦的是万一漏发了个附件,客户电话立马打过来问。这套动作重复几年,谁都烦。
我之前就是这么熬过来的。后来发现Python自带的smtplib和email两个标准库就能搞定这堆破事。不需要装任何第三方工具,你电脑上只要有Python就能用。
先说最基础的,发一封带附件的邮件到底怎么写。核心逻辑就三步:登录邮箱服务器,组装邮件内容,发送。很多人卡在第二步,觉得附件很复杂。其实你只要把附件当成一个普通的二进制文件读进来,然后塞进邮件里就行。
看个样例会清楚很多。假设你要给张三发一份Excel报表。代码大概是这样的:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
msg = MIMEMultipart()
msg['From'] = '你的邮箱地址'
msg['To'] = 'zhangsan@公司.com'
msg['Subject'] = '7月销售报表'
with open('销售报表.xlsx', 'rb') as f:
att = MIMEText(f.read(), 'base64', 'utf-8')
att['Content-Type'] = 'application/octet-stream'
att['Content-Disposition'] = 'attachment; filename='销售报表.xlsx''
msg.attach(att)
server = smtplib.SMTP('smtp.你的邮箱服务器.com', 587)
server.starttls()
server.login('你的邮箱地址', '你的密码')
server.send_message(msg)
server.quit()
这代码够直白了吧?把文件名改成你的就行。密码那里注意,千万别用自己的登录密码,要到邮箱设置里生成一个授权码。QQ邮箱、163邮箱都支持这个功能。不然发信可能会被拦截。
你可能会说,我每天要发几十封,难道要一封一封写死代码?不用。你可以把客户信息存到一个Excel表里。比如第一列是邮箱地址,第二列是附件路径,第三列是主题。然后用循环读取这个表,一个循环就能发出全部邮件。
我们部门原来有个小姑娘,每天下午三点准时发报价单给32个客户。她手动操作要45分钟。我用这个循环方法帮她写了个脚本,现在她点一下运行,泡杯咖啡回来邮件就全发出去了。她还以为自己工作效率变高了,其实就是偷懒的时间变多了。
还要注意一个问题。很多新手发邮件时附件一多就报错。因为一次读取太大的文件会撑爆内存。如果你要发几百兆的视频,最好先压缩成zip包再发。或者用分片策略,一次只处理一个附件。Python标准库没有限制附件大小,但你的邮箱服务器一般有单封邮件大小限制,通常是25M。
另外有个坑你肯定遇到过。明明代码跑通了,对方就是收不到邮件。这事大概率是进了垃圾箱。你在发信邮箱设置里把自己加到白名单,或者用小号测试几次。实在不行就用企业邮箱,企业邮的反垃圾策略没那么严格。
对了,忘记说了。你用smtplib发邮件时,一定要有个错误处理。万一网络断了,代码会直接崩溃。简单加个try except,把发送失败的邮箱记录到另一个文件里。等网络恢复了再重新跑一次这些失败的记录。这样哪怕发到一半停电了,你都知道哪些人还没收到。
我们公司现在每个月工资条都是这样发的。财务把每个人的工资填进Excel模板,跑一下脚本,600多人的工资条10分钟就发完了。以前财务要搞一整天,现在多出来的时间都用来喝下午茶了。你说办公自动化图个啥,不就是为了少干重复劳动吗。
标准库就是这么好用。你不用学什么高深算法,不用装什么机器学习框架。就一个smtplib加上一点点循环知识,就能省下你每天一两个小时。你要是愿意,还能在附件名里加上当前日期,自动生成“报表_2024_07_15.xlsx”这种格式。细节不用我再教了吧?自己试一次就全明白了。
赶紧打开你电脑写几行代码。今天就别手动发邮件了,让Python替你干。