赞
踩
本文知识框架引用自《零基础Python:从入门到精通》
Python标准库提供了smtplib模块,用于实现SMTP协议,发送邮件。
Python创建SMTP对象的语法为:
smtpObj = smtplib.SMTP([host [, port [, local_hostname]]])
参数说明:
PythonSMTP对象使用sendmail方法发送邮件的语法为:
SMTP.sendmail(from_addr,to_addrs,msg [, mail_options, rcpt_options])
参数说明:
使用上述方法发送邮件如下:
- import smtplib
-
- #模块导入
- from email.mime.text import MIMEText
- from email.header import Header
-
- #邮箱用户名
- sender = "xxx@qq.com"
- #邮箱授权码
- password = "xxxxxx"
- #收件人
- receiver = "xxxx@qq.com"
-
- #邮件正文
- message = MIMEText("使用Python发送邮件","plain","utf-8")
-
- #发件人的名字
- message["From"] = Header("Kiku","utf-8")
- #收件人名字
- message["To"] = Header("Tian","utf-8")
- #邮件标题
- message["Subject"] = "Python发送邮件测试"
-
- try:
- #使用QQ邮箱发送
- smtp = smtplib.SMTP_SSL("smtp.qq.com",465)
- #登录邮箱
- smtp.login(sender,password)
- #发送邮件
- smtp.sendmail(sender,receiver,message.as_string())
- print("邮件已发送!")
- except smtplib.SMTPException as e:
- print("Error!发送失败",e)
-
注意:邮箱授权码不是密码,需要在QQ邮箱的账户页面中获取。
前面例子中的邮件发送方式只能发送纯文本格式,HTML则可以发送类型更丰富的邮件
发送HTMP格式的邮件很简单,只需要在使用MIMEText函数时将第二个参数设置为“html”
代码显示如下:
- import smtplib
-
- #模块导入
- from email.mime.text import MIMEText
- from email.header import Header
-
- #邮箱用户名
- sender = "xxx@qq.com"
- #邮箱授权码
- password = "xxxxx"
- #收件人
- receiver = "xxx@qq.com"
-
- #邮件正文
- mail_msg = """
- <p>使用Python发送邮件
- <br>
- <p><a href="http://www.baidu.com">这是一个超链接</p>
- """
- message = MIMEText(mail_msg,"html","utf-8")
-
- #发件人的名字
- message["From"] = Header("Kiku","utf-8")
- #收件人名字
- message["To"] = Header("Tian","utf-8")
- #邮件标题
- message["Subject"] = "Python发送邮件测试"
-
- try:
- #使用QQ邮箱发送
- smtp = smtplib.SMTP_SSL("smtp.qq.com",465)
- #登录邮箱
- smtp.login(sender,password)
- #发送邮件
- smtp.sendmail(sender,receiver,message.as_string())
- print("邮件已发送!")
- except smtplib.SMTPException as e:
- print("Error!发送失败",e)
-
附件实际上时另一种格式的MIMEText,所以构造邮件消息体时需要使用MIMEMultipart来构造复合类型的消息体,然后加入文本和附件,其次要用MIMEApplication指定文件类型。
代码显示如下:
- import smtplib
-
- #模块导入
- from email.mime.text import MIMEText
- from email.mime.multipart import MIMEMultipart
- from email.mime.application import MIMEApplication
- from email.header import Header
-
- #邮箱用户名
- sender = "xxx@qq.com"
- #邮箱授权码
- password = "xxx"
- #收件人
- receiver = "xxx@qq.com"
-
- #指定复合类型消息体
- message = MIMEMultipart()
- #发件人的名字
- message["From"] = Header("Kiku","utf-8")
- #收件人名字
- message["To"] = Header("Tian","utf-8")
- #邮件标题
- message["Subject"] = "Python发送邮件测试"
-
- #邮件正文
- mail_msg = MIMEText('hello, this is email content.')
- message.attach(mail_msg)
-
- #添加附件
- zipFile = "D:\桌面\数据结构.zip"
- zipApart = MIMEApplication(open(zipFile,'rb').read())
- zipApart.add_header('Content-Disposition','attachment',filename=zipFile)
- message.attach(zipApart)
-
- try:
- #使用QQ邮箱发送
- smtp = smtplib.SMTP_SSL("smtp.qq.com",465)
- #登录邮箱
- smtp.login(sender,password)
- #发送邮件
- smtp.sendmail(sender,receiver,message.as_string())
- print("邮件已发送!")
- except smtplib.SMTPException as e:
- print("Error!发送失败",e)
-
注意:
接收邮件有两种常用的协议:POP3和IMAP协议,两者最大的区别就是POP3协议下用户在客户端的操作不会反馈到服务器上,二IMAP协议下用户在客户端做的任何改变都会在服务器上同步。
下面分别介绍这两种协议的使用方法:
- import poplib
-
- #模块导入
- from email.parser import Parser
-
- #登录邮箱用户名
- username = "xxx@qq.com"
- #登录邮箱授权码
- password = "xxx"
-
- #连接邮箱服务器
- 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)
- #获取最新一封邮件
- 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)
- #根据索引号直接删除邮件
- pop_server.dele(index)
- #关闭连接
- pop_server.quit()
如果能连接邮箱并且列出邮件数量,说明代码正确。
- import imaplib
- import email
-
-
- #登录邮箱用户名
- username = "xxx@qq.com"
- #登录邮箱授权码
- password = "xxxx"
-
- #连接邮箱服务器
- 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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。