Python实现自动收发邮件:封装函数与实战代码
本文介绍如何使用Python自动处理邮件收发任务,通过封装发送和收取两个核心函数,简化操作流程。文章详细解析了`smtplib`和`poplib`库的应用,提供了包含授权码配置、附件处理及标题解码的完整代码示例,帮助开发者快速实现邮件自动化脚本,提升工作效率。
Python邮件自动化背景与优势
作为课代表,经常需要执行两项任务:分发作业和收集作业,且这些操作通常通过电子邮件完成。如果手动逐一处理收发邮件,将耗费大量时间。鉴于人生苦短,使用Python进行自动化处理是更优选择。
以下是完整代码示例。若无需了解底层原理,可直接参考文末封装好的两个函数,根据提示输入相应参数即可直接调用。该方案经实际测试,运行可行。
若希望跳过原理部分,可直接查看后续内容,但在运行程序时,必须将相关代码块完整粘贴至环境中。
导入相关库
import smtplib,ssl
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email import encoders
import poplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
from email.header import Header
#解析消息头中的字符串,没有这个函数,print出来的会使乱码的头部信息。如'=?gb18030?B?yrXWpL3hufsueGxz?='这种,通过decode,将其变为中文
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
#解码邮件信息分为两个步骤,第一个是取出头部信息:首先取头部信息,主要取出['From','To','Subject']
def get_header(msg):
for header in ['From', 'To', 'Subject']:
value = msg.get(header, '')
if value:
if header == 'Subject': #文章的标题有专门的处理方法
value = decode_str(value)
elif header in ['From','To']:
hdr, addr = parseaddr(value) #地址也有专门的处理方法
name = decode_str(addr)
value=name
print(header + ':' + value)
#头部信息已取出,获取邮件的字符编码,首先在message中寻找编码,如果没有,就在header的Content-Type中寻找
def guess_charset(msg):
charset = msg.get_charset()
if charset is None:
content_type = msg.get('Content-Type', '').lower()
pos = content_type.find('charset=')
if pos >= 0:
charset = content_type[pos+8:].strip()
return charset
#邮件正文部分:取附件,邮件的正文部分在生成器中,msg.walk(),如果存在附件,则可以通过.get_filename()的方式获取文件名称
def get_file(path, msg):
for part in msg.walk():
filename=part.get_filename()
if filename!=None: #如果存在附件
filename = decode_str(filename) #获取的文件是乱码名称,通过一开始定义的函数解码
data = part.get_payload(decode = True) #取出文件正文内容
f = open(path+filename, 'wb') #此处可以自己定义文件保存位置
f.write(data)
f.close()
print('附件',filename,'下载成功')
def get_content(msg):
for part in msg.walk():
content_type = part.get_content_type()
charset = guess_charset(part)
if part.get_filename()!=None: #如果有附件,则直接跳过
continue
email_content_type = ''
content = ''
if content_type == 'text/plain':
email_content_type = 'text'
elif content_type == 'text/html':
print('html 格式 跳过')
continue #不要html格式的邮件
email_content_type = 'html'
if charset:
try:
content = part.get_payload(decode=True).decode(charset)
except AttributeError:
print('type error')
except LookupError:
print("unknown encoding: utf-8")
if email_content_type =='':
continue #如果内容为空,也跳过
print(email_content_type + ' ----- ' + content)
# -------------------- 收取和发送邮件两个函数 --------------------------
def sent_email(from_addr,password, to_addrs,title,content,path=None):
'''
from_addr:发件人邮箱
password:发件人密码(如果是QQ或者网易邮箱,这里写授权码)
to_addrs:收件邮箱列表
title:邮件标题
content:邮件内容
path:如果需要发送附件,这里填写附件的路径
'''
smtp_server = 'smtp.'+ from_addr.split('@')[-1] # 发信服务器
msg = MIMEMultipart() # 创建一封空邮件
msg['From'] = Header(from_addr) # 添加邮件头信息
msg['Subject'] = Header(title) # 添加邮件标题
msg.attach(MIMEText(content,'plain','utf-8')) # 正文内容
if path != None:
# 添加附件
part = MIMEBase('application', "octet-stream")
part.set_payload(open(path, "rb").read()) # 读取附件
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment', filename=path.split('/')[-1])
msg.attach(part) # 把附件添加到邮件中
server = smtplib.SMTP_SSL(smtp_server) # 开启发信服务,这里使用的是加密传输
server.connect(smtp_server,465) # 登录发信邮箱
for to_addr in to_addrs: # 遍历发送给每个账号
msg['To'] = Header(to_addr)
server.login(from_addr, password) # 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())
server.quit() # 关闭服务器
print('发送成功')
def get_email(email,password,path):
'''
email:邮箱地址
password:密码(如果是qq邮箱或者网易邮箱,这里填授权码)
path:附件保留的位置
'''
server=poplib.POP3_SSL('pop.'+email.split('@')[-1]) #修改对应的邮箱服务器
server.user(email)
server.pass_(password)
resp, mails, octets = server.list() #登录的过程
index = len(mails) #邮件的总数
resp, lines, octets = server.retr(index) #读取最近一封邮件
msg_content = b'\r\n'.join(lines).decode('utf-8','ignore')
msg = Parser().parsestr(msg_content)
#server.dele(index) 删除邮件
get_header(msg) # 显示邮件信息,包括发件人,收件人,标题
get_file(path,msg) # 保留附件
get_content(msg) # 显示文件内容
server.quit()
print('收取成功')
发送邮件函数实现与参数详解
请直接参考以下代码部分。
1、发送邮件函数定义:`sent_email(from_addr, password, to_addrs, title, content, path=None)`
调用时需按顺序传入括号内的参数。
`from_addr`:发件人的邮箱地址。
`password`:发件人的登录密码。若使用QQ邮箱或网易邮箱,此处需填写授权码而非登录密码。
`to_addrs`:收件人的邮箱列表。
`title`:邮件的主题标题。
`content`:邮件的正文内容。
`path`:如需发送附件,此处填写附件的文件路径;若无需附件,可忽略此参数。
发送邮件代码示例
from_addr = '20182*****@mail.scut.edu.cn' # 打个码,这里输入你自己的邮箱就行
password = 'scut_827*****' # 输入你的密码(如果是qq或者网易邮箱,这里要输入授权码)
to_addrs = ['lly****@163.com', '12375947@qq.com'] # 这里就写需要发送的邮箱
title = '这是一封测试邮件' # 邮件标题
content = '随便写点东西' # 正文内容
path = 'C:/Users/要发的文件.xlsx' # 如果你想要发送一封带附件的邮件,那么这里就填写你的附件路径
sent_email(from_addr, password, to_addrs, title, content, path) # 发送邮件
收取邮件函数实现与参数详解
2、收取邮件函数定义:`get_email(email, password, path)`
`email`:用于收取邮件的邮箱地址。
`password`:该邮箱的登录密码(若为QQ或网易邮箱,此处需填写授权码)。
`path`:指定附件保存的本地路径。
收取邮件代码示例
email = '1234567@163.com' # 填写你的邮箱账号(你要收取邮件的那个邮箱)
password = 'LXSHS*****' # 填写你的邮箱密码(如果是qq或者网易邮箱,这里要输入授权
path = 'C:/Users/Desktop/' # 如果对方的邮件有附件,那么附件将下载到这里地方
get_email(email,password,path)
至此,关于Python自动发送和收取邮件的方法介绍完毕。如需了解更多相关内容,建议搜索本站过往文章或继续浏览后续系列教程,感谢支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









