一、介绍
SMPT(Simple Mail Transfer Protocol)协议和POP3(Post Office Protocol)协议提供电子邮件服务。
SMPT协议是网络传输电子邮件的标准,定义应用程序如何在网络上交换电子邮件。
SMPT 负责将电子邮件放在电子邮箱中。从电子邮箱中取出电子邮件,需要POP3协议。
POP3协议负责从网络客户端读取邮件,并指定邮件服务器如何传输电子邮件,目的是存取远程的外部服务器。
IMAP(Internet Message Access Protocol)是读取邮件服务器的电子邮件与公布栏信息的方法,允许客户端的邮件程序存取远程的信息。
二、smtplib模块
2.1 介绍
官方文档:https://docs.python.org/3/library/smtplib.html
smtplib模块定义了一个SMTP客户端会话对象,该对象可用于通过SMTP或ESMTP侦听器守护程序将邮件发送到任何Internet机器。
2.2 使用
smtplib模块定义一个SMTP类,用于创建一个SMTP连接class smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None)
2.3 SMTP对象的方法
| 方法 | 说明 |
|---|---|
| SMTP.set_debuglevel(level) | 设置调试输出级别 1或True,用于所有消息发送到和从服务器接收的 2 导致这些消息带有时间戳 |
| SMTP.docmd(cmd, args=’’) | 将命令cmd发送到服务器 |
| SMTP.connect(host=’localhost’, port=0) | 连接到给定端口上的主机 端口的默认值为25 |
| SMTP.helo(name=’’) | 使用来识别SMTP服务器HELO |
| SMTP.ehlo(name=’’) | 使用来将自己标识为ESMTP服务器EHLO |
| SMTP.login(user, password, *, initial_response_ok=True) | 登录需要身份验证的SMTP服务器。 |
| SMTP.auth(mechanism, authobject, *, initial_response_ok=True) | 发出SMTP AUTH用于指定身份验证机制的命令 ,并通过authobject处理质询响应。 |
| SMTP.sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=()) | 发出电子邮件 from_addr:RFC 822 from-address string to_addrs: RFC 822 to-address strings msg:一个信息字符串 |
| SMTP.send_message(msg, from_addr=None, to_addrs=None, mail_options=(), rcpt_options=()) | send_message使用 with作为lineep序列化msg,并调用以传输结果消息。 |
| SMTP.quit() | 终止SMTP会话并关闭连接 |
import smtplibdef prompt(prompt):return input(prompt).strip()##寄件者的电子邮件邮箱fromaddr = prompt("From: ")##收件者的电子邮件信箱toaddrs = prompt("To: ").split()print("Enter message, end with ^D (Unix) or ^Z (Windows):")# Add the From: and To: headers at the start!msg = ("From: %s\r\nTo: %s\r\n\r\n"% (fromaddr, ", ".join(toaddrs)))while True:try:line = input()except EOFError:breakif not line:breakmsg = msg + lineprint("Message length is", len(msg))##创建SMTP类的实例变量,指定SMTP服务器server = smtplib.SMTP('localhost')server.set_debuglevel(1)##寄出电子邮件server.sendmail(fromaddr, toaddrs, msg)#关闭连接server.quit()
2.4 发生文本格式的邮件
import smtplib##指定SMTP服务器host = 'smtp.163.com'##寄件者的电子邮件邮箱sender = 'lhuan@163.com'##收件者的电子邮件信箱receipt = 'sanduo@163.com'##电子邮件的内容msg = """你好:这是一个测试邮件"""##创建SMTP类的实例变量myServer = smtplib.SMTP(host)##寄出电子邮件myServer.sendmail(sender,receipt,msg)##关闭连接myServer.quit()
2.5 发送HTML 格式的邮件
import smtplibfrom email.mime.text import MIMETextfrom email.header import Headersender = 'larshuan@163.com'receives = ['1054052026@qq.com'] ##接收邮件,可设置为用户的QQ邮箱或者其他邮箱mail_msg = """<p>电子邮件内容</p><p><a href="http://www.baidu.com">百度搜索</a></p>"""message = MIMEText(mail_msg,'html','utf-8')message['From'] = Header('Python 语言','utf-8')message['To'] = Header('实例课堂','utf-8')subject = 'Python SMTP 邮件测试'message['Subject'] = Header(subject, 'utf-8')try:stmpObj = smtplib.SMTP('localhost')stmpObj.sendmail(sender,receives,message.as_string())print("邮件发送成功")except smtplib.SMTPException:print("Error: 无法发送邮件")
2.6 发送带附件的邮件
发送带附件的邮件,首先创建MIMEMultipart() 实例,然后构造附件,如果有多个附件,依次构造,然后利用smtplib.smtp发送
import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.header import Headersender = 'larshuan@163.com'receives = ['1054052026@qq.com'] ##接收邮件,可设置为用户的QQ邮箱或者其他邮箱#创建一个带附件的实例message = MIMEMultipart()message['From'] = Header('Python 语言','utf-8')message['To'] = Header('实例课堂','utf-8')subject = 'Python SMTP 邮件测试'message['Subject'] = Header(subject, 'utf-8')#邮件正文内容message.attach(MIMEText("这是Python 邮件发送测试……",'plain','utf-8'))#构造附件1,传送当前目录下的文件att1 = MIMEText(open('E:\\pythonstduy\\ex.html', 'rb').read(),'base64','utf-8')att1["Content-Type"]="application/octet-stream"##filename为邮件中显示的名字att1["Content-Disposition"]='attachment; filename="ex.html"'message.attach(att1)##构造附件2att2 = MIMEText(open('E:\\pythonstduy\\it.html', 'rb').read(),'base64','utf-8')att2["Content-Type"]="application/octet-stream"##filename为邮件中显示的名字att2["Content-Disposition"]='attachment; filename="it.html"'message.attach(att2)try:smtpObj = smtplib.SMTP('localhost')smtpObj.sendmail(sender,receives,message.as_string())print("邮件发送成功")except smtplib.SMTPException:
三、poplib模块
3.1 介绍
官方文档:https://docs.python.org/3/library/poplib.html
Python的poplib模块提供POP3协议的客户端接口,用于从网络上接收电子邮件。
3.2 使用
poplib模块定义一个POP3类,用于创建一个POP3连接class poplib.POP3(host, port=POP3_PORT[, timeout])
host是主机名称,port的默认值是110
3.3 POP3对象的方法
| 方法 | 说明 |
|---|---|
| POP3.set_debuglevel(level) | 设置实例的调试级别 |
| POP3.getwelcome() | 返回POP3服务器发送的问候字符串 |
| POP3.capa() | 查询服务器功能 |
| POP3.user(username) | 发送用户命令,响应应指示要求输入密码 |
| POP3.pass_(password) | 发送密码,响应包括邮件数和邮箱大小 |
| POP3.apop(user, secret) | 使用更安全的APOP身份验证登录到POP3服务器 |
| POP3.rpop(user) | 使用RPOP身份验证(类似于UNIX r命令)登录POP3服务器 |
| POP3.stat() | 获取邮箱状态 |
| POP3.list([which]) | 请求消息列表 格式为:(response, [‘mesg_num octets’, …] response是响应信息 mesg_num的格式为(msg_id,size),msg_id是信息号码,size是信息的大小 |
| POP3.retr(which) | 检索整个消息号,返回信息号码which (response, [‘line’, …], octets) response是响应信息 line是信息的内容 octets是信息的大小 |
| POP3.dele(which) | 删除标志的消息号 |
| POP3.rset() | 删除邮箱的所有标记 |
| POP3.quit() | 提交更改,解锁邮箱,断开连接 |
```python
显示163.com 服务器内账号为xusanmiao,密码为123456的最后一个电子邮件的内容
import poplib,string
指定pop服务器
host = ‘saturn.seed.net.tw’
创建一个pop类的实例变量
myServer = poplib.POP3(host)
返回POP3服务器送出的欢迎字符串
print(myServer.getwelcome())
输入电子邮件的账号
myServer.user(“johnny”)
输入电子邮件的密码
myServer.pass_(“123456”)
返回信息列表
r,items,octets = myServer.list()
读取最后一个信息
msgid,size = string.split(items[-1])
返回最后一个信息号码的内容
r,items,octets = myServer.retr(msgid) msg = string.join(msg,”\n”)
打印最后一个信息号码的内容
print(msg)
四、imaplib模块<a name="CTdLe"></a>### 4.1 介绍官方文档:[https://docs.python.org/3/library/imaplib.html](https://docs.python.org/3/library/imaplib.html)<br />Python的imaplib模块提供IAMP协议的客户端接口。<a name="tic36"></a>### 4.2 使用imaplib模块定义一个IMAP4类,用于创建一个IMAP连接。<br />`class imaplib.IMAP4(host='', port=IMAP4_PORT, timeout=None)`<br />host是主机名称,port的默认值是163<a name="sTa3f"></a>### 4.3 IMAP4对象的方法| 方法 | 说明 || --- | --- || IMAP4.append(mailbox, flags, date_time, message) | 将邮件追加到命名邮箱 || IMAP4.authenticate(mechanism, authobject) | 验证命令-需要响应处理 || IMAP4.check() | 服务器上的Checkpoint邮箱 || IMAP4.close() | 关闭当前选择的邮箱 || IMAP4.fetch(message_set, message_parts) | 取出消息 || IMAP4.login(user, password) | 登录IMAP4服务器 || IMAP4.search(charset, criterion[, ...]) | 搜索邮件邮箱找到符合的信息 || IMAP4.select(mailbox='INBOX', readonly=False) | 选择一个邮件信箱 || IMAP4.send(data) | 发送data到远程服务器 || IMAP4.logout() | 注销IMAP4服务器,关闭连接 |```pythonimport imaplib,getpass,stringhost = 'imap.dummy.com'user = 'jonny'pwd = getpass.getpass()msgserver = imaplib.IMAP4(host)msgserver.login(user,pwd)msgserver.select()msqtyp,msgitems =msgserver.server(None,'ALL')for idx in string.split(msgitems[0]) :msqtyp,msgitems = msgserver.fetch(idx,"(RFC822)")print("Message %s\n"%num)print("---------------\n")print("Content:%s"%msgitems[0][1])msgserver.logout()
