一、发送电子邮件

1.1、SMTP发送电子邮件

Python标准库提供了smtplib模块,用于实现SMTP协议,发送邮件。标准库还提供了email模块帮助我们构造邮件格式。
SMTP(Simple Mail Transfer Protocol,即简单邮件传输协议),是一组由源地址到目的地址传送邮件的规则,用来控制信件的中转方式。
Python的smtplib提供了一种发送电子邮件的方便途径,它会SMTP协议进行了简单的封装。

Python创建SMTP对象的语法为:

smtpObj = smtplib.SMTP([host [,port [,local_hostname]]])

参数说明:

  • host:SMTP服务器主机,是可选参数。可以指定主机的IP地址或者域名,如:smtp.exmail.qq.com;
  • port:如果提供了host参数,就需要指定SMTP服务使用的端口号,一般情况下SMTP的端口号为25;
  • local_hostname:如果SMTP在自己的本机上,则只需要指定服务器地址为localhost即可;

Python SMTP对象使用sendmail方法发送邮件,语法如下:

SMTP.sendmail(from_addr,to_addrs,msg[,mail_options,rcpt_options])

参数说明:

  • from_addr:邮件发送地址;
  • to_addr:字符串列表,邮件接收地址;
  • msg:发送消息,一般使用字符串

预备工作:开启SMTP和POP3服务,获取授权码

使用QQ邮箱发送邮件需要开启SMTP服务和POP3服务,SMTP协议用于发送邮件,POP3协议用于接收邮件,授权码用于连接到服务器。

1、登录邮箱->设置->账户

2、按要求发送短信验证,开启服务

3、开启服务之后就得到了授权码,此授权码不需要记,忘记了就关闭服务再开启服务即可

4、开启服务转态,如下图

import smtplib
from email.mime.text import MIMEText
from email.header import Header#邮箱用户名
sender = "1178277540@qq.com"
#邮箱授权码
license = "ducdjgclcisahjdc"
#收件人
receicer = ["364336543@qq.com","wang_jc@126.com"]#邮件正文
message = MIMEText("赳赳老秦,共赴国难!","plain","utf-8")#发件人显式的名字
message["From"] = Header("嬴师隰","utf-8")#收件人显式的名字
message["To"] = Header("嬴渠梁","utf-8")#邮件标题
message["Subject"] = "一统天下"try:smtp = smtplib.SMTP_SSL("smtp.qq.com",465)#登录smtp.login(sender,license)#发送smtp.sendmail(sender,receicer,message.as_string())print("邮件已发送")
except smtplib.SMTPException as e:print("Error! 发送失败",e)


1.2、发送HTML格式的电子邮件

发送HTML格式的邮件,只要在使用MIMEText函数构造邮件消息体的时候将第二个参数指定格式为“html”即可。

import smtplib
from email.mime.text import MIMEText
from email.header import Header#邮箱用户名
sender = "1178277540@qq.com"
#邮箱授权码
license = "ducdjgclcisahjdc"
#收件人
receicer = ["364336543@qq.com","wang_jc@126.com"]#邮件正文
mail_msg = """
<h1>秦孝公招贤令</h1>
<p>昔我缪公自岐雍之间,修德行武。东平晋乱,以河为界。西霸戎翟,广地千里。天子致伯,诸侯毕贺,为后世开业,甚光美。</br>
会往者历、躁、简公、出子子不宁,国家内忧,未遑外事,三晋夺我先君河西地,诸侯卑秦,丑莫大焉。</br>
献公即位,镇抚边境,徙治栎阳,且欲东伐,复缪公之故地,修缪公之政令。寡人思念先君之意,常痛于心。宾客群臣有能出奇计强秦者,吾为尊官,与之分土。</p>
"""
message = MIMEText(mail_msg,"html","utf-8")#发件人显式的名字
message["From"] = Header("嬴渠梁","utf-8")#收件人显式的名字
message["To"] = Header("六国士子","utf-8")#邮件标题
message["Subject"] = "幕贤强秦"try:smtp = smtplib.SMTP_SSL("smtp.qq.com",465)#登录smtp.login(sender,license)#发送smtp.sendmail(sender,receicer,message.as_string())print("邮件已发送")
except smtplib.SMTPException as e:print("Error! 发送失败",e)


1.3、发送带附件的邮件

