一、介绍

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会话并关闭连接
  1. import smtplib
  2. def prompt(prompt):
  3. return input(prompt).strip()
  4. ##寄件者的电子邮件邮箱
  5. fromaddr = prompt("From: ")
  6. ##收件者的电子邮件信箱
  7. toaddrs = prompt("To: ").split()
  8. print("Enter message, end with ^D (Unix) or ^Z (Windows):")
  9. # Add the From: and To: headers at the start!
  10. msg = ("From: %s\r\nTo: %s\r\n\r\n"% (fromaddr, ", ".join(toaddrs)))
  11. while True:
  12. try:
  13. line = input()
  14. except EOFError:
  15. break
  16. if not line:
  17. break
  18. msg = msg + line
  19. print("Message length is", len(msg))
  20. ##创建SMTP类的实例变量,指定SMTP服务器
  21. server = smtplib.SMTP('localhost')
  22. server.set_debuglevel(1)
  23. ##寄出电子邮件
  24. server.sendmail(fromaddr, toaddrs, msg)
  25. #关闭连接
  26. server.quit()

2.4 发生文本格式的邮件

  1. import smtplib
  2. ##指定SMTP服务器
  3. host = 'smtp.163.com'
  4. ##寄件者的电子邮件邮箱
  5. sender = 'lhuan@163.com'
  6. ##收件者的电子邮件信箱
  7. receipt = 'sanduo@163.com'
  8. ##电子邮件的内容
  9. msg = """
  10. 你好:
  11. 这是一个测试邮件
  12. """
  13. ##创建SMTP类的实例变量
  14. myServer = smtplib.SMTP(host)
  15. ##寄出电子邮件
  16. myServer.sendmail(sender,receipt,msg)
  17. ##关闭连接
  18. myServer.quit()

2.5 发送HTML 格式的邮件

  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.header import Header
  4. sender = 'larshuan@163.com'
  5. receives = ['1054052026@qq.com'] ##接收邮件,可设置为用户的QQ邮箱或者其他邮箱
  6. mail_msg = """
  7. <p>电子邮件内容</p>
  8. <p><a href="http://www.baidu.com">百度搜索</a></p>
  9. """
  10. message = MIMEText(mail_msg,'html','utf-8')
  11. message['From'] = Header('Python 语言','utf-8')
  12. message['To'] = Header('实例课堂','utf-8')
  13. subject = 'Python SMTP 邮件测试'
  14. message['Subject'] = Header(subject, 'utf-8')
  15. try:
  16. stmpObj = smtplib.SMTP('localhost')
  17. stmpObj.sendmail(sender,receives,message.as_string())
  18. print("邮件发送成功")
  19. except smtplib.SMTPException:
  20. print("Error: 无法发送邮件")

2.6 发送带附件的邮件

发送带附件的邮件,首先创建MIMEMultipart() 实例,然后构造附件,如果有多个附件,依次构造,然后利用smtplib.smtp发送

  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.mime.multipart import MIMEMultipart
  4. from email.header import Header
  5. sender = 'larshuan@163.com'
  6. receives = ['1054052026@qq.com'] ##接收邮件,可设置为用户的QQ邮箱或者其他邮箱
  7. #创建一个带附件的实例
  8. message = MIMEMultipart()
  9. message['From'] = Header('Python 语言','utf-8')
  10. message['To'] = Header('实例课堂','utf-8')
  11. subject = 'Python SMTP 邮件测试'
  12. message['Subject'] = Header(subject, 'utf-8')
  13. #邮件正文内容
  14. message.attach(MIMEText("这是Python 邮件发送测试……",'plain','utf-8'))
  15. #构造附件1,传送当前目录下的文件
  16. att1 = MIMEText(open('E:\\pythonstduy\\ex.html', 'rb').read(),'base64','utf-8')
  17. att1["Content-Type"]="application/octet-stream"
  18. ##filename为邮件中显示的名字
  19. att1["Content-Disposition"]='attachment; filename="ex.html"'
  20. message.attach(att1)
  21. ##构造附件2
  22. att2 = MIMEText(open('E:\\pythonstduy\\it.html', 'rb').read(),'base64','utf-8')
  23. att2["Content-Type"]="application/octet-stream"
  24. ##filename为邮件中显示的名字
  25. att2["Content-Disposition"]='attachment; filename="it.html"'
  26. message.attach(att2)
  27. try:
  28. smtpObj = smtplib.SMTP('localhost')
  29. smtpObj.sendmail(sender,receives,message.as_string())
  30. print("邮件发送成功")
  31. 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)

  1. 四、imaplib模块
  2. <a name="CTdLe"></a>
  3. ### 4.1 介绍
  4. 官方文档:[https://docs.python.org/3/library/imaplib.html](https://docs.python.org/3/library/imaplib.html)<br />Python的imaplib模块提供IAMP协议的客户端接口。
  5. <a name="tic36"></a>
  6. ### 4.2 使用
  7. imaplib模块定义一个IMAP4类,用于创建一个IMAP连接。<br />`class imaplib.IMAP4(host='', port=IMAP4_PORT, timeout=None)`<br />host是主机名称,port的默认值是163
  8. <a name="sTa3f"></a>
  9. ### 4.3 IMAP4对象的方法
  10. | 方法 | 说明 |
  11. | --- | --- |
  12. | IMAP4.append(mailbox, flags, date_time, message) | 将邮件追加到命名邮箱 |
  13. | IMAP4.authenticate(mechanism, authobject) | 验证命令-需要响应处理 |
  14. | IMAP4.check() | 服务器上的Checkpoint邮箱 |
  15. | IMAP4.close() | 关闭当前选择的邮箱 |
  16. | IMAP4.fetch(message_set, message_parts) | 取出消息 |
  17. | IMAP4.login(user, password) | 登录IMAP4服务器 |
  18. | IMAP4.search(charset, criterion[, ...]) | 搜索邮件邮箱找到符合的信息 |
  19. | IMAP4.select(mailbox='INBOX', readonly=False) | 选择一个邮件信箱 |
  20. | IMAP4.send(data) | 发送data到远程服务器 |
  21. | IMAP4.logout() | 注销IMAP4服务器,关闭连接 |
  22. ```python
  23. import imaplib,getpass,string
  24. host = 'imap.dummy.com'
  25. user = 'jonny'
  26. pwd = getpass.getpass()
  27. msgserver = imaplib.IMAP4(host)
  28. msgserver.login(user,pwd)
  29. msgserver.select()
  30. msqtyp,msgitems =msgserver.server(None,'ALL')
  31. for idx in string.split(msgitems[0]) :
  32. msqtyp,msgitems = msgserver.fetch(idx,"(RFC822)")
  33. print("Message %s\n"%num)
  34. print("---------------\n")
  35. print("Content:%s"%msgitems[0][1])
  36. msgserver.logout()