服务器上的长任务跑完以后,还要重新登录、翻日志、找输出,才能知道它有没有结束。任务只跑几分钟时,这样做没有太大负担。碰到跨夜计算、批量处理或定时报告,人就很难一直守着终端。
我希望服务器在任务结束时主动发来消息。邮件是一个很顺手的入口,手机和电脑都能查看,也能把结果留在收件箱里。
Summary
服务器邮件通知的流程简单有用,任务结束后整理消息,再借助邮箱服务把结果送到收件箱。
为什么考虑让服务器发邮件
服务器发邮件最常见的用途,是把“需要我回去查看”的事情主动送出来。例如一个计算任务已经完成,一份定时报告刚刚生成,或者某个监控脚本发现状态发生了变化。通知到达后,我们再决定要不要登录服务器处理。
邮件的优势在于能装下较完整的信息。主题可以直接写任务名称和状态,正文可以放摘要,报告、图片或日志还能作为附件一起发送。过几天需要回查时,收件箱里也有记录。
它也有自己的使用位置。只想在手机上立刻看到一句“任务完成”,Bark 这样的推送工具会更轻。需要传递报告、附件或较长说明时,邮件读起来更合适。
邮件和 Bark 怎么选
简短、及时的状态提醒可以交给 Bark。内容较长、需要附件或希望留档时,可以交给邮件。两种通知也能同时使用,让 Bark 负责提醒,邮件保存完整结果。
可以发送文本、附件和 HTML
服务器能够发送的内容大致有三种。最简单的是纯文本,适合“任务已完成”“运行失败”这类短消息,也可以放几行关键结果。这里说的文本既可以直接写在邮件正文里,也可以把 .txt 日志作为附件发送。

附件适合已经生成好的文件,例如报告、图片、表格或一小段日志。脚本只需要找到文件,再把它和邮件一起提交。文件很大时,邮件就不太方便了,这时可以发送一个能访问的下载地址,或者告诉自己文件保存在服务器的什么位置。
HTML 适合排版更完整的报告。它可以加入标题、颜色、表格和分区,让磁盘统计、任务清单或定时周报更容易阅读。代价是生成过程多一步,而且不同邮箱对复杂样式的显示可能略有差异。

| 内容形式 | 适合发送什么 | 实现时的差别 |
|---|---|---|
| 纯文本 | 完成状态、报错摘要、几行结果 | 直接写入邮件正文 |
| 附件 | 报告、图片、表格、日志文件 | 在正文之外再附加文件 |
| HTML | 带表格和样式的完整报告 | 把 HTML 作为可显示的正文加入邮件 |
发送过程没有变
无论选择文本、附件还是 HTML,邮件都要经过同一个邮箱服务发出。差别主要发生在发送之前,也就是脚本如何把正文和文件整理成一封邮件。
整套系统由哪些部分组成
从任务结束到收件箱收到邮件,中间只需要串起几样东西。
一眼看懂完整流程
服务器任务→触发通知脚本→整理正文和附件→SMTP 邮箱服务→收件箱
服务器任务是起点。它可以是一条计算命令,也可以是磁盘监控、数据备份或定时报告。任务结束后,程序调用通知脚本,并告诉它这次要发送什么。
通知脚本负责组装邮件。它填写发件人、收件人和主题,再选择纯文本、HTML 或附件。以后接入新的任务时,通常只要更换主题、正文和文件路径,发信部分可以继续复用。
SMTP 可以理解为邮箱提供的“发件通道”。脚本需要知道 SMTP 服务器地址、端口、发件账号和授权码,才能登录邮箱并提交邮件。常见的加密连接使用 465 端口;有些服务商提供 587 端口,具体配置以邮箱说明为准。
收件箱是流程的终点。它可以是同一个邮箱,也可以是另一个专门接收服务器通知的地址。只要这条链路接通,定时任务和监控程序就都能复用它。
一个最简单的示例
Python 标准库已经提供了发送邮件所需的两个主要工具。EmailMessage 用来填写主题、正文和收件人,smtplib 负责连接邮箱服务并发出邮件。
运行前准备
先从邮箱服务商的设置或帮助文档中找到 SMTP 服务器地址、端口和授权码。下面使用 465 端口作为示例,邮箱只支持 587 时需要按服务商说明调整连接方式。
新建一个 send_mail.py 文件,把下面的占位符换成自己的邮箱信息。
import ssl
import smtplib
from email.message import EmailMessage
smtp_server = "smtp.example.com"
sender = "<YOUR_EMAIL>"
auth_code = "<YOUR_SMTP_AUTH_CODE>"
receiver = "<YOUR_RECEIVER_EMAIL>"
message = EmailMessage()
message["Subject"] = "服务器任务通知"
message["From"] = sender
message["To"] = receiver
message.set_content("任务已经完成,可以检查结果了。")
with smtplib.SMTP_SSL(
smtp_server,
465,
context=ssl.create_default_context(),
) as smtp:
smtp.login(sender, auth_code)
smtp.send_message(message)
print("邮件已经提交,请检查收件箱。")在终端运行:
python send_mail.py如果配置正确,收件箱里会出现一封标题为“服务器任务通知”的邮件。第一次跑通以后,就可以把这段代码放到任务结束的位置,把固定正文换成任务名称、结束时间或结果摘要。需要发送报告时,再给邮件加入 HTML 正文或附件即可。