python2.7 解决email foxmail for mac 收到附件无后缀未命名文件,无发件人,漏掉邮件内容问题
python2.7 解决email中foxmail for mac 收到附件无后缀,无发件人,漏掉邮件内容问题:https://blog.csdn.net/SHSQLDLL/article/details/86700029
一、附件无后缀的问题
#之前写的发送附件时(在windows的foxmail接收无问题,mac的foxmail的附件大于2M时会出现问题):
file = "test.txt"
message = MIMEMultipart()
att1 = MIMEText(open(file , 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="%s"'%file#这里的filename就是附件名称展示
message.attach(att1)
在windows的foxmail和网页版的邮件均可正常接收,展示正确的附件名称.
但是突然一天发送的附件超过2M时, foxmail for mac中接收到到附件就展示成"未命名文件"了......
查看foxmail for mac中的源码(导出邮件.eml用txt打开查看)时,看到filename="=?utf-8?B?5pyq5ZG95ZCN5paH5Lu2?="解码过来就是"未命名文件",应该是发送时格式有问题, 找了n种方法,试了将filename写死(filename="abc.txt")不会出问题, 文件大小为1M多不会出问题...查看email中的message.py文件,发现提供了一个add_header方法来新增, 试用后居然可以了.
暂时未发现问题所在, 请了解的同学回复一下.
#修改后的,在windows/mac的foxmail中均展示正常def addMessageHeader(message,key,value,**params):message.__delitem__(key)#Content-Type,Content-Disposition 等若不删除的话可能会同时存在两个message.add_header(key,value,**params)#该方式在foxmail mac/windows 接收均正常file = "test.txt"#大于3M
message = MIMEMultipart()
att1 = MIMEText(open(file , 'rb').read(), 'base64', 'utf-8')
addMessageHeader(att1 ,"Content-Type","application/octet-stream",name=filename)
addMessageHeader(att1 ,"Content-Disposition","attachment",filename=filename)#使用该方法可避#免foxmail for mac接受到的文件名展示为"未命名文件
message.attach(att1)
二、收件人,发件人,主题在foxmail for mac中接受为utf解码异常甚至是为空的情况
#之前的写法,在windows的foxmail中总是正常, 在mac的foxmail总是有问题
message = MIMEMultipart()
message['From'] = Header("aaa@qq.com", 'utf-8')
message['To'] = Header("aaa@qq.com", 'utf-8')
message['Subject'] = Header('邮件测试', 'utf-8')
同上面情况一样,无论是否有附件, foxmail for mac展示from,to,subject均会出现接受内容为空的问题,解决方案如上
#修改后的,在windows/mac的foxmail中均正常
#subject = "测试邮件发送接受"#带中文的最好使用下面的方式,前面加上u, 不然会有些小问题,在 #foxmail windows版本中刚收到时标题是乱码, 邮件收完整后就不会是乱码了
subject = u"测试邮件发送接受"#注意中文最好使用unicodedef addMessageHeader(message,key,value,**params):message.__delitem__(key)#Content-Type,Content-Disposition 等若不删除的话可能会同时存在两个message.add_header(key,value,**params)#该方式在foxmail mac/windows 接收均正常addMessageHeader(message,"subject",subject)#如果subject带中文, 在传过来的时候最好是unicode格#式, 不然也没啥大问题,就是会在foxmail windows版本#中刚收到时标题是乱码, 邮件收完整后就不会是乱码了
addMessageHeader(message,"From","abc@qq.com")
addMessageHeader(message,"To","abc@qq.com")
三、foxmail for mac 漏掉邮件内容的情况
1.两条plain格式
#之前写的有问题的代码,在windows/mac的foxmail中均展示有遗漏, 只展示最后一条的内容了
message = MIMEMultipart()
text1 = "测试中文内容plain"
text2= "测试html格式"
message.attach(MIMEText(text1, 'plain', 'utf-8'))
message.attach(MIMEText(text2, 'plain', 'utf-8'))#邮件格式如下:
#注意text/plain格式的foxmail windows/mac中都只会展示相同boundary(1783340315)中的最后一个
#This is a multi-part message in MIME format.
#--===============1783340315==
#Content-Type: text/plain; charset="utf-8"
#MIME-Version: 1.0
#Content-Transfer-Encoding: base64
#
#5rWL6K+V5Lit5paH
#
#--===============1783340315==
#Content-Type: text/plain; charset="utf-8"
#MIME-Version: 1.0
#Content-Transfer-Encoding: base64
#
#dGVzdCBzdHI=
#
#--===============1783340315==--
2.两条html格式
#之前写的有问题的代码
message = MIMEMultipart()
text1 = "<p>测试中文内容plain</p>"
text2= "<p>测试html格式</p>"
message.attach(MIMEText(text1 , 'html', 'utf-8'))
message.attach(MIMEText(text2 , 'html', 'utf-8'))#在foxmail windows中展示正确;
#在foxmail for mac 中只展示相同boundary(0634571778)中的最后一条
#--===============0634571778==
#Content-Type: text/html; charset="utf-8"
#MIME-Version: 1.0
#Content-Transfer-Encoding: base64
#
#PHA+5rWL6K+V5Lit5paHPC9wPg==
#
#--===============0634571778==
#Content-Type: text/html; charset="utf-8"
#MIME-Version: 1.0
#Content-Transfer-Encoding: base64
#
#PHA+dGVzdCBzdHI8L3A+
#
#--===============0634571778==--
从上可分析出, 一个MIMEText(text , 'html', 'utf-8')会产生一条boundary, attach到同一个MIMEMultipart()时, plain或html是共用一个boundary的,这样不符合MIME标准, 所以为解决这样的问题, 可以把plain和html内容放在一起,整合在同一个html中。
四、附送可用的发邮件的代码
#coding=utf-8
__author__ = 'cemy'
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# from email.header import Header
from email.mime.image import MIMEImage
from email.utils import formatdate
import smtplib
import random,stringsender = {"name":"autoTest","password":"xxx","email":"abc@qq.com","server":"smtp.exmail.qq.com"}
receivers = ["abc@qq.com"]
cc = []
subject = u"测试邮件发送接受"#注意中文最好使用unicodedef addMessageHeader(self,message,key,value,**params):message.__delitem__(key)#Content-Type,Content-Disposition 等删除的话会同时出现两个message.add_header(key,value,**params)#该方式在foxmail mac/windows 接收均正常def formContent(content):#image = {filename:filepath,filename2:filepath2,...}#file = {cid:filepath,cid1:filepath1,...}body,image,file = "",{},{}for i in range(len(content)):#按顺序组织邮件内容key = content[i][0]value = content[i][1]if key == "plain":#(plain,"")body += """<p>%s</p>"""%(value)elif key =="html":#(html,"")body += valueelif key == "files":#(files,{filename:filepath,...})file = dict(file.items() + value.items())elif key == "imgs":#(imgs,[file1,file2...])for i in range(len(value)):cid = "image_" + "".join(random.sample(string.digits+string.letters,20))body += """<img src="cid:%s""><br>"""%(cid)image[cid] = value[i]#value[i]是图片文件名(全路径)return body,image,filedef addBody(message,body,images = None):related = MIMEMultipart("related")#若要展示图片要这么使用, 不然会展示错误alternative = MIMEMultipart("alternative")message.attach(related)related.attach(alternative)alternative.attach(MIMEText(body, 'html', 'utf-8'))#保证文本内容只有一条MIMETextfor cid in images:content = MIMEImage(open(images[cid], 'rb').read())content.add_header('Content-ID', cid)related.attach(content)def addFile(message,filename,filePath):content = MIMEText(open(filePath, 'rb').read(), 'base64', 'utf-8')#message["Content-Disposition"] = 'attachment; filename="test.txt"'#可能会导致foxmail for mac 接受到的文件名异常addMessageHeader(content,"Content-Type","application/octet-stream",name=filename)addMessageHeader(content,"Content-Disposition","attachment",filename=filename)#使用该方法可避免foxmail for mac接受到的文件名展示为"未命名文件"message.attach(content)def makeContent(message,content):body,image,file = formContent(content)#文本/图片/附件分成这3大类,将文本和图片存放位置的html的文本均组织在一起#foxmail for mac中相同的boundary会只接受最后一条boundary的内容,会导致邮件接受不全#MIMEText("abc", 'plain', 'utf-8')这里会生成一条boundary,如果有多条这样的文本的内容attach到同一个MIMEMultipart的话, 就会出现相同的boundaryaddBody(message,body,image)for filename in file:self.addFile(message,filename,file[filename])def makeMessage(content):#content=(("subject",xx),("files"),("html"),("imgs"),("files"),("html"),("imgs"))message = MIMEMultipart()makeContent(message,content)#添加header时:message['To'] = Header(",".join(receivers),'utf-8')该方式会使foxmail mac 收到会解码错误#改用message.add_header(key,value,**params)方式addMessageHeader(message,"subject",subject)#如果subject带中文, 在传过来的时候最好是unicode格式, 不然也没啥大问题,就是会在foxmail windows版本中刚收到时标题是乱码, 邮件收完整后就不会是乱码了addMessageHeader(message,"From",sender["email"])addMessageHeader(message,"To",",".join(receivers))addMessageHeader(message,"Date",formatdate())if cc:addMessageHeader(message,"CC",",".join(cc))message.preamble = 'This is a multi-part message in MIME format.'#MIME规范中会有这一句,不加上也没事# print message.as_string()#调试时使用, 打印所发送邮件的源码格式return messagedef send(message):try:# smtpObj = smtplib.SMTP(sender["server"],25)#大部分云服务器是默认关闭25端口的,建议采用ssl端口smtpObj = smtplib.SMTP_SSL(sender["server"],465)#ssl端口smtpObj.login(sender["email"],sender["password"])smtpObj.sendmail(sender["email"], receivers + cc, message.as_string())print "邮件发送成功"except smtplib.SMTPException,e:print "发送邮件失败,%s"%e.messagehtml = """<p>Python 邮件发送测试...</p><p><a href="http://www.runoob.com">这是一个链接</a></p>"""
files = {"test":"test.html","test1":"test1.html"}
imgs = ["aaa.jpg"]message = makeMessage((("plain","begin"),("imgs",imgs),("html",html),("imgs",imgs),("files",files),("plain",u"end"),("plain",u"更多详情请见附件!"),("plain",u"(本邮件是程序自动下发的,请勿回复!)")))
send(message)
python2.7 解决email foxmail for mac 收到附件无后缀未命名文件,无发件人,漏掉邮件内容问题相关推荐
- Renamer for Mac 6.0.6批量重命名文件。
Renamer for Mac - 麦金塔 macnp.com Renamer是一个功能强大.功能丰富的批处理文件重命名器,可以快速轻松地重命名许多文件.如果您曾经不得不手动重命名数百或数千个文件并认 ...
- Endnote 导入enw文件无响应及解决方法
Endnote 导入enw文件无响应及解决方法 参考文章: (1)Endnote 导入enw文件无响应及解决方法 (2)https://www.cnblogs.com/shuaihe/p/114701 ...
- 解决M1处理器款mac安装DW闪退问题 Dreamweaver 2021 Mac(已适配M1芯片,支持最新款M1芯片Mac)
作为一名资深程序员,一直都是用苹果的Mac电脑运行DW进行网页开发,Adobe Dreamweaver,简称"DW",中文名称 "梦想编织者",最初为美国MAC ...
- 解决mac 10.11 以后 无法使用未签名第三驱动
解决 最新版 mac 系统 无法使用未签名第三驱动 10.12.多 我的情况是 10.11.4 Beta (15E27e) 使用绿联usb网卡不正常. 下面的命令为检测驱动是否装载的一些命令. sud ...
- Teamviewer - Teamviewer被检测成商用,无法使用个人版怎么解决(不用修改Mac地址)
Teamviewer被检测成商用,无法使用个人版怎么解决(不用修改Mac地址) 近期有许多用户的Teamviewer被检测成了商用,卸载重装后也无法使用个人版,这是因为Teamviewer把你的设备设 ...
- Mac打不开后缀名为txt文件,显示文本编码中文不适用的解决措施
Mac打不开后缀名为txt文件,显示文本编码中文不适用的解决措施 问题: 未能打开文稿".txt".文本编码中文(GB 18030)不适用 解决措施: 1.打开文本编辑器的偏好设置 ...
- 电子邮件客户端:Foxmail for Mac中文免费版
Foxmail for Mac是Mac平台上一款免费好用的电子邮件客户端,foxmail mac版全面支持Exchange帐号的数据同步,包括邮件.日历.联系人.邮件规则等,而且具备实用的反垃圾邮件功 ...
- 如何解决iCloud空间被Mac桌面和文稿占用太多的问题?
相信Mac用户都会有这样的烦恼,就是iCloud总是提示被桌面和文稿占用太多,提示空间不足,这是因为iCloud 提供的免费储存空间只有5G,如果开启了同步,存储空间很快就会被占用完.这个时候有两个办 ...
- 用Foxmail for Mac客户端登录网易163邮箱
1.下载Foxmail for Mac客户端: 2.进入163邮箱,点设置--邮箱设置--设置POP3/SMTP/IMAP: 选择开通 3.开通后会获取一个授权码,该授权码即Foxmail for M ...
最新文章
- graphpad两组t检验_Graphpad 作图教程 | 手把手教你绘制森林图
- 三菱的触摸屏usb驱动_资深工程师一步一步教你PLC与西门子触摸屏的RS485通信
- x86CPU 实模式 保护模式 傻傻分不清楚? 基于Xv6-OS 分析CR0 寄存器
- Consul 服务注册中心
- 【编程2】单链表+单链表反转(LeetCode. 206)
- Java实现选择排序及其优化
- 动态规划训练24 [Phalanx HDU - 2859 ]
- Docker 清理命令 删除所有的镜像和容器
- NuGet(Nuget Packages)
- python gridsearch_Python超参数自动搜索模块GridSearchCV上手
- office是python打开方式_Python读取word文本操作详解
- 对Javascript“闭包”的简单理解
- docx转换成txt linux,如何将doc / docx文件转换为markdown或结构化文本?
- java 异或_Java异或详解
- 树莓派3B+使用GPIO实现串口通信
- 理想电流源与理想电压源
- 脉冲信号matlab代码,MATLAB产生SNR可设的脉冲调制信号代码
- 2023最新软件工程毕业设计题目汇总
- poj1601 青蛙的约会 (扩展欧几里得)
- 【涵子来信】——第一季——新春新年特别篇
热门文章
- 基于51单片机的智能无线LED灯控制 蓝牙手机APP控制灯亮灭亮度方案原理图设计
- linux查看守护进程格式,详解Linux中的守护进程
- SMC集装阀岛在线选型软件
- 传感器-SMC可读行程气缸CEP系列接入西门子1200配置
- java中遍历数组的三种操作
- centos minimal mysql_安装centos minimal 版本后安装mysql详细过程(linux)
- 校花干得土得掉渣的事
- com/HTML/topic/160927. - 百度,耶鲁大学 公开课.doc
- 计算机基础学习(云计算)
- 一个控制器怎么转发到另外一个控制器_商用车多合一控制器集成化路线分析