Вы не можете использовать любой заголовок как хотите, это запрещено.
Как указано в Документация ,
исключение email.errors.HeaderParseError
... когда делается попытка создать заголовок, который, кажется, содержит встроенный заголовок (то есть существует то, что должно быть строкой продолжения, которая не имеет начальных пробелов и выглядит какзаголовок).
Почему это опасно и с ним нужно обращаться хорошо?
Сначала вы можете прочитать это , это простой пример того, как можно осуществить атаку по SMTP-заголовку.
Вы можете спросить, как это можно сделать?Я имею в виду, что вы никому не позволяете редактировать свой бэкэнд, верно?
Давайте представим, что для вашего приложения может быть какое-то поле, введенное пользователем, например 'message'
,
msg['message'] = 'abc' #Entered by user
Этохорошо, но что, если
msg['message'] = 'abc\r\nreplyTo:attacker@hello.com'
#or
msg['message'] = 'abc\r\nTo:attacker@hello.com'
Атакующий может легко переопределить вашу электронную почту для отправки спама.Вот почему он делает проверку за вас.
Вы можете даже проверить, безопасен ли заголовок, по
email.header.Header('string')
Давайте посмотрим, как библиотека электронной почты pythonвыполните проверку.
Поиск в исходном коде Lib/email/header.py
В ln50-52:
# Find a header embedded in a putative header value. Used to check for
# header injection attack.
_embedded_header = re.compile(r'\n[^ \t]+:')
Вы можете попробовать это, все, например, выпредоставленный может передать его, кроме того, который вы указали.
Поскольку структура заголовка электронного письма всегда \n(key_without_space):
, поэтому \nhello :
пройдено, но не \nhello:
.