smtplib
автоматически не включает заголовок From:
, поэтому вы должны поместить его в себя:
message = 'From: me@example.com\nSubject: [PGS]: Results\n\nBlaBlaBla'
(На самом деле, smtplib
не включает любые заголовки автоматически, но просто отправляет текст, который вы даете ему как сырое сообщение)
При использовании smtplib для добавления имени из имени вместо отображения вашего адреса электронной почты используйте только:
message = """From: whatever-name\nSubject: subject\n\n
body of the message!
""".encode()
Передача этого сообщения через .sendmail (TO, FROM, message) будет работать.
См. этот ответ, он работает для меня.
пример кода:
#send html email
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr
msg = MIMEMultipart('alternative')
msg['From'] = formataddr((str(Header('MyWebsite', 'utf-8')), 'from@mywebsite.com'))
msg['To'] = 'to@email.com'
html = "email contents"
# Record the MIME types of text/html.
msg.attach(MIMEText(html, 'html'))
# Send the message via local SMTP server.
s = smtplib.SMTP('localhost')
# sendmail function takes 3 arguments: sender's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail('from@mywebsite.com', 'to@email.com', msg.as_string())
s.quit()
Вы можете использовать класс email.message.Message и использовать его для создания заголовков mime, включая from:
, to:
и subject
. Отправьте результат as_string()
через SMTP.
>>> from email import message
>>> m1=message.Message()
>>> m1.add_header('from','me@no.where')
>>> m1.add_header('to','myself@some.where')
>>> m1.add_header('subject','test')
>>> m1.set_payload('test\n')
>>> m1.as_string()
'from: me@no.where\nto: myself@some.where\nsubject: test\n\ntest\n'
>>>
«Отправитель», который вы указываете в этом случае, является отправителем конверта, который передается на SMTP-сервер.
Что ваш MUA (Mail User Agent - то есть Outlook / Thunderbird и т. д.) показывает вам это заголовок «From:».
Обычно, если я использую smtplib, я собирал заголовки отдельно:
headers = "From: %s\nTo: %s\n\n" % (email_from, email_to)
Формат заголовка From обычно "Name" <user@domain>
Вы должны включать заголовок «Message-Id» и заголовок «Reply-To», а также во всех сообщениях. Тем более, что спам-фильтры могут зависеть от их отсутствия как большая вероятность того, что почта является спамом.
Если у вас есть тело почты в теле переменной, просто скомпилируйте общее сообщение с помощью:
message = headers + body
Обратите внимание на двойную новую строку в конце заголовков. Также стоит отметить, что серверы SMTP должны отделять заголовки только с новыми линиями (например, LF - linfeed). Тем не менее, я видел Windows SMTP-сервер или два, которые используют\r\n (т. Е. CRLF). Если вы находитесь в Windows, YMMV.