Как я могу получить получателей электронной почты, используя Python? - PullRequest
0 голосов
/ 29 ноября 2018

Скажем, у меня есть электронное письмо с именем sample.eml, и я хотел бы получить список всех получателей этого письма.Допустим, это выглядит так:

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>
Bcc: spanish.inquisition@example.com, The Dude <big.lebowski@example.net>
Subject: Testing email

This isn't a very fancy email, but I'm just trying to prove a point here, OK?

Я могу вставить это в скрипт Python и разобрать письмо:

from email.parser import BytesParser
from itertools import chain

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>
Bcc: spanish.inquisition@example.com, The Dude <big.lebowski@example.net>
Subject: Testing email

This isn't a very fancy email, but I'm just trying to prove a point here, OK?
'''.strip()
email = BytesParser().parsebytes(msg)

for recipient in chain(email.get_all('to'), email.get_all('cc'), email.get_all('bcc')):
    print('Recipient is:', repr(recipient))

Я ожидаю увидеть что-то вроде:

Recipient is: 'Person Man <person.man@example.com>'
Recipient is: 'Fredrick Douglas <music.man@example.org>'
Recipient is: 'Guido <bdfl@example.com>'
Recipient is: 'FLUFL <barry@example.com>'
Recipient is: 'spanish.inquisition@example.com'
Recipient is: 'The Dude <big.lebowski@example.net>'

Вместо этого я получаю это:

Recipient is: 'Person Man <person.man@example.com>, Fredrick Douglas <music.man@example.org>'
Recipient is: 'Guido <bdfl@example.com>, FLUFL <barry@example.com>'
Recipient is: 'spanish.inquisition@example.com, The Dude <big.lebowski@example.net>'

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 29 ноября 2018

Наилучший способ, который я нашел на данный момент, включает 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

Это полностью действительный адрес электронной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...