Укажите отправителя при отправке почты с Python (smtplib) - PullRequest
9 голосов
/ 12 февраля 2009

У меня есть очень простой кусок кода (только для тестирования):

import smtplib
import time

server = 'smtp.myprovider.com'
recipients = ['johndoe@somedomain.com']
sender = 'me@mydomain.com'
message = 'Subject: [PGS]: Results\n\nBlaBlaBla'

session = smtplib.SMTP(server)

session.sendmail(sender,recipients,message);

Это работает, но проблема в том, что почтовые клиенты не отображают отправителя. Я хочу иметь возможность добавить имя отправителя в электронное письмо. Предложения?

Ответы [ 5 ]

14 голосов
/ 03 ноября 2014

См. этот ответ, он работает для меня.

пример кода:

#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()
12 голосов
/ 12 февраля 2009

Вы можете использовать класс 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'
>>> 
11 голосов
/ 12 февраля 2009

«Отправитель», который вы указываете в этом случае, является отправителем конверта, который передается на SMTP-сервер.

То, что показывает ваш MUA (почтовый пользовательский агент - т.е. outlook / Thunderbird и т. Д.), Является заголовком «От:».

Обычно, если я использую 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). Однако я видел один или два SMTP-сервера Windows, которые используют \ r \ n (т.е. CRLF). Если вы на Windows, YMMV.

9 голосов
/ 12 февраля 2009

smtplib автоматически не включает заголовок From:, поэтому вы должны поместить его в себя:

message = 'From: me@example.com\nSubject: [PGS]: Results\n\nBlaBlaBla'

(На самом деле smtplib не включает любых заголовков автоматически, а просто отправляет текст, который вы даете, в виде необработанного сообщения)

0 голосов
/ 30 декабря 2017

Если вы просто используете smtplib для добавления имени от имени вашего адреса электронной почты, просто используйте:

message = """From: whatever-name\nSubject: subject\n\n
body of the message!
""".encode()

Передача этого сообщения через .sendmail (TO, FROM, message) будет работать.

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