本文知识框架引用自《零基础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 = "[email protected]"
#邮箱授权码
password = "xxxxxx"
#收件人
receiver = "[email protected]"
#邮件正文
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邮箱的账户页面中获取。
获取方法可参考:http://t.csdn.cn/znEwz
前面例子中的邮件发送方式只能发送纯文本格式,HTML则可以发送类型更丰富的邮件
发送HTMP格式的邮件很简单,只需要在使用MIMEText函数时将第二个参数设置为“html”
代码显示如下:
import smtplib
#模块导入
from email.mime.text import MIMEText
from email.header import Header
#邮箱用户名
sender = "[email protected]"
#邮箱授权码
password = "xxxxx"
#收件人
receiver = "[email protected]"
#邮件正文
mail_msg = """
使用Python发送邮件
"""
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 = "[email protected]"
#邮箱授权码
password = "xxx"
#收件人
receiver = "[email protected]"
#指定复合类型消息体
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协议下用户在客户端做的任何改变都会在服务器上同步。
下面分别介绍这两种协议的使用方法:
步骤详细解析可参考:http://t.csdn.cn/WIvPs
import poplib
#模块导入
from email.parser import Parser
#登录邮箱用户名
username = "[email protected]"
#登录邮箱授权码
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 = "[email protected]"
#登录邮箱授权码
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()