统计某个统计量超过一定的阈值或者设置一个定时任务等,触发发送邮件相关信息来告警,甚至可以用这个功能来做一个发送邮件简单功能,而不是人为发送
以下文章都是针对发送邮件这个功能进行详细阐述
类似登录服务器需要账号密码端口号
映射一个功能需要映射一个端口号入口或者接口
所以发送邮件 同样需要账号密码的授权以及端口号甚至是这个邮件SMTP或者POP3服务器的授权
具体授权方式通过登录邮件,进入邮件设置中,找到开启的服务(类似服务器开启端口号映射)
以下是qq浏览器,其他浏览器同理,开启POP3的SMTP服务器授权:
开启之后记录下密码授权,这一串类似邮箱中的密码:(可拥有多个授权码,无需记住也不可泄露)
有了账号和密码还不够,不同的邮箱有不同的服务器授权(该博文使用的是qq,所以展示qq邮箱的规则)
类型 | 名称 | 地址 | 非SSL端口 | SSL端口 |
---|---|---|---|---|
发送 | SMTP | smtp.qq.com | 25 | 465/587 |
接收 | POP | pop.qq.com | 110 | 995 |
接收 | IMAP | imap.qq.com | 143 | 993 |
故全局变量的属性如下:
MAIL = {
"from": '[email protected]',
"pwd": 'xxx',
"smtp": 'smtp.qq.com',
}
除了发件人还需要一个接收人或者接收的群体:receiver_list = ['[email protected]']
邮件的包中主要通过如下:pip install py-emails
单发邮件:
# -*- coding: utf-8 -*-
# !/user/bin/env python
# -*- coding:utf-8 -*-
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
MAIL = {
"from": '[email protected]',
"pwd": 'xxx',
"smtp": 'smtp.qq.com',
}
receiver_list = ['[email protected]']
if __name__ == "__main__":
msg = MIMEMultipart('alternative')
msg['Subject'] = Header('码农研究僧', 'utf-8') # 标题
msg['From'] = MAIL['from'] # 发件人
msg['To'] = receiver_list[0] # 收件人
# 内容
content = "你好,感谢你的观看"
# 此正文消息,参数为内容、编码格式(plain纯文本)、编码方式
html_message = MIMEText(content, 'plain ', 'utf-8') # 正文
html_message["Accept-Language"] = "zh-CN"
html_message["Accept-Charset"] = "ISO-8859-1,utf-8"
msg.attach(html_message)
try:
# 非SSL,如果为SSL则看下面
server = smtplib.SMTP(MAIL['smtp'])
# 如果是ssl,需要加多一个端口号映射
# server = smtplib.SMTP_SSL()
# server.connect(MAIL['smtp'],MAIL['port'])
# 登陆邮箱发送邮件
server.login(MAIL['from'], MAIL['pwd'])
server.sendmail(MAIL['from'], receiver_list, msg.as_string())
print('发送成功')
except Exception as e:
print('error', e)
发送成功之后:
如果说是群发邮件,则邮件应该添加多个人的邮箱
而且处理每个人的时候需要加上分号分割:msg['To'] = ";".join(receiver_list)
zmail的版本是python3以上,该包不需要引入邮件服务器端口号(会自动寻找)
需要pip安装才可导入zmail包:pip install zmail
具体发送邮件的相关代码如下:
单发和群发的区别在于接收的人数多与少,通过";".join(receiver_list)
即可实现
import zmail
MAIL = {
"from": '[email protected]',
"pwd": 'xxx'
}
receiver_list = ['[email protected]']
MAIL_CONTENT = {
'subject':"码农研究僧",
'content_text':'这是 邮件相关代码',
'attachments':r'B:\python\mail.py'
}
if __name__ == "__main__":
try:
# 登录邮箱
server = zmail.server(MAIL['from'],MAIL['pwd'])
# 发送邮件
server.send_mail(receiver_list[0], MAIL_CONTENT)
print('发送成功')
except Exception as e:
print('error', e)
对比具体附件的相关信息(验证正确):
有无附件通过定义有无这个值即可,'attachments':
如果邮件内容中有附件,也可对应获取邮件附件内容:
mail = server.get_latest()
# 附件别名省略,则自带默认的邮件名获取
zmail.get_attachment(mail,'附件别名')
如果有端口号或者服务器的限制,请加上
server = zmail.server(MAIL['from'],MAIL['pwd'],smtp_host=MAIL['smtp'],smtp_port=MAIL['port'])
通过这个包也可进行接收邮件:
import zmail
MAIL = {
"from": '[email protected]',
"pwd": 'xxx'
}
if __name__ == "__main__":
try:
server = zmail.server(MAIL['from'],MAIL['pwd'])
mail = server.get_latest()
zmail.show(mail)
print('获取成功')
except Exception as e:
print('error', e)
成功执行之后会获得最新邮件的信息:server.get_latest()
,这是详细信息
具体信息如下:
-------------------------
Subject 码农研究僧
Id 56
From [email protected]
To [email protected]
Date None
Content_text ['你好,感谢你的观看']
Content_html []
Attachments
发送成功
也可通过这些信息可筛选出邮件内容:
比如通过获取邮件的subject,或者通过邮件的id或者这封邮件的具体信息:
mail = server.get_mail(56)
print (mail)
具体内容如下:
{'content_text': ['你好,感谢你的观看'], 'content_html': [], 'attachments': [], 'headers': {'Received': 'from [ip地址] ([[ip地址])by 。。。
发送成功
如果获取邮件的简述信息(邮件id数、邮件大小),通过server.stat()
mail = server.stat()
print (mail)
如果获取特定邮件的内容,甚至是按照时间点获取,可以通过get_mails
函数
查看其原函数,其他参数可带如下内容筛选:
其函数参数如下:
参数 | 描述 |
---|---|
subject | 邮件主题 |
start_time | 开始时间 |
end_time | 结束时间 |
sender | 发送者 |
start_index | 开始id |
end_index | 结束id |
示例代码如下:
mails = server.get_mails(subject='码农研究僧')
for mail in mails:
zmail.show(mails)
同样需要导入这个包:pip install yagmail
示例代码如下:
import yagmail
MAIL = {
"from": '[email protected]',
"pwd": 'xxx',
"smtp": 'smtp.qq.com',
}
receiver_list = ['[email protected]']
MAIL_CONTENT = {
'subject':"码农研究僧",
'content_text':'这是 邮件相关代码',
'attachments':r'B:\python\mail.py'
}
if __name__ == "__main__":
try:
# 登录邮箱
server = yagmail.SMTP(MAIL['from'],MAIL['pwd'],MAIL['smtp'])
# 发送邮件
server.send(receiver_list[0],MAIL_CONTENT['subject'],MAIL_CONTENT['content_text'],MAIL_CONTENT['attachments'])
server.close()
print('发送成功')
except Exception as e:
print('error', e)
描述如下:
参数 | 描述 |
---|---|
to | 发件人 |
subject | 标题 |
contents | 内容 |
attachments | 附件 |