Наилучший способ, который я нашел на данный момент, включает email.utils
.
for recipient in getaddresses(
chain(email.get_all('to', []), email.get_all('cc', []), email.get_all('bcc', []))
):
print('The recipient is: ', recipient)
Из документов по адресам getaddress :
Этот метод возвращаетсписок из двух кортежей формы, возвращаемых parseaddr ().fieldvalues - это последовательность значений полей заголовка, которые могут быть возвращены Message.get_all.
get_all
вернет None
, если заголовок отсутствует, если вы не передаете значение по умолчанию, поэтому get_all('to', [])
хорошая идея.
Это сообщение имеет дополнительное преимущество, заключающееся в правильном разборе очень ужасных, но вполне допустимых адресов электронной почты:
msg = b"""
From: wayne@example.com
To: Person Man <person.man@example.com>, Fredrick Douglas <music.man@example.org>
Cc: Guido <bdfl@example.com>, FLUFL <barry@example.com> ,"Abc\@def"@example.com ,"Fred Bloggs"@example.com ,"Joe\\Blow"@example.com ,"Abc@def"@example.com ,customer/department=shipping@example.com ,\$A12345@example.com ,!def!xyz%abc@example.com ,_somename@example.com, much."more\ unusual"@example.com, very.unusual."@".unusual.com@example.com, very."(),:;<>[]".VERY."very@\\"very".unusual@strange.example.com
Subject: Testing email
This isn't a very fancy email, but I'm just trying to prove a point here, OK?
""".strip()
Простое разбиение на ,
не будетправильно обрабатывать:
very."(),:;<>[]".VERY."very@\\"very".unusual@strange.example.com
Это полностью действительный адрес электронной почты.