добавить имя отправителя в поле от электронной почты в python

Я пытаюсь отправить электронное письмо с кодом ниже.

import smtplib
from email.mime.text import MIMEText

sender = '[email protected]'

def mail_me(cont, receiver):
    msg = MIMEText(cont, 'html')
    recipients = ",".join(receiver)
    msg['Subject'] = 'Test-email'
    msg['From'] = "XYZ ABC"
    msg['To'] = recipients
    # Send the message via our own SMTP server.
    try:
        s = smtplib.SMTP('localhost')
        s.sendmail(sender, receiver, msg.as_string())
        print "Successfully sent email"
    except SMTPException:
        print "Error: unable to send email"
    finally:
        s.quit()


cont = """\
   <html>
     <head></head>
     <body>
       <p>Hi!<br>
          How are you?<br>
          Here is the <a href="http://www.google.com">link</a> you wanted.
       </p>
     </body>
   </html>
   """
mail_me(cont,['xyz@xyzcom'])

Я хочу, чтобы «XYZ ABC» отображалось как имя отправителя при получении электронного письма, а его адрес электронной почты — как «[email protected]». но когда я получаю электронную почту, я получаю странные данные в полях «от» сообщения электронной почты.

[![from:    XYZ@<machine-hostname-appearing-here>
reply-to:   XYZ@<machine-hostname-appearing-here>,
ABC@<machine-hostname-appearing-here>][1]][1]

Я приложил скриншот письма, которое я получил.

как я могу исправить это в соответствии с моими потребностями.


person cool77    schedule 06.06.2017    source источник
comment
Вы успешно настроили свой собственный smtp-сервер?   -  person Gahan    schedule 06.06.2017


Ответы (6)


Это должно работать:

msg['From'] = "Your name <Your email>"

Пример ниже:

import smtplib
from email.mime.text import MIMEText

def send_email(to=['[email protected]'], f_host='example.example.com', 
f_port=587, f_user='[email protected]', f_passwd='example-pass', 
subject='default subject', message='content message'):
smtpserver = smtplib.SMTP(f_host, f_port)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(f_user, f_passwd) # from email credential
msg = MIMEText(message, 'html')
msg['Subject'] = 'My custom Subject'
msg['From'] = "Your name <Your email>"
msg['To'] = ','.join(to)
for t in to:
    smtpserver.sendmail(f_user, t, msg.as_string())  # you just need to add 
this in for loop in your code.
    smtpserver.close()
print('Mail is sent successfully!!')


cont = """\
<html>
 <head></head>
 <body>
   <p>Hi!<br>
      How are you?<br>
      Here is the <a href="http://www.google.com">link</a> you wanted.
   </p>
 </body>
</html>
"""
try:
send_email(message=cont)
except:
print('Mail could not be sent')
person Matheus Candido    schedule 14.12.2017
comment
Добро пожаловать в Stack Overflow! В общем, предпочтительнее предоставить ответ с объяснением, а может быть и полным примером. - person Arian Acosta; 15.12.2017
comment
@ArianAcosta вот оно. - person Matheus Candido; 15.12.2017
comment
Работает отлично! благодаря. Однако я заметил, что некоторые почтовые клиенты (например, более старые версии Outlook) отображали ‹[email protected]› в папке «Входящие» в качестве отправителя. Я думаю, что правильный способ сделать это - импортировать from email.header import Header и from email.utils import formataddr и сделать: msg['From'] = formataddr((str(Header('Your name', 'utf-8')), '[email protected]')). - person noamyg; 12.05.2019
comment
Просто хочу добавить новый случай. Это никогда не проходит, когда я использую такой текст "Company Name CO., LTD <email>". Но это сработает, когда я напишу "(Company Name CO., LTD) <email>". python 3.7 - person ; 29.11.2019
comment
Цикл for здесь не нужен. Согласно официальной документации, второй параметр функции sendmail представляет собой список адресных строк RFC 822 (голая строка будет рассматриваться как список с 1 адресом). Вместо этого мы можем просто использовать smtpserver.sendmail(f_user, to, msg.as_string()) для простоты кода. - person luke; 01.05.2020
comment
Кроме того, если вы хотите следовать исходному примеру кода, отступ строки smtpserver.close() должен быть удален, чтобы иметь возможность отправлять на несколько адресов электронной почты. - person luke; 01.05.2020
comment
Этот код отправляет электронные письма, но у меня есть проблема. Имя моей учетной записи Google — TheGreatKings, но это отправляет электронную почту как thegreatkings, то есть без верблюжьего регистра. Любое решение??? - person xaif; 20.08.2020
comment
@noamyg Я попробовал вашу стратегию в поле msg['From'], как указано выше, имя выглядит великолепно, но электронная почта всегда отображается как адрес Gmail. Что должен делать бит [email protected]? - person fazistinho_; 18.11.2020
comment
@HiFizzle_ посмотрите, поможет ли вам этот пост: stackoverflow.com/a/56101240/3367818. - person noamyg; 19.11.2020

