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多层嵌套list的递归处理方法(推荐)
Jun 08 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
wxPython实现带颜色的进度条
Nov 19 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
简单了解django处理跨域请求最佳解决方案
Mar 25 Python
基于python实现操作git过程代码解析
Jul 27 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
python3实现名片管理系统(控制台版)
Nov 29 Python
详解Python调用系统命令的六种方法
Jan 28 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 静态化实现代码
2009/03/20 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
php获取文件类型和文件信息的方法
2015/07/10 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
js图片处理示例代码
2014/05/12 Javascript
详解参数传递四种形式
2015/07/21 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
详解javascript void(0)
2020/07/13 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
利用python程序生成word和PDF文档的方法
2017/02/14 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
Python tkinter和exe打包的方法
2020/02/05 Python
python 项目目录结构设置
2020/02/14 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
大班下学期幼儿评语
2014/12/30 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
python 如何用map()函数创建多线程任务
2021/04/07 Python
canvas多重阴影发光效果实现
2021/04/20 Javascript