随着信息时代的发展,电子邮箱已成为我们日常沟通中不可或缺的工具。在科研工作中,除了用于交流讨论,它有时也能派上意想不到的用场——比如,用来自动发送计算结果、提醒任务完成,悄悄承担起一部分自动化的职责。
最近,由于研究课题的需要,我需要运行一个耗时近2天的Python程序。作为一名坚持不加班的科研人,为了查看结果而在周末专程赶去研究室,实在是既低效又狼狈。为了能够自动将运行结果第一时间发送给我和课题组的其他成员,我通过使用Python中的smtplib
和email
模块实现了一个自动发送邮件的脚本。通过这种方法,我便无需在周末亲自跑一趟研究室了!
值得注意的是,smtplib
和email
都是Python的标准库模块,因此我们无需安装任何第三方库!
代码
下面是其中的一段代码,展示了如何设置发件人、收件人、邮件内容以及附件,并通过Gmail的SMTP服务(Simple Mail Transfer Protocol,简单邮件传输协议)将邮件发送出去:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# 设置发件人、收件人、邮件标题、邮件正文
msg = MIMEMultipart()
msg["From"] = "123456@gmail.com"
msg["To"] = "abcdef@gmail.com"
msg["Subject"] = "Email based on smtplib"
body = "Hello world!\n\nBased on Python smtplib" # \n为换行符
msg.attach(MIMEText(body, "plain"))
# 添加附件
file_path = f"data/hello.png"
with open(file_path, "rb") as f:
part = MIMEApplication(f.read(), Name="hello.png")
part["Content-Disposition"] = 'attachment; filename="hello.png"'
msg.attach(part)
# 利用gmail服务发送邮件
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login("123456@gmail.com", "Password")
server.send_message(msg)
Gmail应用专用密码
看到上述代码的最后一部分,可能会有一些人感到疑惑——server.login()
中的"Password"
,难道是我们平时登录Gmail时用的密码吗?
答案是否定的。出于安全考虑,Google并不会允许用户直接使用Gmail的登录密码来连接SMTP服务。相反,用户需要使用“应用专用密码(App Password)” 来连接相关服务。
获取Gmail应用专用密码并不复杂。只要你的Gmail账户已开启两步验证,就可以前往Google账户安全页面(https://myaccount.google.com/security)找到“应用专用密码”选项。点击“生成应用专用密码”,选择用途(例如“邮件”或自定义名称),Google便会生成一个16位的密码。将这组密码替换到上述代码server.login()
中的"Password"
,即可正常登录并发送邮件。
值得留意的是,应用专用密码只需设置一次便可长期使用。当然,根据个人需要,这些应用专用密码可以随时手动进行删除。不过,虽然应用专用密码不像账户密码那样权限那么高,但它依然可以直接访问邮箱,包括发送邮件、读取草稿、查看收件人等敏感操作。因此,切记不要把应用专用密码上传到GitHub等其他公共平台!
我一般在Python 2.7中使用如下方法发送邮件
from javax.mail import Session, Message, Transport, Authenticator, PasswordAuthentication
from javax.mail.internet import InternetAddress, MimeMessage
from java.util import Properties
from javax.mail import Authenticator
什么狸猫换太子