前言
在训练网络的过程中, 需要大量的时间, 虽然可以预估网络训练完成时间, 但蹲点看结果着实有点不太聪明的亚子.
因此, 参照师兄之前发的 python 利用 smtp 自动发邮件的代码, 我作了些调整, 并参照网上的开源代码, 整理出了加强版 (可以传文件), 这样训练的 log 还有 model, 或者是远程电脑上的文件都可以通过邮件即时到达接收邮件的邮箱很方便吧~~
正文
废话不多说, 直接上代码.
一, 普通文本邮件 (作通知训练结束用 )
- # -*- coding: UTF-8 -*-
- import smtplib
- from email.mime.text import MIMEText
- # 第三方 SMTP 服务
- mail_host = "smtp.163.com" # SMTP 服务器
- mail_user = "yourname" # 用户名
- mail_pass = "xxx" # 密码 (这里的密码不是登录邮箱密码, 而是授权码)
- sender = 'yourname@163.com' # 发件人邮箱
- receivers = 'othername@163.com'] # 接收人邮箱
- content = 'Python Send Mail ! 训练结束!'
- title = 'Python SMTP Mail 训练结束' # 邮件主题
- message = MIMEText(content, 'plain', 'utf-8') # 内容, 格式, 编码
- message['From'] = "{}".format(sender)
- message['To'] = ",".join(receivers)
- message['Subject'] = title
- try:
- smtpObj = smtplib.SMTP_SSL(mail_host, 465) # 启用 SSL 发信, 端口一般是 465
- smtpObj.login(mail_user, mail_pass) # 登录验证
- smtpObj.sendmail(sender, receivers, message.as_string()) # 发送
- print("mail has been send to {0} successfully.".format(receivers))
- except smtplib.SMTPException as e:
- print(e)
二, 加强版附件传输邮件
- # -*- coding: UTF-8 -*-
- import smtplib
- from email.mime.text import MIMEText
- from email.mime.multipart import MIMEMultipart
- from email.header import Header
- # Files' Paths:
- file1 = 'mail.py'
- file2 = 'maill.py'
- # 收邮件的地址, 可以多个.
- Receivers = ['receiver1@163.com','receiver2@163.com']
- # 邮件主题:
- title = 'Python SMTP 邮件 (文件传输)'
- # 模拟服务器
- # SMTP 服务器
- SMTPServer="smtp.163.com"
- # 发邮件的地址
- Sender="yourname@163.com"
- # 发送者邮件的授权密码, 去 163 邮箱设置里获取. 并非是密码.
- passwd="xxx"
- # 创建一个带附件的实例
- message = MIMEMultipart()
- message['From'] = Sender
- message['To'] = ",".join(Receivers)
- message['Subject'] = title
- # 邮件正文内容
- message.attach(MIMEText('附件中是要传输的文件.\n', 'plain', 'utf-8'))
- message.attach(MIMEText('The files you need are as followed. \n', 'plain', 'utf-8'))
- # 构造附件 1
- att1 = MIMEText(open(file1, 'rb').read(), 'base64', 'utf-8')
- att1["Content-Type"] = 'application/octet-stream'
- att1["Content-Disposition"] = 'attachment; filename={0}'.format(file1)
- message.attach(att1)
- # 构造附件 2
- att2 = MIMEText(open(file2, 'rb').read(), 'base64', 'utf-8')
- att2["Content-Type"] = 'application/octet-stream'
- att2["Content-Disposition"] = 'attachment; filename={0}'.format(file2)
- message.attach(att2)
- try:
- mailServer = smtplib.SMTP(SMTPServer, 25) # 25 为端口号 (邮件),0-1024 都被系统占用了
- # 登录邮箱
- mailServer.login(Sender, passwd) # 需要的是, 邮箱的地址和授权密码
- # 发送文件
- mailServer.sendmail(Sender, Receivers, message.as_string())
- print("邮件发送成功")
- print("Mail with {0} & {1} has been send to {2} successfully.".format(file1,file2,Receivers))
- except smtplib.SMTPException as e:
- print("Error: 无法发送邮件")
- print(e)
后话
可以把代码加到网络 train.py 的最后, 别忘了在 train.py 的开头加上:
- # -*- coding: UTF-8 -*-
- import smtplib
- from email.mime.text import MIMEText
- from email.mime.multipart import MIMEMultipart
- from email.header import Header
然后你就可以专心忙自己的事情, 网络训练结束就自动发邮件啦~
果然 --Codes change the world.
来源: https://www.cnblogs.com/hatimwen/p/pythonmail.html