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


Posted in Python onAugust 12, 2020

作为课代表,经常要做的两件事是:帮忙发作业和帮忙收作业,而且很多时候是通过邮件来完成的,如果手动一封一封的收取和发送就很浪费时间——人生苦短,我用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 相关文章推荐
python self,cls,decorator的理解
Jul 13 Python
Python选择排序、冒泡排序、合并排序代码实例
Apr 10 Python
python在windows下创建隐藏窗口子进程的方法
Jun 04 Python
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
Python 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
Python机器学习之逻辑回归
May 11 Python
Selenium webdriver添加cookie实现过程详解
Aug 12 #Python
Python如何设置指定窗口为前台活动窗口
Aug 12 #Python
Python面向对象实现方法总结
Aug 12 #Python
Python命名空间及作用域原理实例解析
Aug 12 #Python
python将字典内容写入json文件的实例代码
Aug 12 #Python
Python调用jar包方法实现过程解析
Aug 11 #Python
如何用python免费看美剧
Aug 11 #Python
You might like
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
详解JavaScript ES6中的模板字符串
2015/07/28 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
JS碰撞运动实现方法详解
2016/12/15 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
vue框架搭建之axios使用教程
2018/07/11 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
深入理解python对json的操作总结
2017/01/05 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
python实现图像拼接
2020/03/05 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
小区保洁员岗位职责
2015/04/10 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
学生会任命书范本
2015/09/21 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang