python自动化办公:邮件篇

准备工作

以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()

你可能感兴趣的:(python)