专栏首页python学习教程教你用Python自动发送和收取邮件的方法

教你用Python自动发送和收取邮件的方法

这篇文章主要介绍了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自动发送和收取邮件的方法的文章就介绍到这了,更多相关Python自动发送和收取邮件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

本文分享自微信公众号 - python教程(pythonjc),作者:小雨

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 用Python打造一款人工智能照相机

    今天,我们将自己动手打造出一款基于深度学习的照相机,当小鸟出现在摄像头画面中时,它将能检测到小鸟并自动进行拍照。最终成品所拍摄的画面如下所示:

    python学习教程
  • Python爬虫学习:python抓取4399上的炉石传说原画

    网站其实已经加载了所有的卡牌原画 只是之后的原画做了隐藏处理默认不展示 style=display

    python学习教程
  • 学python是自学好还是去培训机构?这个问题应该这样分析

    因为目前python非常火,应用非常的广泛,是目前最火的行业之一,竞争很大,工资很高,未来发展也极好。

    python学习教程
  • JMeter接口压测——ServerAgent监控服务端性能指标

    ServerAgent作为一个服务端性能监控插件,结合JMeter自身插件PerfMon可以实现JMeter压测的图形化实时监控,具有良好的实用性。下面讲解一个...

    互联网金融打杂
  • 基础渲染系列(十九)——GPU实例(Instancing)

    这是渲染系列的第19篇教程。上一章节涵盖了 realtime GI, probe volumes, 和LOD groups,这一节我们来试一下另外一种缩减Dr...

    放牛的星星
  • Python3.6+Django2.0+Apache2.4+CentOS7.5 部署到云服务器腾讯云

    b. 利用软件(我这里用FlieZilla, 也可以用 Xftp)把 Python 安装包上传到服务器上

    Coxhuang
  • CentOs7.3 搭建 RabbitMQ 3.6 单机多实例服务

    老七Linux
  • js写入文件的方式 转

    晓歌
  • Mysql系列第七讲 玩转select条件查询,避免采坑

    注意关键字where,where后面跟上一个或者多个条件,条件是对前面数据的过滤,只有满足where后面条件的数据才会被返回。

    易兮科技
  • 基于Consul的分布式锁实现

    我们在构建分布式系统的时候,经常需要控制对共享资源的互斥访问。这个时候我们就涉及到分布式锁(也称为全局锁)的实现,基于目前的各种工具,我们已经有了大量的实现方式...

    程序猿DD

扫码关注云+社区

领取腾讯云代金券