首先,用到的模块

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. 定位的四个点怎么打_别被忽悠了,轮胎动平衡和四轮定位一定要区分清楚
  2. c2064 项不会计算为接受0个参数的函数_getMask()讨论:Abaqus Part对象的成员变量常用函数...
  3. Visual Studio 2010 Ultimate开发与测试敏捷特性
  4. MySQL基本架构图
  5. rds oracle utl file,本地Oracle数据上传到AWS的RDS
  6. 初步了解并使用正则表达式 (REGular EXPression)
  7. Kubernetes学习之路(四)之Node节点二进制部署
  8. java封装省市区三级json格式,微信开发 使用picker封装省市区三级联动模板
  9. 经典字符串匹配算法——KMP算法
  10. 雷达信号处理---MTI滤波器设计仿真
  11. html中居中方法,HTML中的居中方法
  12. 清华化工系碳纳米管重大突破!道翰天琼认知智能机器人平台API接口大脑为您揭秘
  13. aplay与call
  14. 画费氏数列螺线的代码
  15. win7一直弹计算机,Win7电脑总是自动弹出拨号连接怎么办 Win7总是弹出拨号连接对话框的解决办法(两种)...
  16. 输入多个数,中间用空格隔开
  17. 使用RoboCopy 命令[转载]
  18. 迷失lost结局什么意思_《lost》《迷失》大结局,没看懂的进,详细讲解
  19. java 获取星期几_java中获取日期是星期几的两种方法
  20. AD10 绘制MARK点

热门文章

  1. java 四种xml操作方式的基本使用方法
  2. 墨竹:“四巫日”匆匆来袭,黄金脱离萎靡将强势归来?
  3. 交友盲盒小程序源码/一元脱单小程序盲盒脱单盲盒交友相亲小程序带流量主
  4. python实时播放音频和录音_基于python的实时音频信号处理
  5. 知到智慧树python答案2020_参考答案2020智慧树(知到)Python程序设计
  6. uni-app获取当前苹果设备系统版本
  7. VR站在时代浪口的一阵大风,将颠覆整个未来行业的发展
  8. matlab画风场添加标尺,quiver函数画风场图加标尺
  9. php语言根据回车换行符来分割字符串
  10. 在使用 VScode 进行代码格式化后,保存发现代码又变乱了,怎么办?