2009-02-12 2 views
7

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

import smtplib 
import time 

server = 'smtp.myprovider.com' 
recipients = ['[email protected]'] 
sender = '[email protected]' 
message = 'Subject: [PGS]: Results\n\nBlaBlaBla' 

session = smtplib.SMTP(server) 

session.sendmail(sender,recipients,message); 

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

ответ

6

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

message = 'From: [email protected]\nSubject: [PGS]: Results\n\nBlaBlaBla' 

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

+0

Возможно, объяснение того, что smtplib не включает в себя * любой * заголовок, будет еще более полезным. – tzot

11

вы можете использовать email.message.Message класс, и использовать его для создания пантомимы заголовков, в том числе from:, to: и subject. Отправьте результат as_string() через SMTP.

>>> from email import message 
>>> m1=message.Message() 
>>> m1.add_header('from','[email protected]') 
>>> m1.add_header('to','[email protected]') 
>>> m1.add_header('subject','test') 
>>> m1.set_payload('test\n') 
>>> m1.as_string() 
'from: [email protected]\nto: [email protected]\nsubject: test\n\ntest\n' 
>>> 
11

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

Что означает ваш MUA (почтовый пользовательский агент - т. Е. Внешний вид/Thunderbird и т. Д.), Показывает, что вы являетесь заголовком «From:».

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

headers = "From: %s\nTo: %s\n\n" % (email_from, email_to) 

Формат От заголовка по соглашению обычно "Name" <[email protected]>

Вы должны включить «Сообщение -Id "и заголовок" Reply-To ", а также во всех сообщениях. Тем более, что спам-фильтры могут зависеть от их отсутствия, так как большая вероятность того, что почта является спамом.

Если у вас есть свое почтовое тело в переменном теле, просто скомпилировать общее сообщение с:

message = headers + body 

Примечания двойного символом новой строки в конце заголовков. Также стоит отметить, что серверы SMTP должны отделять заголовки только с новыми линиями (например, LF - linfeed). Тем не менее, я видел Windows SMTP-сервер или два, которые используют \ r \ n (т. Е. CRLF). Если вы работаете в Windows, YMMV.

+0

Я думаю, что в строке заголовков после '' From' есть двоеточие. – Dennis

+0

Вы правы, только что исправлены. –

14

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

пример кода:

#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')), '[email protected]')) 
msg['To'] = '[email protected]' 

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('[email protected]', '[email protected]', msg.as_string()) 
s.quit() 
-1

Попробуйте this-

import smtplib 
email_of_user=input("What is your login email- ") 
password=input("What is your password- ") 
whom_2_send=input("Enter email of whom to send- ") 
email_of_user="[email protected]" 
password="your_password" 
whom_2_send="[email protected]" 
sub=input("What is your email subject- ") 
sender_name=input("What is your name- ") 
reciever_name=input("What is reciever's name- ") 
message = """From:"""+ sender_name +""" 
To:"""+ reciever_name +""" 
MIME-Version: 1.0 
Content-type: text/html 
Subject:"""+ sub +""" 
<p>This is HTML message.</p> 
<h1>This is headline.</h1> 
""" 
Server=smtplib.SMTP("smtp.gmail.com",587) 
Server.starttls() 
Server.login(email_of_user,password) 
Server.sendmail(email_of_user,whom_2_send,message) 
Server.quit() 
print("email send succesfully") 
+0

Добро пожаловать в [so]! Что это делает? Почему это решает проблему OP? которые могут ответить на эти вопросы, не нужны чужой код, потому что они уже это понимают. FWIW, код тоже трудно читать, организуя его в функции (каждый из которых выполняет одну подзадачу и чье имя описывает, что они делают) или даже пустые строки и комментарии. – jpaugh

0

При использовании только smtplib добавить от имени instaead отображения адреса электронной почты просто использовать:

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

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

Смежные вопросы