附件其实就是另一种格式的MIME,所以在构造邮件消息体的时候需要使用MIMEMultipart来构造复合类型的消息体,然后把文本和附件一个一个地加进去。

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header#邮箱用户名
sender = "1178277540@qq.com"
#邮箱授权码
license = "ducdjgclcisahjdc"
#收件人
receicer = ["364336543@qq.com","wang_jc@126.com"]#指定消息体使用复合类型
message = MIMEMultipart()#邮件正文
mail_msg = """
<h1>秦孝公招贤令</h1>
<p>昔我缪公自岐雍之间,修德行武。东平晋乱,以河为界。西霸戎翟,广地千里。天子致伯,诸侯毕贺,为后世开业,甚光美。</br>
会往者历、躁、简公、出子子不宁,国家内忧,未遑外事,三晋夺我先君河西地,诸侯卑秦,丑莫大焉。</br>
献公即位,镇抚边境,徙治栎阳,且欲东伐,复缪公之故地,修缪公之政令。寡人思念先君之意,常痛于心。宾客群臣有能出奇计强秦者,吾为尊官,与之分土。</p>
"""message.attach(MIMEText(mail_msg,"html","utf-8"))#添加附件
attached_file = MIMEText(open(__file__,encoding="utf-8").read(),"base64","utf-8")
#指定附件的文件名可以和原先的不一样
attached_file["Content-Disposition"] = 'attachment;filename="main.py"'
message.attach(attached_file)#发件人显式的名字
message["From"] = Header("嬴渠梁","utf-8")#收件人显式的名字
message["To"] = Header("六国士子","utf-8")#邮件标题
message["Subject"] = "一统天下"try:smtp = smtplib.SMTP_SSL("smtp.qq.com",465)#登录smtp.login(sender,license)#发送smtp.sendmail(sender,receicer,message.as_string())print("邮件已发送")
except smtplib.SMTPException as e:print("Error! 发送失败",e)


1.4、发送图片

我们都知道HTML网页可以嵌入诸如图片、视频等元素,自然在HTML格式的邮件中也可以嵌入这些内容,但是效果不好,因为大部分的邮件客户端和服务商都会屏蔽邮件正文的外部资源,像网页中的图片或者视频、音频等都是外部资源。

如果我们需要发送图片,只需把图片作为附件添加到邮件消息体中,然后在HTML格式的正文中使用src=cid:img1格式嵌入即可。

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#邮箱用户名
sender = "1178277540@qq.com"
#邮箱授权码
license = "ducdjgclcisahjdc"
#收件人
receicer = ["364336543@qq.com","wang_jc@126.com"]#指定消息体使用复合类型
message = MIMEMultipart("related")#邮件正文
msg_content = MIMEMultipart("alternative")mail_msg = """
<h1>秦孝公招贤令</h1>
<p>昔我缪公自岐雍之间,修德行武。东平晋乱,以河为界。西霸戎翟,广地千里。天子致伯,诸侯毕贺,为后世开业,甚光美。</br>
会往者历、躁、简公、出子子不宁,国家内忧,未遑外事,三晋夺我先君河西地,诸侯卑秦,丑莫大焉。</br>
献公即位,镇抚边境,徙治栎阳,且欲东伐,复缪公之故地,修缪公之政令。寡人思念先君之意,常痛于心。宾客群臣有能出奇计强秦者,吾为尊官,与之分土。</p>
"""msg_content.attach(MIMEText(mail_msg,"html","utf-8"))
message.attach(msg_content)#添加图片
with open("winterfall.jpg","rb") as f:img1 = MIMEImage(f.read())#定义资源的名字为img1
img1.add_header("Contend-ID","img1")
message.attach(img1)#发件人显式的名字
message["From"] = Header("嬴渠梁","utf-8")
#收件人显式的名字
message["To"] = Header("六国士子","utf-8")
#邮件标题
message["Subject"] = "一统天下"try:smtp = smtplib.SMTP_SSL("smtp.qq.com",465)#登录smtp.login(sender,license)#发送smtp.sendmail(sender,receicer,message.as_string())print("邮件已发送")
except smtplib.SMTPException as e:print("Error! 发送失败",e)


二、接收电子邮件

接收邮件有两种常用的协议:POP3和IMAP协议

POP3协议:POP3协议(Post Office Protocol-Version 3,即邮局协议版本3)允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等)不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其它文件夹,邮件服务器上的这些邮件不会被同时移动。

IMAP协议:IMAP协议(Internet Mail Acess Protocol,即Internet邮件访问协议)提供Webmail与电子邮件客户端之间的双向通信,任何在客户端做的改变都会同步到服务器上。在客户端对邮件进行了操作,服务器上的邮件也会进行相应的操作。

同时,IMAP协议像POP3协议一样,提供了方便的邮件下载服务,让用户能够进行离线阅读。IMAP协议提供的摘要浏览功能可以让你在阅读完所有的邮件信息(到达时间、主题、发件人、大小等)后才作出是否下载的决定。此外,IMAP协议能更好地支持在多个不同设备上随时访问新邮件的功能。

