注:作者编程小白,高手勿喷,如有疏漏,还请指正!

近期在跟着廖大大的教程学 Python,正好看到 SMTP发送邮件,于是乎自己尝试了一下,不(好)巧,自己主要用的是新浪邮箱,遇到了一些问题。在此记录一下。

“最简单的纯文本邮件”

from email.mime.text import MIMEText
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')# 输入Email地址和口令:
from_addr = input('From: ')
password = input('Password: ')
# 输入收件人地址:
to_addr = input('To: ')
# 输入SMTP服务器地址:
smtp_server = input('SMTP server: ')import smtplib
server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

运行结果报错:

smtplib.SMTPDataError: (553, b'Envolope sender mismatch with header from..')

代码中 msg 的第一个参数不论怎么改都会报相同的错!下面我会提到为什么单独对这个参数进行分析……

msg = MIMEText('XXX', 'plain', 'utf-8')
# “XXX”随便改什么 string

“一封完整的邮件”

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddrimport smtplibdef _format_addr(s):name, addr = parseaddr(s)return formataddr((Header(name, 'utf-8').encode(), addr))from_addr = input('From: ')
password = input('Password: ')
to_addr = input('To: ')
smtp_server = input('SMTP server: ')msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
msg['To'] = _format_addr('管理员 <%s>' % to_addr)
msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

这一次发现打印信息表示发送成功

data: (250, b'ok queue id 420484393705')
send: 'quit\r\n'
reply: b'221 smtp-5-123.smtpsmail.fmail.xd.sinanode.com\r\n'
reply: retcode (221); Msg: b'smtp-5-123.smtpsmail.fmail.xd.sinanode.com'

然而打开收件邮箱查看是否收到时,却发现并没有!然后再次尝试修改 msg 的第一个参数:

msg = MIMEText("from:XXX@sina.comhello, send by Python...", 'plain', 'utf-8')
#“XXX”替换为发件箱的地址

再次尝试,发现——收件箱收到邮件了!

为什么会修改变量 msg ?

在测试“最简单的文本邮件”遇到报错问题时也搜索了很多的解决方案并尝试,其中发现有一种做法就是直接用 string 定义邮件正文内容

msg = """
to:%s
from:%s
Hello,I am smtp server
""" %(to_addr, from_addr)
...
server.sendmail(from_addr, [to_addr], msg)

这个时候发现居然可以收到邮件了(尽管会有“仔细观察,发现如下问题”)!

“Envolope sender mismatch with header from..”

关于这个报错百度了不少解决方案,发现并没有一个跟我发现的情况一样。大概意思应该是 smtp.sina.com 会解析邮件正文内容,如果里面包含“from:XXX@sina.com”信息,与 msg [‘From’] 一致,就算作 match。

但是在具体的各种试验的时候发现还是有点不太理解其中的规则,后面有时间再深入研究一下吧(应该给 smtp.sina.com 提交个 bug 先 :-p)!

一些简单的测试结果:

简单/完整 msg类型 msg值/参数值 发件人定义 测试结果
简单文本 MIMEText 参数1不包含 “From:XXX@sina.com” from_addr = “XXX@sina.com” 报错mismacth
简单文本 MIMEText 参数1包含 “From:XXX@sina.com” from_addr = “XXX@sina.com” 报错mismacth
简单文本 string 不包含string “From:XXX@sina.com” from_addr = “XXX@sina.com” 报错mismacth
简单文本 string 包含string “From:XXX@sina.com” from_addr = “XXX@sina.com” 成功发送 & 接收成功
完整邮件 MIMEText 参数1不包含 “From:XXX@sina.com” from_addr = “XXX@sina.com” 报错mismacth
完整邮件 MIMEText 参数1包含 “From:XXX@sina.com” from_addr = “XXX@sina.com” 报错mismacth
完整邮件 MIMEText 参数1不包含 “From:XXX@sina.com” msg [‘From’] = XXX 发送成功 & 接收失败
完整邮件 MIMEText 参数1包含 “From:XXX@sina.com” msg [‘From’] = XXX 发送成功 & 接收成功

测试@2018/7/29 13:39

发现还有不少问题,HTML内容好像可以成功,但是加上附件了又收不到邮件,不知道为什么。附上测试用的代码,可自行修改对应的用户名、密码进行测试。

