Python程序设计——邮件处理

本文知识框架引用自《零基础Python:从入门到精通》

一、发送电子邮件

1.SMTP发送电子邮件

Python标准库提供了smtplib模块,用于实现SMTP协议,发送邮件。

Python创建SMTP对象的语法为:

smtpObj = smtplib.SMTP([host [, port [, local_hostname]]])

参数说明:

  • host:SMTP服务器主机,是可选参数。可指定主机IP地址,如:smtp.qq.com
  • port:指定SMTP服务所需的端口号,一般情况下为25
  • local_hostname:如果SMTP在本机上,只需要指定为localhost即可

PythonSMTP对象使用sendmail方法发送邮件的语法为:

SMTP.sendmail(from_addr,to_addrs,msg [, mail_options, rcpt_options])

参数说明:

  • from:邮件发送者地址
  • to_addr:邮件发送地址
  • msg:发送的消息

使用上述方法发送邮件如下:

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


2.HTML格式的邮件发送

前面例子中的邮件发送方式只能发送纯文本格式,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)

3.发送带附件的邮件

附件实际上时另一种格式的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)

注意:

  1. 附件地址一定要准确,否则会报路径错误
  2. 其他格式文件与例题处理方式相同,MIMEApplication适应所有类型的文件

二、接收电子邮件

接收邮件有两种常用的协议:POP3和IMAP协议,两者最大的区别就是POP3协议下用户在客户端的操作不会反馈到服务器上,二IMAP协议下用户在客户端做的任何改变都会在服务器上同步。

下面分别介绍这两种协议的使用方法:


1.使用POP3协议下载邮件

步骤详细解析可参考: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()

如果能连接邮箱并且列出邮件数量,说明代码正确。


2.使用IMAP协议下载邮件

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()

你可能感兴趣的:(服务器,网络,python)