2.1、使用POP3协议下载邮件

import poplib
from email.parser import Parser#登录邮箱的用户名
username = "1178277540@qq.com"
#登录邮箱的密码
password = "ducdjgclcisahjdc"#连接邮箱服务器
pop_server = poplib.POP3_SSL("pop.qq.com",995)#打印出邮箱服务器的欢迎文字
print(pop_server.getwelcome().decode("utf-8"))#登录邮箱服务器
pop_server.user(username)
pop_server.pass_(password)#打印出当前账号的状态,第一个返回值为邮件数,第二个返回值为占用空间
print("Server stat",pop_server.stat())#获取所有邮件列表
resp,mails,octets = pop_server.list()
print(mails)#获取最新的一封邮件(序号最大的),邮件索引从1开始计数
index = len(mails)
resp,lines,octets = pop_server.retr(index)msg_content = b'\r\n'.join(lines).decode("utf-8")
#解析出邮件
msg = Parser().parsestr(msg_content)
print(msg)
#可以根据邮件索引号直接从服务器删除邮件
pop_server.dele(index)
#关闭连接
pop_server.quit()

2.2、使用IMAP协议下载邮件

import imaplib
import email#登录邮箱的用户名
username = "1178277540@qq.com"
#登录邮箱的密码
password = "ducdjgclcisahjdc"#连接邮箱服务器
imap_server = imaplib.IMAP4_SSL("imap.qq.com",993)#登录邮箱服务器
imap_server.login(username,password)print("===============LOG===============")
imap_server.print_log()
print("=================================")#获取邮箱目录
resp,data = imap_server.list()
print(data)#选择默认收件箱并打印邮件数量
res,data = imap_server.select('INBOX')
print(res,data)
print(data[0])#获取最新的一封邮件
typ,lines = imap_server.fetch(data[0],'(RFC822)')#解析出邮件
msg = email.message_from_string(lines[0][1].decode("utf-8"))#关闭连接
imap_server.close()

2.3、解析邮件

import poplib
from email.parser import Parser
from email.header import Header
from email.utils import parseaddr#登录邮箱的用户名
username = "1178277540@qq.com"
#登录邮箱的密码
password = "ducdjgclcisahjdc"#连接邮箱服务器
pop_server = poplib.POP3_SSL("pop.qq.com",995)#打印出邮箱服务器的欢迎文字
print(pop_server.getwelcome().decode("utf-8"))#登录邮箱服务器
pop_server.user(username)
pop_server.pass_(password)#打印出当前账号的状态,第一个返回值为邮件数,第二个返回值为占用空间
print("Server stat",pop_server.stat())#获取所有邮件列表
resp,mails,octets = pop_server.list()
print(mails)#获取最新的一封邮件(序号最大的),邮件索引从1开始计数
index = len(mails)
resp,lines,octets = pop_server.retr(index)msg_content = b'\r\n'.join(lines).decode("utf-8")
#解析出邮件
msg = Parser().parsestr(msg_content)
print(msg)
#可以根据邮件索引号直接从服务器删除邮件
pop_server.dele(index)
#关闭连接
pop_server.quit()def decode_email(s):if not s:return ""value,charset = decode_header(s)[0]if charset:value = value.decode(charset)return value#打印邮件的发送人、接收人和主题mail_from = msg.get("From","")
hdr,mail_from_addr = parseaddr(mail_from)
mail_from_name = decode_email(hdr)
print("发件人",mail_from_name,mail_from_addr)mail_to = msg.get("To","")
hdr,mail_to_addr = parseaddr(mail_to)
mail_to_name = decode_email(hdr)
print("收件人",mail_to_name,mail_from_addr)subject = decode_email(msg.get("Subject",""))
print("主题","")#递归解析邮件
def decode_mime(msg):if msg.is_multipart():parts = msg.get_payload()for part in parts:print(decode_mime(part))else:content_type = msg.get_content_type()if content_type in ("text/plain","text/html"):content = msg.get_payload(decode=True)print(content)else:print("Attachement",content_type)decode_mime(msg)

