准备工作以QQ邮箱为例进行说明1设置QQ邮箱:点击“设置”->“账户”2.向下滚动找到如下页面,点击“打开”按钮打开POP3/SMTP服务。根据提示完成开通操作。开通成功后,生成一个授权码(授权码是用来第三方登录的,简单的说就是用来在你写的python程序中登录)1.用于发送普通文本邮件的库邮箱:用于编写Mailsmtplib用于操作该协议,smtp协议发送文件的基本命令包括:??HELO向服务器标识用户身份MAIL初始化邮件传输mailfrom:RCPT标识单个邮件收件人;经常在MAIL命令后面,可以有多个rcptto:DATA单个或多个RCPT命令后,表示已经识别出所有的邮件收件人,并发起数据传输,以.结束。VRFY用于验证指定用户/邮箱是否存在;由于安全原因,服务器经常禁止这个命令EXPN验证给定的邮箱列表是否存在,扩展邮箱列表,经常被禁用HELP查询服务器支持什么命令NOOP没有操作,服务器应该响应OKQUIT结束会话RSET重置会话,取消当前发送MAILFROM指定发件人地址RCPTTO指定收件人地址!/usr/bin/envpython3#-*-coding:utf-8-*-#@Author:yudengwu#@Date:2020/8/2importsmtplibfromsmtplibimportSMTP_SSL#SMTP_SSL用于加密邮件内容防止拦截fromemail.mime.textimportMIMEText#MIMEText用于构造邮件文本fromemail.mime.multipartimportMIMEMultipart#是用于将邮件的各个部分打包在一起,容器函数fromemail.headerimportHeader#邮件头,包括邮件名称,收件人等mailstructurehost_server="smtp.qq.com"#QQ邮箱smtp服务器,其中邮箱使用合作响应服务器。新浪邮箱:"smtp.sina.com"sender_email=''#发件人邮箱pwd='xxxxxxxxx'#之前获取的授权码。有些邮箱可能没有授权码,直接输入邮箱密码即可。为了保密,我用x号代替receivers='1344732766@qq.com'#收件人邮箱mail_title='于登武的程序测试文件'#邮件名称mail_content='这是测试邮件'#Emailtextcontentbodyloadingmsg=MIMEMultipart()#初始化邮件正文,作为容器,将每个部分放入其中msg['Subject']=Header(mail_title,'utf-8')#msg['Subject']邮件主题,使用header将主题处理成可识别的格式msg['From']=sender_email#Sendermsg['From']=Header('Sendemail','utf-8')#这一行相当于上面一行,你可以运行msg['To']=Header('testmailbox','utf-8')#Recipient,msg['相当于下面一行'To']=receivers#Recipientsmsg.attach(MIMEText(mail_content,'plain','utf-8'))#邮件文本内容,plain没有格式,添加的内容没有格式。第一个参数为邮件内容,第二个参数为文本格式设置,第三个参数为登录邮件的编码设置smtp=SMTP_SSL(host_server)#登录服务器smtp.login(sender_email,pwd)#Enter用户名和密码登录发件人邮箱smtp.sendmail(sender_email,receivers,msg.as_string())#Email发生。参数:发件人,收件人,邮件正文smtp.quit()#Exit2发送HTML格式的邮件importsmtplibfromsmtplibimportSMTP_SSL#SMTP_SSL用于对邮件内容进行加密,防止拦截来自email.mime.textimportMIMEText#使用MIMEText构造邮件正文fromemail.mime.multipartimportMIMEMultipart#用于将邮件的各个部分打包在一起,容器功能fromemail.headerimportHeader#邮件头,包括邮件收件人名称等mailstructurehost_server="smtp.qq.com"#QQ邮箱smtp服务器,使用哪个邮箱对应服务器。新浪邮箱:"smtp.sina.com"sender_email='1344732766@qq.com'#发件人邮箱pwd='xxxxxxxxx'#之前获取的授权码。有些邮箱可能没有授权码,直接输入邮箱密码receivers='1344732766@qq.com'#收件人邮箱mail_title='于登武的程序测试文件2'#邮件名称mail_content='这是测试邮件ThisisAnemailwithhtmlformat'#Mailtextcontentbodyloadingmsg=MIMEMultipart()#初始化邮件正文,作为容器,将各个部分放入其中msg['Subject']=Header(mail_title,'utf-8')#msg['Subject']邮件主题,使用header将主题处理成可识别的格式msg['From']=sender_email#Sendermsg['From']=Header('Sendemail','utf-8')#这一行相当于上面一行,可以运行msg['To']=Header('testmailbox','utf-8')#Recipient,msg['相当于下面一行'To']=receivers#Recipientsmsg.attach(MIMEText(mail_content,'html','utf-8'))#邮件文本内容,plain没有格式,html就是html格式。添加不带格式的内容。第一个参数是邮件内容,第二个参数是设置文本格式,第三个参数是设置登录邮件的代码try:smtp=SMTP_SSL(host_server)#登录服务器smtp.set_debuglevel(1)#1是启用smtpdebug,0关闭smtp.ehlo(host_server)#Greetingtotheserver,indicatesidentity#Mailhappens。参数:发件人,收件人,邮件正文smtp.quit()#Exitprint('发送成功')exceptsmtplib.SMTPException:#Catchexceptionprint('发送失败')3比上一封多发送一封带附件的邮件Importfromemail.mime.applicationimportMIMEApplication#用于添加附件!/usr/bin/envpython3#-*-coding:utf-8-*-#@Author:yudengwu#@Date:2020/8/2importsmtplibfromsmtplibimportSMTP_SSL#SMTP_SSL用于加密邮件内容,防止被拦截fromemail.mime.textimportMIMEText#MIMEText用于构造邮件文本fromemail.mime.multipartimportMIMEMultipart#用于将邮件的各个部分打包在一起,容器函数fromemail.headerimportHeader#邮件头,包括邮件名称收件人等fromemail.mime.applicationimportMIMEApplication#用于添加附件邮件结构host_server="smtp.qq.com"#QQ邮箱smtp服务器,使用什么邮箱对应的输入其服务器。新浪邮箱:"smtp.sina.com"sender_email='1344732766@qq.com'#发件人邮箱pwd='********8'#之前获取的授权码。有些邮箱可能没有授权码,直接输入邮箱密码receivers='1344732766@qq.com'#收件人邮箱mail_title='于登武的程序测试文件2'#邮件名称mail_content='这是测试邮件ThisisAn外汇出入金流程html格式邮件https://www.fx61.com/support'#Emailtextcontentbodyloadingmsg=MIMEMultipart()#初始化邮件正文,作为容器,将各个部分放入itmsg['Subject']=Header(mail_title,'utf-8')#msg['Subject']邮件主题,使用header将主题处理成可识别的格式msg['From']=sender_email#sendermsg['From']=Header('发送邮箱','utf-8')#这一行相当于上面一行,可以运行msg['To']=Header('测试邮箱','utf-8')#Recipients,相当于下面一行msg['To']=receivers#Recipientsmsg.attach(MIMEText(mail_content,'html','utf-8'))#Email文本内容,plain无格式,html为html格式。添加不带格式的内容。第一个参数为邮件内容,第二个参数为文本格式设置,第三个参数为编码设置attachment=MIMEApplication(open(r'zhenjiang_power.csv','rb').read())#打开依恋。attachment.add_header('Content-Disposition','attacment',filename='zhenjiang_power.csv')#重命名附件,第一个参数'Content-Disposition':内容设置,第二个参数:附件,第三个A参数:filenamemsg.attach(attachment)#在主体中添加附件登录邮件try:smtp=SMTP_SSL(host_server)#登录服务器smtp.set_debuglevel(1)#1是开启smtp调试,0禁用smtp.ehlo(host_server)#向服务器问候,表明身份smtp.login(sender_email,pwd)#输入用户名和密码登录发件人邮箱smtp.sendmail(sender_email,receivers,msg.as_string())#Email发生。参数:发件人,收件人,邮件正文smtp.quit()#Exitprint('发送成功')exceptsmtplib.SMTPException:#Catchexceptionprint('发送失败')说明:添加附件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\sampletest.xls','rb').read())#打开附件。绝对路径仍然是手动输入的。我直接复制的时候显示错误,但是手动发送成功了。4使用zmail接收邮件库:zmail需要安装pipinstallzmailimportzmailserver=zmail.server('1344732766@qq.com','dteqfmouzznhbaba')#输入账号和密码,QQ邮箱密码password就是获取到的授权码beforemail=server.get_latest()#获取最新邮件zmail.show(mail)#如果只想查看部分内容则查看邮件importzmailserver=zmail.server('1344732766@qq.com','******')#输入账号和密码,QQ邮箱密码password为之前获取的授权码mail=server.get_latest()#获取最新邮件print(mail['Subject'])将附件保存在emailtolocal参数mail:获取的邮件target_path:保存路径,None保存到工作目录文件夹overwrite:是否覆盖,如果有同名文件,是否覆盖zmail.save_attachment(mail,target_path=None,overwrite=True)结果电子邮件中的1个样本测试.xls保存到工作目录。5使用zmail发送电子邮件。用smtplib发送邮件的代码很复杂,直到今天人们仍然在这里遇到问题。而且代码复杂,解释起来很麻烦。今天给大家介绍一种新的邮件发送方式——zmailzmail的优势。自动填写标题信息并将字典映射到电子邮件。构造一封邮件相当于构造一个字典,自动查找邮件服务商的端口号地址,自动选择协议只依赖Python3importzmailMAIL={'subject':'testmail',#subject'content_text':'I不知道说什么,',#textcontent'attachments':['zhenjiang_power.csv','renwu.jpg'],#attachment}server=zmail.server("1344732766@qq.com","*********")#发件人邮箱和授权码server.send_mail("1344732766@qq.com",MAIL)6每天定时发邮件,她来了。#coding=utf-8importdatetimeimporttimeimportosdefchengxu():#把要启动的程序放在这个方法里os.system("pythonD:\\MachineLearning\\StudyDraft\\hm_003.py")#执行hm_003.pyfileos.system("pause")print("程序已经执行完毕!")defmain(h=10,m=40):whileTrue:now=datetime.datetime.now()print(now)#2020-08-0315:02:19.683783print(now.hour,now.minute)#152ifnow.hour==15andnow.minute==3:chengxu()#每60秒检测time.sleep(60)主要的()
