python发送多人邮件没有展示收件人问题的解决方法


Posted in Python onJune 21, 2019

背景:

工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人

问题:

使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容

问题代码示例:

# -*- coding:utf-8 -*-
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
 
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
 server = 'mail.****.com'
 user = '*****'
 password = '********'
 
 strFrom = fromAdd
 strTo = toAdd
 
 msgRoot = MIMEMultipart('related')
 msgRoot['Subject'] = subject
 msgRoot.preamble = 'This is a multi-part message in MIME format.'
 
 msgAlternative = MIMEMultipart('alternative')
 msgRoot.attach(msgAlternative)
 
 msgText = MIMEText(html_text, 'html', 'utf-8')
 msgAlternative.attach(msgText)
 
 smtp = smtplib.SMTP()
 smtp.connect(server)
 smtp.login(user, passwd)
 
 att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
 att5["Content-Type"] = 'application/octet-stream'
 att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
 msgRoot.attach(att5)
 
 smtp.sendmail(strFrom, strTo, msgRoot.as_string())
 smtp.quit()
 return

成功代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr
from email.utils import formataddr
from email.header import Header
 
 
def __format_addr__(addr):
 # 解析邮件地址,以保证邮有别名可以显示
 alias_name, addr = parseaddr(addr)
 # 防止中文问题,进行转码处理,并格式化为str返回
 return formataddr((Header(alias_name,charset="utf-8").encode(),
      addr.encode("uft-8") if isinstance(addr, unicode) else addr))
 
 
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
 
 SERVER = 'mail.***.com'
 USER = '******'
 PASSWD = '***'
 
 strFrom = __format_addr(fromAdd)
 
 strTo = list()
 # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
 try:
  for a in toAdd:
   strTo.append(__format_addr(a))
 except Exception as e:
  # 没有对a和toadd进行type判断,出错就直接还原
  strTo = toAdd
 
 msgRoot = MIMEMultipart('related')
 msgRoot.preamble = 'This is a multi-part message in MIME format.'
 
 msgAlternative = MIMEMultipart('alternative')
 msgRoot.attach(msgAlternative)
 
 # 邮件对象 
 msgText = MIMEText(html_text, 'html', 'utf-8')
 msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
 msgRoot['From'] = strFrom  # 发件人也是被格式化过的
 msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
 msgAlternative.attach(msgText)
 
 smtp = smtplib.SMTP(SERVER, 11)
 smtp.set_debuglevel(0)
 # smtp.connect(SERVER)
 smtp.login(USER, PASSWD)
 # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
 smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
 smtp.quit()

总结:

看到 msgRoot['to'] = ','.join(strTo)  与  msgRoot['to'] = strTo

实验过程中发现这个["to"]一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”

同时也发现["to"]的数据类型与sendmail(from_addrs,to_addrs,...)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型

还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,["From"]、["to"]等这些属性给谁都行。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python编程实现删除VC临时文件及Debug目录的方法
Mar 22 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 Python
Python3.4实现远程控制电脑开关机
Feb 22 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
Django框架实现的简单分页功能示例
Dec 04 Python
python单例模式的多种实现方法
Jul 26 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
20行Python代码实现视频字符化功能
Apr 13 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 Python
django的403/404/500错误自定义页面的配置方式
May 21 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 #Python
django框架使用orm实现批量更新数据的方法
Jun 21 #Python
python字典改变value值方法总结
Jun 21 #Python
python如何以表格形式打印输出的方法示例
Jun 21 #Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 #Python
对pyqt5之menu和action的使用详解
Jun 20 #Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 #Python
You might like
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
JavaScript中获取样式的原生方法小结
2014/10/08 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
理解javascript闭包
2015/12/15 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
javascirpt实现2个iframe之间传值的方法
2016/06/30 Javascript
JS 动态判断PC和手机浏览器实现代码
2016/09/21 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
python访问sqlserver示例
2014/02/10 Python
python的dict,set,list,tuple应用详解
2014/07/24 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
PyQt5实现下载进度条效果
2018/04/19 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
logging level级别介绍
2020/02/21 Python
戴尔英国官网:Dell英国
2017/05/27 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
房地产广告词大全
2014/03/19 职场文书
美容院店长岗位职责
2014/04/08 职场文书
家长对孩子的评语
2014/04/18 职场文书
工作岗位说明书模板
2014/05/09 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
运动会主持人开幕词
2016/03/04 职场文书