Только что протестировал следующий код с gmx.com, и он отлично работает. Хотя вопрос о том, получите ли вы такой же пробег, является спорным.
Я заменил все ссылки на мою почтовую службу на gmail.

#!/usr/bin/python

#from smtplib import SMTP # Standard connection
from smtplib import SMTP_SSL as SMTP #SSL connection
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

sender = '[email protected]'
receivers = ['[email protected]']


msg = MIMEMultipart()
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
msg['Subject'] = 'simple email via python test 1'
message = 'This is the body of the email line 1\nLine 2\nEnd'
msg.attach(MIMEText(message))

ServerConnect = False
try:
    smtp_server = SMTP('smtp.gmail.com','465')
    smtp_server.login('#name#@gmail.com', '#password#')
    ServerConnect = True
except SMTPHeloError as e:
    print "Server did not reply"
except SMTPAuthenticationError as e:
    print "Incorrect username/password combination"
except SMTPException as e:
    print "Authentication failed"

if ServerConnect == True:
    try:
        smtp_server.sendmail(sender, receivers, msg.as_string())
        print "Successfully sent email"
    except SMTPException as e:
        print "Error: unable to send email", e
    finally:
        smtp_server.close()
person Rolf of Saxony    schedule 06.06.2017

Это должно исправить это:

Замените mail_me(cont,['xyz@xyzcom']) на

mail_me(cont,'[email protected]')
person Sreetam Das    schedule 06.06.2017
comment
Неа. что не решает проблему. более того, smtplib принимает адрес электронной почты получателя в виде списка. поэтому не может заменить его как строку - person cool77; 06.06.2017

Название происходит от заголовка FROM. Обратитесь к этому ответу, пожалуйста, Укажите отправителя при отправке почты с помощью Python ( смтплиб)

person kawadhiya21    schedule 06.06.2017
comment
да. если вы видите код, я использовал From в заголовке. msg['От'] = XYZ ABC - person cool77; 06.06.2017

Пробел не является допустимым символом в адресе электронной почты. Специальные символы допускаются только во внешнем представлении, которое должно быть заключено в двойные кавычки. Кроме того, большинство SMTP-серверов фактически используют перезапись заголовков, чтобы гарантировать, что адреса имеют стандартный формат. Поскольку ваш фактически содержит пробел, он разделен и, поскольку он не заключен в кавычки, к нему добавляется адрес сервера.

Вам нужно просто заменить msg['From'] = "XYZ ABC" на

msg['From'] = '"XYZ ABC"'

принудительное включение адреса в двойные кавычки.

person Serge Ballesta    schedule 06.06.2017

import smtplib
from email.mime.text import MIMEText

def send_email(to=['[email protected]'], f_host='example.example.com', f_port=587, f_user='[email protected]', f_passwd='example-pass', subject='default subject', message='content message'):
    smtpserver = smtplib.SMTP(f_host, f_port)
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo
    smtpserver.login(f_user, f_passwd) # from email credential
    msg = MIMEText(message, 'html')
    msg['Subject'] = 'My custom Subject'
    msg['From'] = "Admin"
    msg['To'] = ','.join(to)
    for t in to:
        smtpserver.sendmail(f_user, t, msg.as_string())  # you just need to add this in for loop in your code.
        smtpserver.close()
    print('Mail is sent successfully!!')


cont = """\
   <html>
     <head></head>
     <body>
       <p>Hi!<br>
          How are you?<br>
          Here is the <a href="http://www.google.com">link</a> you wanted.
       </p>
     </body>
   </html>
   """
try:
    send_email(message=cont)
except:
    print('Mail could not be sent')

Вышеупомянутый метод я пытался отправить почту, которая работает для меня, даже если я могу отправить почту на свою учетную запись gmail (в папку со спамом). Дайте мне знать, если вы столкнетесь с любой другой связанной проблемой.

person Gahan    schedule 06.06.2017