python3 SMTP 发送邮件时用到的 email 模块的一个疑问,求大神指教!

2018-01-23 15:59:26 +08:00
 Ctry

首先导入各模块: import smtplib from email.mime.text import MIMEText from email.header import Header

然后创建 MIMEText 对象: msg = MIMEText('Python3 邮件发送测试', 'plain', 'utf-8')

之后是设置三个头部信息:From、To、Subject。

最后创建 SMTP 对象后使用 SMTP.sendmail(sender, receivers, msg.as_string())方法发送。

问题就是: 发送邮件时使用了 msg.as_string()方法将 MIMEText 对象转化成字符串。但是 as_string()方法是 Message 类定义的方法,为什么这里 MIMEText 对象也可以使用该方法?我查询后并没有直接的继承关系。

有没有知道的大神,指教一下,万分感谢!

2984 次点击
所在节点    Python
11 条回复
Ctry
2018-01-23 16:16:38 +08:00
有没有人了解的,或者知道相关资料的?感谢告知!
cxh116
2018-01-23 16:17:06 +08:00
import email.mime.text
import inspect
print(inspect.getmro(email.mime.text.MIMEText))


(<class 'email.mime.text.MIMEText'>, <class 'email.mime.nonmultipart.MIMENonMultipart'>, <class 'email.mime.base.MIMEBase'>, <class 'email.message.Message'>, <class 'object'>)


其实直接翻源码最快. /usr/lib/python3.6/email
cxh116
2018-01-23 16:19:29 +08:00
用 inspect 模块分析, 没有直接继承,但有间接.

源码地址 https://github.com/python/cpython/blob/master/Lib/email/mime/text.py
keithszc
2018-01-23 16:23:57 +08:00
用 pycharm 查了一下,3 次继承就到了 Message 类
Ctry
2018-01-23 16:25:34 +08:00
@cxh116 感谢感谢!我知道了,原来是 mro 列表中有 Message 类。哎,自己不知道 inspect 模块相关用法,学习了。谢谢!
Ctry
2018-01-23 16:26:42 +08:00
@keithszc 感谢!我知道了
zhengxiaowai
2018-01-23 16:56:58 +08:00
smtplib 这种古董到老掉牙的库,接口及其难用,快放弃。

使用 yagmail 优美的发送邮件
Ctry
2018-01-23 17:31:59 +08:00
@zhengxiaowai 可以,我先把标准库了解了解,然后去学习第三方库。
weyou
2018-01-23 21:27:19 +08:00
@zhengxiaowai 这个只能发 Gmail 吧
MyDaLin
2018-01-24 09:16:20 +08:00
我是来学习的
Ctry
2018-01-24 10:49:13 +08:00
@MyDaLin 一起学习。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/425280

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX