首先,用到的模块

import logging
import traceback
from email.mime.application import MIMEApplication
import os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.utils import formataddr
from email.mime.text import MIMEText
from poplib import POP3
from email.header import decode_header
from email.parser import Parser
from email.utils import parseaddr

发送带附件的邮件

def send(email_title, content, filepath, receiver_filename, receiver, smtpserver='smtp.mxhichina.com',nick_name='开发者账号', sender, my_pass, del_file=True):print("开始发送邮件........")try:# 创建一个带附件的实例msg = MIMEMultipart()msg['From'] = formataddr([nick_name, sender])msg['To'] = ','.join(receiver)msg['Subject'] = email_titlemsg.attach(MIMEText(content, 'plain', 'utf-8'))  # 邮件正文内容xlsxpart = MIMEApplication(open(filepath, 'rb').read())xlsxpart.add_header('Content-Disposition', 'attachment', filename=('gbk', '', receiver_filename))msg.attach(xlsxpart)# 登陆且发送邮件server = smtplib.SMTP_SSL(smtpserver, 465)server.login(sender, my_pass)server.sendmail(sender, receiver, msg.as_string())server.quit()print("邮件发送成功")if del_file == True:if os.path.exists(filepath):os.remove(filepath)print("文件已删除")else:print("没有文件可以供删除")except Exception as e:print(e)return "ok"

发送不带附件的html格式的邮件

def send_no_path(email_title, content, receiver, smtpserver, nick_name,sender, my_pass):"""@auth 发送不带附件的html格式的邮件"""# 创建一个不带附件的实例msg = MIMEText(content, "html", 'utf-8')# 邮件标题msg['Subject'] = email_title# 发送人/收件人/抄送人msg['From'] = formataddr([nick_name, sender])msg['To'] = ','.join(receiver)smtpobj = smtplib.SMTP_SSL(smtpserver, 465)try:# 连接到服务器smtpobj.connect(smtpserver, 465)# 登陆smtpobj.login(sender, my_pass)# 发送smtpobj.sendmail(sender, receiver, msg.as_string())except Exception:print('ERROR:邮件发送错误')finally:smtpobj.quit()

接收邮件内容

class MailFileDownload:"""@author: @date:2021/11/17通过主题或者发件人为标签自动获取最新一封邮件的正文和附件Attributes:target_subject:要获取的邮件主题target_from:要获取的邮件的发件人file_download_path:附件下载路径server:邮箱服务器user:邮箱登陆账号password:邮箱登陆密码实用方法:mail_text:获取邮件正文,返回字符串形式的正文mail_file:下载邮件附件到指定路径,返回Nonemail_file_text:获取邮件附件和正文,返回正文"""logging.basicConfig(level=logging.INFO, format="$asctime - $levelname - $message", style='$')def __init__(self, target_subject=None, target_from=None, file_download_path=None, server,user, password):self.logger = logging.getLogger('email')self.target_subject = target_subjectself.target_from = target_fromself.p = POP3(server)self.logger.info(self.p.getwelcome().decode('utf-8'))self.p.user(user)self.p.pass_(password)self.num = len(self.p.list()[1])  # 获取邮件位置的列表self.logger.info(f'共有{self.num}份邮件')if file_download_path[-1] == '/':self.file_download_path = file_download_pathelse:self.file_download_path = file_download_path + '/'# self.mail = Parser().parsestr(b'\r\n'.join(text_).decode('utf-8', 'ignore'))def __target_mail(self):"""获取指定的邮件信息"""for i in range(self.num, 0, -1):# 获取邮件信息,返回元组,第二个值为邮件信息text_ = self.p.retr(i)[1]# 导入为mail格式mail = Parser().parsestr(b'\r\n'.join(text_).decode('utf-8', 'ignore'))# 比较主题是否是目标主题subject = mail.get('Subject')if subject:# 返回元组,索引0为正文内容,索引1为编码dh = decode_header(subject)result = dh[0][0].decode(dh[0][1])from_ = mail.get('From')if from_:addr = parseaddr(from_)[1]if self.target_from == addr or self.target_subject == result:breakelse:self.logger.warning('未找到指定主题或发件人的邮件,请检查参数')exit()return result, addr, mail@staticmethoddef 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 charsetdef __mail_text(self, mail):for part in mail.walk():charset = self.guess_charset(part)content_type = part.get_content_type()if content_type == 'text/plain':content = part.get_payload(decode=True).decode(charset)breakelse:self.logger.warning('该邮件缺失正文或正文格式不是txt,请检查邮件')content = Nonereturn contentdef __mail_file(self, mail):"""下载邮件附件"""for part in mail.walk():# 获取附件名称filename = part.get_filename()if filename:# 附件名称是乱码,用decode_header解码一下filename = decode_header(filename)filename = filename[0][0].decode(filename[0][1])data = part.get_payload(decode=True)  # 取出文件内容with open(os.path.join(self.file_download_path, filename), 'wb') as fp:fp.write(data)self.logger.info(f'{filename}下载完成')def mail_text(self):"""获取邮件正文,目前只支持txt格式的,html格式的暂不支持:return: content:rtype:"""try:result_, addr_, mail_ = self.__target_mail()  # 获取邮件标题、发件人、邮箱对象content = self.__mail_text(mail_)return contentexcept Exception:traceback.print_exc()finally:self.p.quit()def mail_file(self):"""获取邮件附件:return::rtype:"""try:result_, addr_, mail_ = self.__target_mail()  # 获取邮件标题、发件人、邮箱对象self.__mail_file(mail_)except Exception:traceback.print_exc()finally:self.p.quit()def mail_file_text(self):"""获取邮件正文和附件:return: content:rtype: str"""try:result_, addr_, mail_ = self.__target_mail()  # 获取邮件标题、发件人、邮箱对象self.__mail_file(mail_)content = self.__mail_text(mail_)return contentexcept Exception:traceback.print_exc()finally:self.p.quit()

