Python收发邮件
- 发送邮件使用SMTP协议,接受POP3或IMAP;
- 创建邮件内容email模块,发送邮件smtplib模块。发送邮件比较简单,只需先创建SMTP对象,登录服务器后根据发收邮箱地址发送即可;
- POP3接受邮件poplib模块,接收到的是原始邮件,需经email模块解析成为能阅读的邮件
- IMAP接收邮件imaplib模块。
- 收发邮件都比较简单,相反,麻烦的是构造邮件以及解析邮件,因为邮件内容的形式可以有多种多样(纯文本、HTML、图片、附件等)
1,电子邮件发送流程:
使用邮件用户代理(客户端)编辑收取email,在一封email的传输过程中,其首先由客户端发送到email服务的提供商(如网易、Google、qq)的服务器上(MTA),不同的提供商之间的MTA进行传输,最终将该email发到收件人邮箱的MTA上,再经由MTA投递到邮件投递代理MDA上,它就像小区的邮箱,email就静静的躺在提供商的服务器里,等待用户使用MUA来对这封email进行处理。
MUA -> MTA ->....-> MTA -> MDA -> MUA
对于MTA、MDA以及他们的实现方式,是邮件服务提供商提供的服务器,他们的实现相当于电子邮件的基础设施,邮局以及邮局工作人员一样的存在。我们关心的是在MUA上编辑邮件将它发送出去以及从MDA上收取邮件的过程。
发邮件时,MUA和MTA使用的是SMTP:Simple Mail Transfer Protocol。发送邮件前,需要配置SMTP服务器,即指明你要发送到哪个MTA服务器上,同时,需要提供用户名及密码来进行用户认证。
收邮件时,MUA和MDA使用的协议是POP3:Post Office Protocol,以及IMAP:Internet Message Access Protocol。收邮件是也需要提供用户名密码来认证。
2,SMTP发送邮件
email模块构造邮件,smtplib模块发送邮件
1)email构造邮件(邮件内容、收发件人、主题等)
查看email文档:https://docs.python.org/3/library/email.mime.html
2)smtplib发送邮件到SMTP服务器
查看smtplib文档:https://docs.python.org/3/library/smtplib.html
- class
smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None) - class
smtplib.SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, certfile=None, [timeout, ]context=None, source_address=None) - class
smtplib.LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None)
from email.header import Header
from email.mime.text import MIMEText
import smtplib from_addr = '...@qq.com'
password = '...' # qqSMTP服务授权码
to_addr = '...'
smtp_server = 'smtp.qq.com'# SMTP服务器地址
smtp_port = 465 # 构造文本邮件
msg = MIMEText('MIMEText对象构造的是纯文本邮件对象,类型为plain', 'plain', 'utf-8')
msg['From'] = '...'
msg['To'] = '...'
msg['Subject'] = Header('主题', 'utf-8').encode() # 发送邮件
try:
# server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25 !错误
server = smtplib.SMTP_SSL(smtp_server, smtp_port)
server.set_debuglevel(1) # 打印和SMTP服务器交互的所有信息
server.login(from_addr, password) # 登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) # 发邮件
server.quit()
except:
print('出错了!!!')
3,POP接收邮件
POP3协议收取的是邮件的原始文本,不能直接阅读,(SMTP协议发送的也是经编码后的一段文本)。需要使用email模块提供的类解析原始文本,才能变成可阅读的邮件。
1)poplib收取邮件的原始文本下载到本地
查看poplib文档:https://docs.python.org/3/library/poplib.html
POP3类:提供到POP3服务器的连接,并实现了POP协议
POP3_SSL类:支持到POP3服务器的连接,并以SSL为基础协议层(SSL加密socket)
note:POP3逐渐被淘汰(?),质量不佳。所以如果邮件服务支持IMAP,建议使用imaplib.IMAP4类,因为IMAP服务实现的更棒。
- class
poplib.POP3(host, port=POP3_PORT[, timeout]) 标准POP3端口-110 - class
poplib.POP3_SSL(host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None, context=None)
from email.parser import Parser
import poplib # 邮件地址, 口令和POP3服务器地址:
email = '...@qq.com '
password = '...'
pop3_server = 'pop.qq.com'
# 连接到POP3服务器:
server = poplib.POP3_SSL(pop3_server)
server.set_debuglevel(1) # 调试信息
# 身份认证:
server.user(email)
server.pass_(password) # stat()返回(邮件数量,占用空间)
print('Messages: %s. Size: %s' % server.stat())
# list()返回所有邮件的编号: (response, ['mesg_num octets', ...], octets)
resp, mails, octets = server.list()
# 查看返回的列表,类似 [b'1 4482', b'2 23956', ...]
print(mails) # 获取最新一封邮件, 注意索引号从1开始:
index = len(mails)
resp, lines, octets = server.retr(index) # lines存储邮件的原始文本的每一行
# 获得整个邮件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8') # 解析出邮件: 把邮件文本解析成Message对象,还需要更多内容...
msg = Parser().parsestr(msg_content) # 关闭连接:
server.quit()
2)email解析原始文本
4,IMAP接收邮件
查看imaplib文档:https://docs.python.org/3/library/imaplib.html
使用QQ邮箱时,收发邮件的登录密码都要使用SMTP/POP/IMAP服务的授权码,同时在建立与服务器的连接时,使用SMTP_SSL / POP3_SSL对象而不能是SMTP / POP3。
Python收发邮件的更多相关文章
- 转--python -- 收发邮件
官方 import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮箱服务器 smt ...
- python收发邮件的方法
def acptmail(): email = 'xxx@163.com' #input('Email:') password = 'xxx' #input('Password: ') pop3_se ...
- 使用python的email、smtplib、poplib模块收发邮件
使用python的email.smtplib.poplib模块收发邮件 一封电子邮件的旅程是: MUA:Mail User Agent——邮件用户代理.(即类似Outlook的电子邮件软件) MTA: ...
- python的email、smtplib、poplib模块收发邮件
一封电子邮件的旅程是: MUA:Mail User Agent--邮件用户代理.(即类似Outlook的电子邮件软件) MTA:Mail Transfer Agent--邮件传输代理,就是那些Emai ...
- python SMTP邮件发送(转载)
Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...
- python发邮件遇到的端口号问题
在学习使用python发邮件的过程中, 遇到了一个问题:由于测试的时候使用的是QQ邮箱,要求必须使用SSL/TLS加密,所以有了下面的代码, from email.mime.text import M ...
- DouNet学习_收发邮件
一.收发邮件 --->第一步:发邮件首先要有发送者的邮箱地址和登录的密码才能发送 这些都写在APP里 不要写死 --->第二步:发邮件就要有网络,要添加net.Mail命名空间 要发送的 ...
- 使用python发邮件
使用python发邮件 网上有很多发邮件的例子,本人在网上找了一份,稍加修改后使用 上源码 # encoding=utf-8 from email.mime.image import MIMEImag ...
- Outlook Express 收发邮件出现"0x800CCC0F"错误代码解决方法
非常多网友在使用Outlook Express收发邮件的过程中,有时能够发送邮件,但出现不能接收信件的问题.每次在收邮件都会在某个地方停止不动,然后报超时,出现错误代码0x800CCC19或0x800 ...
随机推荐
- Linux环境——MySQL安装及配置(5.7版本)
数据库安装包下载地址:https://dev.mysql.com/downloads/mysql/ 我的环境是Linux Red Hat Enterprlse Linux (64位),本次安装的是M ...
- bzoj 2286: [Sdoi2011]消耗战 虚树+树dp
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 在一 ...
- JVM垃圾回收(四)- GC算法:实现(1)
GC算法:实现 上面我们介绍了GC算法中的核心概念,接下来我们看一下JVM里的具体实现.首先必须了解的一个重要的事实是:对于大部分的JVM来说,两种不同的GC算法是必须的,一个是清理Young Gen ...
- Failed to find configured root that contains
这个主要问题是在android系统下7.0 拍照时,Android提供FileProvider类来供应用之间共享数据. 出现这个问题多为xml文件 path 类型和代码中调用的类型不同导致的 以下为多 ...
- JavaScript中全局变量和局部变量的不同
今天看到大神写得一片文章,自己对全局变量和局部变量的理解还是不够深刻,因此写到这篇文章,做个总结. 大神代码截图+理解文字如下: 解析:上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全 ...
- A*算法介绍
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...
- ASP.NET MVC 简单介绍①
ASP.NET MVC 简单介绍① 只做了重要描述,内容出自菜鸟教程网站内容. 目录 1布局 2HTML 帮助器 3.Razor 语法 4.添加样式 5.Layout 6. Controllers ...
- jquery横向纵向鼠标滚轮全屏切换
html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF- ...
- The innodb_system data file 'ibdata1' must be writable
在安装MySQL的时候报的错,我理解的这个错是因为有个文件是Innodb需要在安装MySQL(或者创建数据库的时候)的时候需要写入这个文件,但是他现在没有写的权限. 日志中的错误是: 5.7版本以前是 ...
- npm run build 打包后,如何运行在本地查看效果(Nginx服务)
这段时间,研究了一下vue 打包的很慢的问题.但是当我 npm run build 打包后,在本地查看效果的时候,活生生被我老大鄙视了,因为我打开了XAMPP.他说:你怎么不用Nginx啊?用这个一堆 ...