测试@2018/7/29 13:50

发现带附件发的话原来进了QQ邮箱的垃圾箱,所以还是可以成功发送并接收的!

# https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432005226355aadb8d4b2f3f42f6b1d6f2c5bd8d5263000from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
import smtplibdef _format_addr(s):name, addr = parseaddr(s)return formataddr((Header(name, 'utf-8').encode(), addr))#定义“结构体”init_smtp_info()
class MyClass():def __init__(self, name = ""):self.name = nameself.data_dic = {}self.index = -1class Struct():def __init__(self, from_addr, password, smtp_server, to_addr, msg):self.from_addr = from_addrself.password = passwordself.smtp_server = smtp_serverself.to_addr = to_addrself.msg = msg#return struct item.def init_smtp_info(self, from_addr, password, smtp_server, to_addr, msg):return self.Struct(from_addr, password, smtp_server, to_addr, msg)#创建smtp_info集实例
smtp_info_collection = MyClass()#通用-直接定义收件人
to_addr = "XXX@XX" #请对应修改指定收件邮箱信息#通用-定义邮件正文内容
msg1 = MIMEText("from:XXX@sina.com, send by Python...", 'plain', 'utf-8') #请对应修改邮箱信息
msg2 = MIMEText("hello, send by Python...", 'plain', 'utf-8')
msg3 = MIMEText('<html><body><h1>Hello</h1>' +'<p>send by <a href="http://www.python.org">Python</a>...</p>' +'</body></html>', 'html', 'utf-8')
#定义带附件的邮件内容
msg4 = MIMEMultipart()
msg4.attach(msg1)
with open('XXX', 'rb') as f: #请对应修改图片文件信息# 设置附件的MIME和文件名,这里是jpg类型:mime = MIMEBase('image', 'jpg', filename='XXX.jpg') #请对应修改图片文件信息# 加上必要的头信息:mime.add_header('Content-Disposition', 'attachment', filename='XXX.jpg') #请对应修改图片文件信息mime.add_header('Content-ID', '<0>')mime.add_header('X-Attachment-Id', '0')# 把附件的内容读进来:mime.set_payload(f.read())# 用Base64编码:encoders.encode_base64(mime)# 添加到MIMEMultipart:msg4.attach(mime)
#确定到底使用哪个msg
msg = msg4#单独-定义发件人(QQ邮箱)from_qq_addr = "XXX@qq.com" #请对应修改QQ邮箱信息
pswd_qq = "XXX" #请对应修改QQ邮箱信息
smtp_qq_server = "smtp.qq.com"#初始化qq邮箱实例
info_qq = smtp_info_collection.init_smtp_info(from_qq_addr,pswd_qq,smtp_qq_server,to_addr,msg)#单独-定义发件人(新浪邮箱)from_sina_addr = "XXX@sina.com" #请对应修改新浪邮箱信息
pswd_sina = "XXX" #请对应修改新浪邮箱信息
smtp_sina_server = "smtp.sina.com"#初始化新浪邮箱实例
info_sina = smtp_info_collection.init_smtp_info(from_sina_addr,pswd_sina,smtp_sina_server,to_addr,msg)#定义被调用的发件人信息(当前新浪邮箱,用#进行切换)
#finalized_info = info_qq
finalized_info = info_sina#通用-定义与发送邮件部分
msg['From'] = _format_addr('Python <%s>' % finalized_info.from_addr)
msg['To'] = _format_addr('Target <%s>' % finalized_info.to_addr)
msg['Subject'] = Header('来自%s的问候……' % finalized_info.from_addr, 'utf-8').encode()#打印完整的msg信息(编码后)
print("\r\n\r\nContent of msg:\r\n"+msg.as_string())#打印与服务器交互信息
print("\r\n\r\n\r\n%s:\r\n" % finalized_info.smtp_server)if finalized_info.smtp_server == "smtp.qq.com":server = smtplib.SMTP_SSL(finalized_info.smtp_server, 465)
elif finalized_info.smtp_server == "smtp.sina.com":server = smtplib.SMTP(finalized_info.smtp_server, 25)server.set_debuglevel(1)
server.login(finalized_info.from_addr, finalized_info.password)if type(msg) == type("string"):server.sendmail(finalized_info.from_addr, [finalized_info.to_addr], msg)
elif type(msg) != type("string"):server.sendmail(finalized_info.from_addr, [finalized_info.to_addr], msg.as_string())server.quit()