Python--邮件处理相关推荐

  1. python邮件发送脚本

    转自:http://phinecos.cnblogs.com/ 1 #!/usr/bin/python 2 #coding=utf-8 3 4 #@author:dengyike 5 #@date:2 ...

  2. python邮件发送和正则表达式(1)

    python邮件发送和正则表达式 一. 邮件发送 1. 开通邮箱SMTP服务,并获取 授权码 这个账户是你要使用此邮箱发送邮件的账户,密码不是平时登录邮箱的密码,而是开通 POP3/SMTP 功能后设 ...

  3. Python邮件发送SMATP模块详细总结(含qq邮箱及163邮箱服务开启及授权码获取,多附件发送)

    Python实现电子邮件发送 在生活中或许我们多数都在用微信或者是QQ,但是工作中就会涉及邮件了,我也是最近在工作中用到了,所以找了些资料,有的较为完备有的就特别零散,所以自己也来整理分享一下.这里主 ...

  4. python邮件定时发送短信_python实现自动定时给女朋友发手机短信,每天一个笑话!...

    加小编QQ群:832339352 即可自动获取大量Python视频教程以及各类PDF! 大四的生活就是这么无聊,我琢磨着也学了这么多东西了,为啥不能用自己的知识来给生活找点乐子呢?我想反正每天都要给T ...

  5. python邮件自动发送_使用python,通过腾讯企业邮件自动发送邮件

    今天试了一下用python自动发送邮件,已经成功. 前期设置 在发送邮件前,先要去腾讯企业邮箱设置一下:获取到授权码. 步骤为: 1.打开企业邮箱,点击设置->安全 2.关联微信 3.启用客户端 ...

  6. python邮件发送哪个好_最全总结!聊聊 Python 发送邮件的几种方式

    1. 前言 邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到 我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本.富文本.HTML 等格式的邮件 本文将聊聊利用 Python ...

  7. python邮件转发_把Gmail邮件转发到gtalk的Python方法

    用Python方法把Gmail邮件转发到gtalk有多难,想知道gmail如何转发邮件?gmail自动转发已收到邮件的设置方法.本文就来把这段详细的python学习参考代码贴出来,大家一起参考下吧. ...

  8. python邮件发送哪个好_python发邮件(一)

    复习模块 如果我们要发送邮件,就需要用到smtplib模块的以下方法: 1.import smtplib       #引入smtplib模块 2.server = smtplib.SMTP()    ...

  9. python邮件图片加密软件_用Python发一封图文并茂的邮件

    最近使用了不少通讯工具的接口, 比如企业微信机器人,钉钉,微信公众号的接口(未认证的订阅公众号),相对于邮件来说,它们的表现形式太弱.比如没有更丰富的版本方式.当然了,并不是说表现形式越棒就是约好的通 ...

  10. python提醒事件_监控服务器空间使用情况-crontab+python邮件提醒

    crontab + sendmail.py 脚本实现对服务器的空间使用情况监控,代码拙劣,凑合看吧. #!/usr/bin/python # -*- coding: utf-8 -*- import ...

最新文章

  1. Solaris 10 系统维护
  2. 【 C 】关于变量、地址、指针变量等关系的一点思考
  3. 为什么工作10年你的工资还不如新来的实习生
  4. Android模拟器Genymotion安装apk
  5. VTK:细胞定位器可视化用法实战
  6. web.xml中的ContextLoaderListener和DispatcherServlet区别
  7. BTrace是一个非常不错的java诊断工具
  8. 前端学习(2692):重读vue电商网站13之使用动态编辑标签
  9. 浅谈jQuery的选择器
  10. mysql导出(导入)数据库window平台
  11. 安卓手机电子书阅读器的使用体验及对比
  12. ZooKeeper(3.4.5) - 配置伪集群模式
  13. 大幅提高Android开发效率之TemplateBuilder
  14. MATLAB线性回归
  15. ssh:connect to host localhost port 22: Connection refused解决方法
  16. H.266/VVC相关技术学习笔记18:帧间预测中的AMVR技术(自适应运动适量精度)
  17. 齐岳合成黄光磷光材料Ir(CzPPya)3|Eu(TAA)3(apt)Ho(TAA)3(apt)
  18. halcon中放大图片
  19. latex 矩阵分块(block matrix)
  20. HDMI2.0RE驱动控制方案AG7120和AG7220性能参数对比

热门文章

  1. 2022天梯赛 L1-087 机工士姆斯塔迪奥
  2. 最大公约数用c语言表达,c语言求最大公约数(用c语言编写求最大公约数)
  3. 简述改变计算机桌面背景的方法,怎么设置和更改桌面背景
  4. 爬取实习僧并进行数据可视化
  5. python3学习笔记---类
  6. 微信扫码下载APK遮罩提示示例
  7. DNS错误不能上网怎么办?电脑dns错误修复方法?
  8. RS编译码理论介绍与MATLAB性能仿真
  9. 计算机wap怎么制作表格,如何在电脑上制作简单的表格?
  10. shell grep正则匹配汉字