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简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
定制FileField中的上传文件名称实例
Aug 23 Python
Python实现矩阵加法和乘法的方法分析
Dec 19 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
python实现根据文件关键字进行切分为多个文件的示例
Dec 10 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
基于python实现简单网页服务器代码实例
Sep 14 Python
pycharm激活方法到2099年(激活流程)
Sep 22 Python
python实现文件+参数发送request的实例代码
Jan 05 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
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
取选中的radio的值
2010/01/11 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
python+mysql实现简单的web程序
2014/09/11 Python
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
Python实现八皇后问题示例代码
2018/12/09 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
料理师求职信
2014/01/30 职场文书
大学生简短的自我评价
2014/09/12 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
2014年党建工作总结
2014/11/11 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技