python操作邮箱发送邮件和接收邮件相关推荐

  1. Python操作邮箱发送邮件(网易邮箱)

    以网易邮箱为例: 准备工作: 1)首先进入网页版网易邮箱,点击设置 2)点击,POP3/SMTP/IMAP 3)开启  IMAP/SMTP服务 和 POP3/SMTP服务  并且记住授权码(一定要记住 ...

  2. 使用python发送邮件和接收邮件

    发邮件是大家工作中最常用到的.今天来看一下怎么用python来发送和接收邮件. python实现发送和接收邮件功能主要用到poplib和smtplib模块. poplib用于接收邮件,而smtplib ...

  3. 用python发邮件为什么接收不了_使用python发送邮件和接收邮件

    发邮件是大家工作中最常用到的.今天来看一下怎么用python来发送和接收邮件. python实现发送和接收邮件功能主要用到poplib和smtplib模块. poplib用于接收邮件,而smtplib ...

  4. .NET发送邮件和接收邮件

    lumisoft 类库可以到 http://www.lumisoft.ee/lsWWW/download/downloads/Net下载 using System; using System.Data ...

  5. 新账户的收发邮件服务器,Foxmail怎么用?Foxmail新建邮箱帐户接收邮件使用教程...

    foxmail是办公室美美常用的桌面邮件管理工具,假如您需要经常接收邮件,或者有几个邮箱需要管理,那么使用Foxmail会很方便.Foxmail是张小龙先生编写的Internet电子邮件客户端软件,以 ...

  6. python 企业邮箱发送邮件

    import smtplib from email.mime.text import MIMEText from email.utils import formataddr# 发件人邮箱账号 my_s ...

  7. 使用腾讯企业邮箱,部分邮箱无法正常接收邮件问题

    一.问题描述 刚开始使用腾讯企业邮箱(exmail.qq.com).会遇到,部分邮箱无法正常接收.比如收件人邮箱是@qq.com,无法接收到邮件.比如,使用linux的 echo test_exmai ...

  8. python QQ邮箱发送邮件

    1.代码: #!/usr/bin/python # -*- coding: utf-8 -*- import smtplib from email.mime.text import MIMEText ...

  9. python 163邮箱发送邮件

    这学期做助教,需要把每个学生的成绩发送给个人.于是写了个小程序. 成绩单是一个excel表格,每一行是一个同学的信息,每行第一列是学号,第二列是姓名,之后是每题的成绩,和总成绩. 学号加学校邮箱后缀即 ...

最新文章

  1. Halcon知识: XLD的概念
  2. tensorflow 利用索引获取tensor特定元素
  3. centos 使用 beyond compare 对比工具
  4. 模拟退火算法求解旅行商问题(python实现)
  5. SAP GUI和Windows注册表
  6. 【费用流】摘取作物(jozj 3447)
  7. 2-5:C++快速入门之引用,引用和指针的区别
  8. Spring Boot与JWT整合实现前后端分离的用户认证
  9. [Windows Server 2008] 404错误设置方法
  10. memcached 安装与简单实用使用
  11. 1.Docket 安装简介
  12. java中强制类型转换
  13. flume学习(五):使用hive来分析flume收集的日志数据
  14. BatchNormalization 优点
  15. Java Web开发的轻便架构Tapestry5---简介
  16. [FROM VIJOS]安装服务器
  17. 机器学习——概率模型
  18. 快速查看网页元素的CSS样式
  19. 华为手机更新EIMU10之后google play 商店消失
  20. 贪心入门+10道例题+解析代码

热门文章

  1. 左手坐标系与右手坐标系
  2. java list 泛型 class_List 添加 Class 泛型
  3. xampp服务器无法启动mysql服务
  4. 进行外贸邮件群发需要注意的基本事项
  5. 神经网络训练效果不好,神经网络训练的优势
  6. 西安航空学院计算机专业排名,西安航空学院排名2021排行第580名
  7. python 打包exe_打包python脚本为exe的坎坷经历, by pyinstaller方法
  8. 6旬老人撞树晨练,装出腰椎滑脱
  9. 电脑录屏工具Captura下载使用
  10. android兼职工资怎么算,美团外卖员工资怎么算 外卖员工资结账方式介绍