参加数据分析实习的时候公司需要实行邮件自动发送预警,因此,这里做一个简单的总结,我也查看了网上的博客,大都有相应的方法,但是他们没有将代码做一个封装,我这里做出了一个封装补充,可以便于以后在本地进行各种直接调用,只需要输入参数即可!
以下是代码,并附上相应注释
注:
(1)这里需要输入你们自己的发送邮箱账号和授权密码,我就在代码中用*代替了)
(2)出于隐私,我这里用QQ邮箱发送的,并没有用公司邮箱,如果想用其他邮箱也可以自行百度,方法一样的)
(3)这里邮箱授权码不是邮箱密码,需要自行设置,也很简单,提供一个网址给你们参考)
https://service.mail.qq.com/cgi-bin/help?subtype=1&id=28&no=1001256
(4)本文代码实现的是两人邮件发送,要想实现更多人发送,只要在收件人邮箱中添加即可)
import smtplib # 负责发送邮件
from email.mime.text import MIMEText # 构造文本
from email.mime.image import MIMEImage # 构造图片
from email.mime.multipart import MIMEMultipart # 将多个集合对象集合起来
from email.header import Header
import datetime
import warnings
warnings.filterwarnings('ignore')
# 输入发件人昵称、收件人昵称、主题,正文,附件地址,附件名称生成一封邮件
def create_email(sender_name, receiver_name, email_Subject, email_text, annex_file,annex_name):
#生成一个空的带附件的邮件实例
message = MIMEMultipart()
#将正文以text的形式插入邮件中(参数1:正文内容,参数2:文本格式,参数3:编码方式)
message.attach(MIMEText(email_text, 'plain', 'utf-8'))
#生成发件人名称
message['From'] = Header(sender_name, 'utf-8')
#生成收件人名称
message['To'] = Header(receiver_name, 'utf-8')
#生成邮件主题
message['Subject'] = Header(email_Subject, 'utf-8')
#读取附件的内容
att1 = MIMEText(open(annex_file, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
#生成附件的名称
att1["Content-Disposition"] = 'attachment; filename=' + annex_name
#将附件内容插入邮件中
message.attach(att1)
#返回邮件
return message
def send_email(sender, password, receiver, msg, mail_host = "smtp.qq.com"):
# 一个输入邮箱、密码、收件人、邮件内容发送邮件的函数
try:
#找到你的发送邮箱的服务器地址,已加密的形式发送
server = smtplib.SMTP_SSL() # 发件人邮箱中的SMTP服务器
server.connect(mail_host, 465)
server.ehlo()
#登录你的账号
server.login(sender, password) # 括号中对应的是发件人邮箱账号、邮箱密码
#发送邮件
server.sendmail(sender, receiver, msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号(是一个列表)、邮件内容
print("邮件发送成功" + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
# 关闭SMTP对象
server.quit()
except Exception:
print('邮件发送失败'+ datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
if __name__ == '__main__':
# SMTP服务器,这里使用qq邮箱
# mail_host = "smtp.qq.com"
# 发件人邮箱
sender = "********@qq.com"
sender_name = "zhansan<*********@qq.com>"
# 邮箱授权码,注意这里不是邮箱密码!!
mail_license = "vtzkhvxhbcry***"
#收件人邮箱(前面的昵称一定要用英文的)
receiver_name = "wangwu<*********@163.com>,lisi<*********@qq.com>" #
# 邮件主题
subject_content = """Python自动邮件发送"""
# 邮件正文
body_content = """你好,这是一个自动发送邮件代码!"""
annex_file = '/Users/jancy/Desktop/技术文档/Linux定时任务技术文档.docx'
annex_name = "Linux_autoemail.docx"
message = create_email(sender_name=sender_name,receiver_name=receiver_name,email_Subject=subject_content,
email_text=body_content,annex_file=annex_file,annex_name=annex_name)
send_email(sender=sender,password=mail_license,receiver=receiver_name,msg=message)
运行结果展示:
直接将代码保存本地,然后调用相应的接口即可输出结果!
好了,以上便是利用python自动发送邮件的代码,这里再补充一个公司内部可以定时发送邮件任务的方法!
注: 这里只针对于Linux系统,倘若是windows的话,直接在本地点点点就可以了,或者远程连接公司的服务器)
因为公司预警都是在仓库、数据库等出问题下,自动发送的,所以我们不可能自己时刻监管运行这样的代码,因此有必要了解linux系统的定时任务,其实也很简单啦
具体内容如下:
(1)如果是windows系统,需要连接远程服务器(这里不介绍windows自带的点点点定时任务),下面是在终端连接公司的远程服务器命令:
命令:ssh ***@192.168.188. 123 密码:1111
(2)如果是Linux/Unix系统,直接在终端输入: crontab -e ,
(i)进入编辑模式,输入执行定时任务命令,
(ii)输入完成后,按照vim操作进行保存(即输入 :wq ),
(iii)如果需要终止定时任务需要注释命令,具体操作:进入编辑模式,依然类似vim操作( 输入i,进行编辑,在定时任务命令开头输入#,然后按ESC退出,按:wq保存修改 )
给出我的例子(每个月的17号的早上10点-11点每隔1分钟发送一次邮件):
注:我把这个定时任务给停止了,因此前面会有一个“#”
这里涉及定时任务的命令,前面的“*”有它特定的含义,我直接截图了,有想了解的可以自行百度:
这样的话就全部完成了,我用这个也是成功的在本地运行出结果了,自己的邮箱里出现了一大堆自己发送的邮件,如果喜欢的话并学到一点点知识的,就给个赞吧^ - ^
如有其他问题,欢迎评论讨论!