关于 Python3.6.3 写简单发送邮件代码时遇到的新浪邮箱(2018/7/29)的问题相关推荐

  1. Django使用新浪邮箱发送邮件

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Django使用新浪邮箱发送邮件 一.参考的资料 二.遇到的问题 一.参考的资料 刘江Django博客教程: 11.Django发送邮 ...

  2. Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)

    加油加油. --WH 一.发送邮件的原理 在了解其原理之前,先要知道两个协议,SMTP和POP3 SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协 ...

  3. web开发(九) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6506027.html>,在此仅供学习参考之用. 一.发送 ...

  4. Linux上的服务器无法调用新浪邮箱发送邮件

    问题背景: 在web网站开发中,有许多功能的实现需要发送邮件,比如用户的密码找回功能,可能就需要通过服务器向用户的注册邮箱发送验证码邮件来实现.而发送邮件功能可以通过很多方式实现,比如HTML中的ma ...

  5. 【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)...

    一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...

  6. Php静默授权,【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)...

    一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...

  7. myeclipse写简单bbs代码_RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?...

    作者:李博@Alex 出自:InfoQ 写作平台 原文:xie.infoq.cn/article/e53e5e24f10b52f50f2e05364 Caffeine是使用Java8对Guava缓存的 ...

  8. python大神写的代码_初学Python,只会写简单的代码。手头有份Python代码,但是调用C模块生成的.pxd和.pyx文件,运行过程总报错,希望大神指点,调试前该做哪些工作呢?...

    报错内容如下: Traceback (most recent call last): File "E:\Python27\setup.py", line 16, in from s ...

  9. python导入pyx文件_初学Python,只会写简单的代码。手头有份Python代码,但是调用C模块生成的.pxd和.pyx文件,运行过程总报错,希望大神指点,调试前该做哪些工作呢?...

    报错内容如下: Traceback (most recent call last): File "E:\Python27\setup.py", line 16, in from s ...

最新文章

  1. 数字图像处理实验(2):PROJECT 02-02, Reducing the Number of Gray Levels in an Image
  2. 数据仓库如何实现湖仓一体数据分析?
  3. 探讨ASP.NET 2.0中的Web控件改进技术(2)
  4. 操作系统:体验Windows 11,不到1M的小工具来了!
  5. 计算机二级C语言易混淆的区别
  6. php factory interface,PHP设计模式之工厂方法*解读
  7. 新版scipy中的imread,imsave,imresize被弃用解决方法
  8. TCP BBR - 如何安装、启动、停止BBR!
  9. JS图片压缩预览/下载
  10. Common lisp编译成C的bin(二)
  11. mysql批量执行sql文件
  12. 离散数学及其应用第六版中文电子书和答案
  13. android 投屏原理图,手机投屏是什么原理
  14. 声音存储空间计算公式_音频中文件大小计算公式(转)
  15. 原 sublime text 批量删除空白行
  16. 现货白银如何计算盈亏
  17. QGIS加载谷歌地图(google map)方法
  18. 《四世同堂》金句摘抄(十)
  19. 【计算机毕业设计】50.课程设计管理系统
  20. python entry如何清空_Python tkinter,从类中清除Entry小部件

热门文章

  1. springboot中接口实例化_无规矩不成方圆,聊一聊 Spring Boot 中 RESTful 接口设计规范...
  2. 极坐标t1t2几何意义_二重积分-换元法-极坐标
  3. 【软考网络管理员】2023年软考网管初级常见知识考点(23)- 路由器的配置
  4. 解决IE浏览器无法重装的问题
  5. fancybox ajax post,发布预览-使用AJAX和Fancybox传递数据
  6. 面向对象及三大特征讲解(图文)
  7. 中M22春C、Java入门练习-7.14
  8. 性能值得期待,AMD Ryzen 5/Ryzen 3处理器模拟测试
  9. 遇见C++ PPL:C++ 的并行和异步
  10. 【甄选靶场】Vulnhub百个项目渗透——项目十六:FristiLeaks_1.3(文件上传,py脚本改写,sudo提权,脏牛提权,源码获取)