Разбор имен с запятыми из почтового модуля `parseaddr` - PullRequest
0 голосов
/ 08 ноября 2018

email.utils.parseaddr не в состоянии обрабатывать случаи, когда имя указано в формате фамилия, имя (формат, распространенный в метаданных электронной почты).

Пример:

>>> import email.utils

>>> email.utils.parseaddr('Joe A. Smith <smithja@yahoo.com>')  # OK
('Joe A. Smith', 'smithja@yahoo.com')

>>> email.utils.parseaddr('Smith, Joe A. <smithja@yahoo.com>')  # Fails
('', 'Smith')

Это специально разработано?email подразумевает следование RFC 2822 .Спецификация для полной строки определяется как

angle-addr      =       [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr

Но мне неясно, что может составлять "CFWS".Соответствует ли тип возврата ('', 'Smith') RFC?


Информация о версии:

>>> sys.version_info
sys.version_info(major=3, minor=6, micro=6, releaselevel='final', serial=0)

1 Ответ

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

Как определено в разделе 3.2.3 RFC, CFWS - это пробел и комментарии, поэтому здесь он не применяется. Вы хотите взглянуть на следующие определения, разбросанные по грамматике:

name-addr       =       [display-name] angle-addr
display-name    =       phrase
phrase          =       1*word / obs-phrase
word            =       atom / quoted-string
atom            =       [CFWS] 1*atext [CFWS]
atext           = [a bunch of characters not including comma]
obs-phrase      =       word *(word / "." / CFWS)

Из этого видно, что 'Joe A. Smith <smithja@yahoo.com>' допустимо, потому что Joe A. Smith является obs-phrase, но 'Smith, Joe A. <smithja@yahoo.com>' недопустимо, потому что запятые не допускаются в atom или obs-phrase. Вместо этого вы должны использовать quoted-string:

>>> email.utils.parseaddr('"Smith, Joe A." <smithja@yahoo.com>')
('Smith, Joe A.', 'smithja@yahoo.com')
...