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 收到附件无后缀未命名文件,无发件人,漏掉邮件内容问题相关推荐

  1. Renamer for Mac 6.0.6批量重命名文件。

    Renamer for Mac - 麦金塔 macnp.com Renamer是一个功能强大.功能丰富的批处理文件重命名器,可以快速轻松地重命名许多文件.如果您曾经不得不手动重命名数百或数千个文件并认 ...

  2. Endnote 导入enw文件无响应及解决方法

    Endnote 导入enw文件无响应及解决方法 参考文章: (1)Endnote 导入enw文件无响应及解决方法 (2)https://www.cnblogs.com/shuaihe/p/114701 ...

  3. 解决M1处理器款mac安装DW闪退问题 Dreamweaver 2021 Mac(已适配M1芯片,支持最新款M1芯片Mac)

    作为一名资深程序员,一直都是用苹果的Mac电脑运行DW进行网页开发,Adobe Dreamweaver,简称"DW",中文名称 "梦想编织者",最初为美国MAC ...

  4. 解决mac 10.11 以后 无法使用未签名第三驱动

    解决 最新版 mac 系统 无法使用未签名第三驱动 10.12.多 我的情况是 10.11.4 Beta (15E27e) 使用绿联usb网卡不正常. 下面的命令为检测驱动是否装载的一些命令. sud ...

  5. Teamviewer - Teamviewer被检测成商用,无法使用个人版怎么解决(不用修改Mac地址)

    Teamviewer被检测成商用,无法使用个人版怎么解决(不用修改Mac地址) 近期有许多用户的Teamviewer被检测成了商用,卸载重装后也无法使用个人版,这是因为Teamviewer把你的设备设 ...

  6. Mac打不开后缀名为txt文件,显示文本编码中文不适用的解决措施

    Mac打不开后缀名为txt文件,显示文本编码中文不适用的解决措施 问题: 未能打开文稿".txt".文本编码中文(GB 18030)不适用 解决措施: 1.打开文本编辑器的偏好设置 ...

  7. 电子邮件客户端:Foxmail for Mac中文免费版

    Foxmail for Mac是Mac平台上一款免费好用的电子邮件客户端,foxmail mac版全面支持Exchange帐号的数据同步,包括邮件.日历.联系人.邮件规则等,而且具备实用的反垃圾邮件功 ...

  8. 如何解决iCloud空间被Mac桌面和文稿占用太多的问题?

    相信Mac用户都会有这样的烦恼,就是iCloud总是提示被桌面和文稿占用太多,提示空间不足,这是因为iCloud 提供的免费储存空间只有5G,如果开启了同步,存储空间很快就会被占用完.这个时候有两个办 ...

  9. 用Foxmail for Mac客户端登录网易163邮箱

    1.下载Foxmail for Mac客户端: 2.进入163邮箱,点设置--邮箱设置--设置POP3/SMTP/IMAP: 选择开通 3.开通后会获取一个授权码,该授权码即Foxmail for M ...

最新文章

  1. graphpad两组t检验_Graphpad 作图教程 | 手把手教你绘制森林图
  2. 三菱的触摸屏usb驱动_资深工程师一步一步教你PLC与西门子触摸屏的RS485通信
  3. x86CPU 实模式 保护模式 傻傻分不清楚? 基于Xv6-OS 分析CR0 寄存器
  4. Consul 服务注册中心
  5. 【编程2】单链表+单链表反转(LeetCode. 206)
  6. Java实现选择排序及其优化
  7. 动态规划训练24 [Phalanx HDU - 2859 ]
  8. Docker 清理命令 删除所有的镜像和容器
  9. NuGet(Nuget Packages)
  10. python gridsearch_Python超参数自动搜索模块GridSearchCV上手
  11. office是python打开方式_Python读取word文本操作详解
  12. 对Javascript“闭包”的简单理解
  13. docx转换成txt linux,如何将doc / docx文件转换为markdown或结构化文本?
  14. java 异或_Java异或详解
  15. 树莓派3B+使用GPIO实现串口通信
  16. 理想电流源与理想电压源
  17. 脉冲信号matlab代码,MATLAB产生SNR可设的脉冲调制信号代码
  18. 2023最新软件工程毕业设计题目汇总
  19. poj1601 青蛙的约会 (扩展欧几里得)
  20. 【涵子来信】——第一季——新春新年特别篇

热门文章

  1. 基于51单片机的智能无线LED灯控制 蓝牙手机APP控制灯亮灭亮度方案原理图设计
  2. linux查看守护进程格式,详解Linux中的守护进程
  3. SMC集装阀岛在线选型软件
  4. 传感器-SMC可读行程气缸CEP系列接入西门子1200配置
  5. java中遍历数组的三种操作
  6. centos minimal mysql_安装centos minimal 版本后安装mysql详细过程(linux)
  7. 校花干得土得掉渣的事
  8. com/HTML/topic/160927. - 百度,耶鲁大学 公开课.doc
  9. 计算机基础学习(云计算)
  10. 一个控制器怎么转发到另外一个控制器_商用车多合一控制器集成化路线分析