parseaddr函数和formataddr函数的用法

2019年7月20日 / 32次阅读 / Last Modified 2019年8月8日
Email

parseaddr函数和formataddr函数,都来自email.utils模块,用来在发送Email的时候,“美化”地址中的姓名部分。本文介绍如何使用这两个函数。

引入parsesaddr和formataddr

from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

由于下面的示例代码要用到Header和MIMEText,所以一并引入了。

带姓名的Email地址格式

一般情况下,我们使用Email,地址都是直接写成这样(1):123456@qq.com,纯Email,不带姓名。写成这样没问题,在使用工具或代码(例如MIMEText对象)编写Email内容的时候,地址都可以直接写成这样。

但是,这个时候,地址还有另外一种写法(2):name<123456@qq.com>,将姓名放在Email地址前面。这种写法增加了姓名,并用尖括号将Email地址括起来,这种写法会让您发出的邮件,看起来更加专业。

按照第1种写法设置发件人,收到邮件时,地址显示是这样的:

不带姓名的邮件地址格式
不带姓名的邮件地址格式

而如果采用第2种写法发送Email,收到邮件时,地址显示就会变成这样:

带姓名的邮件地址格式
带姓名的邮件地址格式

这就是带姓名的Email邮件地址格式!

有的时候,我们使用第1种Email地址发邮件,对方在邮件工具中打开时,还是能看到地址前的姓名,比如QQ信箱。这是因为你的邮件地址在对方的邮件工具里有保存,显示邮件的时候,邮件工具默认将此地址保存的姓名显示了出来。如果对方邮件工具没有保存你的邮件,就不会出现这个现象。

如何 parsesaddr和formataddr

parseaddr 函数和 formataddr 函数就是用来合成这种符合Email标准的带姓名的地址格式的。我们继续上一篇的内容,用Python发送Email的技巧,这一篇就是介绍在发送Email的时候,如何使用带姓名的Email地址格式。

>>> From = 'pynote.net<from@qq.com>'
>>> name, addr = parseaddr(From)
>>> fromaddr = formataddr((Header(name,'utf-8').encode(), addr))
>>> fromaddr
'=?utf-8?q?pynote=2Enet?= <from@qq.com>'
>>> 
>>> To = 'mylove<babylove@qq.com>'
>>> name, addr = parseaddr(To)
>>> name
'mylove'
>>> addr
'babylove@qq.com'
>>> toaddr = formataddr((Header(name,'utf-8').encode(), addr))
>>> toaddr
'=?utf-8?q?mylove?= <babylove@qq.com>'

将带姓名的Email格式作为参数,给parseaddr函数,得到name和addr。name就是姓名,addr就是纯Email,请看parseaddr解析To后的打印显示。然后formataddr函数再将name和addr转换成标准Email地址格式。注意name还要经过Header函数的编码。高亮的两行,就是最后我们可以使用的地址字符串。我们来使用一下:

>>> msg_str = 'this is a name-based email address test'
>>> msg = MIMEText(msg_str, 'plain', 'utf-8')
>>> msg['From'] = fromaddr
>>> msg['To'] = toaddr
>>> msg['Subject'] = Header('python email test', 'utf-8').encode()
>>> smtp = smtplib.SMTP_SSL('smtp.qq.com')
>>> smtp.login('from@qq.com', 'passwd')
(235, b'Authentication successful')
>>> smtp.sendmail('from@qq.com', 'babylove@qq.com', msg.as_string())
{}
>>> smtp.quit()
(221, b'Bye')

msg['From']和msg['To']直接使用formataddr后的字符串,如果有多个这样的字符串地址,用逗号(,)分开。但是sendmail函数不使用编码后的带姓名的Email地址字符串,还是使用纯Email地址,这个细节要注意。带姓名的Email地址的编码,只是改变邮件内容的头部,而不改变投递细节。

小工具

这个函数小工具,合并了 parseaddr和formataddr功能,输入 以第2种方式编写的Email地址,得到直接可以在MIMEText中使用字符串,请收藏:

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name,'utf-8').encode(), addr))

这个函数还自带了一定能的容错性:

>>> _format_addr('godaddy<1123456@hotmail.com>')
'=?utf-8?q?godaddy?= <1123456@hotmail.com>'
>>> _format_addr('1123456@hotmail.com')
'1123456@hotmail.com'
>>> _format_addr('<1123456@hotmail.com>')
'1123456@hotmail.com'
>>> _format_addr('pythonisgood<1123456@hotmail.com>')
'=?utf-8?q?pythonisgood?= <1123456@hotmail.com>'
>>> _format_addr('pythonisgood')
'pythonisgood'
>>> _format_addr('')
''

parseaddr和formataddr函数的使用并不难,关键是要里面Email的地址格式,本文就介绍这么多啦。

-- EOF --

本文链接:https://www.pynote.net/archives/630

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top