筹备工作
以QQ邮件为例阐明
1设置QQ邮箱:点击“设置”->“账户”
2. 往下滑 找到上面页面 点击“开启”按钮,开启POP3/SMTP服务,依据提醒实现开启操作,开启胜利后,生成受权码(受权码用于第三方登录,简略说就是用在你写的python程序里进行登录)
1发送一般的文字邮件
应用的库
email :用于写邮件
smtplib 用于操作协定 ,发送文件的
smtp协定的根本命令包含:
HELO 向服务器标识用户身份
MAIL 初始化邮件传输 mail from:
RCPT 标识单个的邮件接管人;常在MAIL命令前面,可有多个rcpt to:
DATA 在单个或多个RCPT命令后,示意所有的邮件接管人已标识,并初始化数据传输,以.完结
VRFY 用于验证指定的用户/邮箱是否存在;因为平安方面的起因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,裁减邮箱列表,也常被禁用
HELP 查问服务器反对什么命令
NOOP 无操作,服务器应响应OK
QUIT 完结会话
RSET 重置会话,以后传输被勾销
MAIL FROM 指定发送者地址
RCPT TO 指明的接收者地址
!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu
# @Date : 2020/8/2
import smtplib
from smtplib import SMTP_SSL #SMTP_SSL用于加密邮件内容,避免被截获
from email.mime.text import MIMEText #MIMEText用于结构邮件注释
from email.mime.multipart import MIMEMultipart#用于把邮件的各个局部装在一起,容器作用
from email.header import Header#邮件头,包含邮件名 收件人等
邮件结构
host_server=”smtp.qq.com”#QQ邮箱smtp服务器 ,应用什么邮箱就对应输出其服务器 。新浪邮箱:”smtp.sina.com”
sender_email = ” #发件人邮箱
pwd=’xxxxxxxxx’#之前失去的受权码。有的邮箱可能没有受权码就间接输出邮箱明码,为了窃密,我用x号代替实在的
receivers=’[email protected]’#收件人邮箱
mail_title=’余登武的程序测试文件’#邮件名
mail_content=’这是一封测试邮件’#邮件注释内容
主体装载
msg=MIMEMultipart()#初始化邮件主体 ,起容器作用,把各局部装进去
msg[‘Subject’]=Header(mail_title,’utf-8′)#msg[‘Subject’] 邮件主题,应用header将题目解决成能辨认的格局
msg[‘From’]=sender_email#寄件人
msg[‘From’]=Header(‘发送邮箱’,’utf-8′)#这一行和下面一行是等价的,都能够运行
msg[‘To’]=Header(‘测试邮箱’,’utf-8′)#收件人,和上面一行等效的
msg[‘To’]=receivers#收件人
msg.attach(MIMEText(mail_content,’plain’,’utf-8′))#邮件注释内容,plain 无格局,以无格局增加内容。第一个参数为邮件内容,第二个参数为设置文本格式,第三个参数为编码设置
登录产生邮件
smtp=SMTP_SSL(host_server)#登录服务器
smtp.login(sender_email,pwd)#输出用户名,明码 登录寄件人邮箱
smtp.sendmail(sender_email,receivers,msg.as_string())#产生邮件 。参数 :产生人,收件人,邮件主体
smtp.quit()#退出
2发送具备HTML格局的邮件
import smtplib
from smtplib import SMTP_SSL #SMTP_SSL用于加密邮件内容,避免被截获
from email.mime.text import MIMEText #MIMEText用于结构邮件注释
from email.mime.multipart import MIMEMultipart#用于把邮件的各个局部装在一起,容器作用
from email.header import Header#邮件头,包含邮件名 收件人等
邮件结构
host_server=”smtp.qq.com”#QQ邮箱smtp服务器 ,应用什么邮箱就对应输出其服务器 。新浪邮箱:”smtp.sina.com”
sender_email = ‘[email protected]’ #发件人邮箱
pwd=’xxxxxxxxx’#之前失去的受权码。有的邮箱可能没有受权码就间接输出邮箱明码
receivers=’[email protected]’#收件人邮箱
mail_title=’余登武的程序测试文件2’#邮件名
mail_content=’这是一封测试邮件
这是一封带有html格局的邮件
‘#邮件注释内容
主体装载
msg=MIMEMultipart()#初始化邮件主体 ,起容器作用,把各局部装进去
msg[‘Subject’]=Header(mail_title,’utf-8′)#msg[‘Subject’] 邮件主题,应用header将题目解决成能辨认的格局
msg[‘From’]=sender_email#寄件人
msg[‘From’]=Header(‘发送邮箱’,’utf-8′)#这一行和下面一行是等价的,都能够运行
msg[‘To’]=Header(‘测试邮箱’,’utf-8′)#收件人,和上面一行等效的
msg[‘To’]=receivers#收件人
msg.attach(MIMEText(mail_content,’html’,’utf-8′))#邮件注释内容,plain 无格局, html 为html格局。以无格局增加内容。第一个参数为邮件内容,第二个参数为设置文本格式,第三个参数为编码设置
登录产生邮件
try:
smtp = SMTP_SSL(host_server) # 登录服务器
smtp.set_debuglevel(1)#1是开启smtp debug,0敞开
smtp.ehlo(host_server)#向服务器答招呼,表明身份
smtp.login(sender_email,pwd)#输出用户名,明码 登录寄件人邮箱
smtp.sendmail(sender_email,receivers,msg.as_string())#产生邮件 。参数 :产生人,收件人,邮件主体
smtp.quit()#退出
print(‘发送胜利’)
except smtplib.SMTPException:#捕获异样
print(‘发送失败’)
3发送带附件的邮件
比前文多一个导入
from email.mime.application import MIMEApplication#用于增加附件
!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu
# @Date : 2020/8/2
import smtplib
from smtplib import SMTP_SSL #SMTP_SSL用于加密邮件内容,避免被截获
from email.mime.text import MIMEText #MIMEText用于结构邮件注释
from email.mime.multipart import MIMEMultipart#用于把邮件的各个局部装在一起,容器作用
from email.header import Header#邮件头,包含邮件名 收件人等
from email.mime.application import MIMEApplication#用于增加附件
邮件结构
host_server=”smtp.qq.com”#QQ邮箱smtp服务器 ,应用什么邮箱就对应输出其服务器 。新浪邮箱:”smtp.sina.com”
sender_email = ‘[email protected]’ #发件人邮箱
pwd=’********8’#之前失去的受权码。有的邮箱可能没有受权码就间接输出邮箱明码
receivers=’[email protected]’#收件人邮箱
mail_title=’余登武的程序测试文件2’#邮件名
mail_content=’这是一封测试邮件
这是一封带有html格局的邮件
外汇出入金流程https://www.fx61.com/support
‘#邮件注释内容
主体装载
msg=MIMEMultipart()#初始化邮件主体 ,起容器作用,把各局部装进去
msg[‘Subject’]=Header(mail_title,’utf-8′)#msg[‘Subject’] 邮件主题,应用header将题目解决成能辨认的格局
msg[‘From’]=sender_email#寄件人
msg[‘From’]=Header(‘发送邮箱’,’utf-8′)#这一行和下面一行是等价的,都能够运行
msg[‘To’]=Header(‘测试邮箱’,’utf-8′)#收件人,和上面一行等效的
msg[‘To’]=receivers#收件人
msg.attach(MIMEText(mail_content,’html’,’utf-8′))#邮件注释内容,plain 无格局, html 为html格局。以无格局增加内容。第一个参数为邮件内容,第二个参数为设置文本格式,第三个参数为编码设置
attachment=MIMEApplication(open(r’zhenjiang_power.csv’,’rb’).read())#关上附件.
attachment.add_header(‘Content-Disposition’,’attacment’,filename=’zhenjiang_power.csv’)#给附件重命名,第一个参数’Content-Disposition’:内容设置,第二个参数:附件,第三个参数:文件名
msg.attach(attachment)#把附件增加进主体
登录产生邮件
try:
smtp = SMTP_SSL(host_server) # 登录服务器
smtp.set_debuglevel(1)#1是开启smtp debug,0敞开
smtp.ehlo(host_server)#向服务器答招呼,表明身份
smtp.login(sender_email,pwd)#输出用户名,明码 登录寄件人邮箱
smtp.sendmail(sender_email,receivers,msg.as_string())#产生邮件 。参数 :产生人,收件人,邮件主体
smtp.quit()#退出
print(‘发送胜利’)
except smtplib.SMTPException:#捕获异样
print(‘发送失败’)
解释:
增加附件 rb为读取二进制文件
attachment=MIMEApplication(open(r’zhenjiang_power.csv’,‘rb’).read())#关上附件.
文件重命名,因为上一行读取后果是二进制文件,如果间接发送,发送的是二进制文件。须要批改回人能看懂的格局
attachment.add_header(‘Content-Disposition’,‘attacment’,filename=‘zhenjiang_power.csv’)#给附件重命名,第一个参数’Content-Disposition’:内容设置,第二个参数:附件,第三个参数:文件名
msg.attach(attachment)#把附件增加进主体
增加绝对路径文件
attachment=MIMEApplication(open(r’C:\Users\Shineion\Desktop\样例测试.xls’,‘rb’).read())#关上附件.
绝对路径还是手打,我间接复制过去时显示报错,手打却胜利发送。
4利用 zmail 接管邮件
库:zmail
须要装置
pip install zmail
import zmail
server=zmail.server(‘[email protected]’,’dteqfmouzznhbaba’)#输出账户和明码 ,QQ邮箱明码明码为之前失去的受权码
mail=server.get_latest()#获取最新的一份邮件
zmail.show(mail)#查看邮件
如果只想查看一部分内容
import zmail
server=zmail.server(‘[email protected]’,’******’)#输出账户和明码 ,QQ邮箱明码明码为之前失去的受权码
mail=server.get_latest()#获取最新的一份邮件
print(mail[‘Subject’])
将邮件中的附件保留到本地
参数mail:失去的邮件
target_path:保留门路,None 为保留到工作目录文件夹
overwrite:是否复写,如果有重名文件是否笼罩
zmail.save_attachment(mail,target_path=None,overwrite=True)
1
后果
邮件中的样例测试.xls保留到工作目录下。
5利用 zmail 发邮件
smtplib发邮件代码简单,直到明天仍有人在这里遇到问题。而且代码简单,解释起来很麻烦,明天给大家介绍一个新的发邮件办法——zmail
zmail的劣势
主动填充头信息
将一个字典映射为email,结构邮件相当于结构字典
主动寻找邮件服务商端口号地址、主动抉择协定
只依赖Python3
import zmail
MAIL = {
‘subject’: ‘测试邮件’,#题目
‘content_text’: ‘不晓得说些什么,’,#注释内容
‘attachments’: [‘zhenjiang_power.csv’, ‘renwu.jpg’],#附件
}
server = zmail.server(“[email protected]”, “********”)#发送者的邮箱 和受权码
server.send_mail(“[email protected]”, MAIL)
6每天定时发送邮件
她来了。
# coding=utf-8
import datetime
import time
import os
def chengxu():
# 把要启动的程序放在这个办法里
os.system(“python D:\\机器学习\\学习草稿\\hm_003.py”) # 执行hm_003.py文件
os.system(“pause”)
print(“程序曾经执行了!”)
def main(h=10, m=40):
while True:
now = datetime.datetime.now()
print(now) # 2020-08-03 15:02:19.683783
print(now.hour, now.minute)#15 2
if now.hour == 15 and now.minute == 3:
chengxu()
# 每隔60秒检测一次
time.sleep(60)
main()