Python自动发送和收取邮件的方法
作者:易长安 发布时间:2023-10-09 17:58:56
标签: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)
来源:https://blog.csdn.net/qq_43019258/article/details/107895883
0
投稿
猜你喜欢
- 最近在做的一个项目中需要使用到HTML5中引入的WebSocket技术,本来以为应该很容易就能搞定,谁知道在真正上手开发了以后才发现有很多麻
- 前言孙悟空在花果山称王的时候,特意去了一趟东海,在那里淘到了如意金箍棒。因为身为一个山大王,怎么能没有一件趁手的兵器呢?作为程序员的我们也一
- 一、binlog 介绍服务器的二进制日志记录着该数据库的所有增删改的操作日志(前提是要在自己的服务器上开启binlog),还包括
- 查询重写插件从MySQL 5.7.6开始,MySQL Server支持查询重写插件,可以在服务器执行之前检查并可能修改服务器接收的语句。以下
- FBVFBV,即 func base views,函数视图,在视图里使用函数处理请求。以用户注册代码为例,使用两个函数完成注册初级注册代码d
- 使用python生成随机验证码的方法有很多种,今天小编给大家分享两种方法,大家可以灵活运用这两种方法,设计出适合自己的验证码方法。方法一:利
- 本文实例讲述了Python实例方法、类方法、静态方法的区别与作用。分享给大家供大家参考,具体如下:Python中至少有三种比较常见的方法类型
- 自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,st
- 集合(set)是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而
- 刚入职新公司,等了好几天,今天公司给发了新电脑,就要开始进行开发环境的安装了。在软件(JDK,GIT,IDEA,MYSQL,Navicate
- 在日常的开发中经常进行跨数据库进行查询数据。同服务器下跨数据库进行查询在表前加上数据库名就可以查询到数据。在数据超出服务器承载的时候,往往需
- 前两天看见有人问静态网页加密问题,就写了这个代码稍微有些长,解释一下思路:加密时:先把用户的密钥A用md5加密为B,然后用B异或源文件S0得
- 本文介绍了Python WEB应用部署的实现方法,分享给大家,具体如下: 使用Apache模块mod_wsgi运行Python WSGI应用
- 可以,具体说明和代码见下: <%@ Language=VBScript %><%Option
- 我使用anaconda安装的python3.6.3,并且
- 本文为大家分享了Python实现批量压缩图片的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*- "
- 您可以使用 ObjectContext 对象提交或放弃一项由 Microsoft Transaction Server (MTS) 管理的事
- 本文详细分析了smarty缓存的用法。分享给大家供大家参考。具体分析如下:一开始以为smarty只是用来做一些掩饰php代码功能,但是后来才
- >>> a = 2.5>>> b = 2.5>>> c = b>>>
- 随机从列表中取出元素:import randomdataSet = [[0], [1], [2], [3], [4], [5], [6],