it-roy-ru.com

Как отправить письмо нескольким получателям, используя python smtplib?

После долгих поисков я не смог выяснить, как использовать smtplib.sendmail для отправки нескольким получателям. Проблема заключалась в том, что каждый раз, когда письмо отправлялось, заголовки писем содержали несколько адресов, но на самом деле только первый получатель получал письмо.

Кажется, проблема в том, что модуль email.Message ожидает что-то отличное от функции smtplib.sendmail() .

Короче говоря, чтобы отправить нескольким получателям, вы должны установить заголовок в виде строки адресов электронной почты, разделенных запятыми. Однако параметр sendmail()to_addrs должен быть списком адресов электронной почты.

from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import smtplib

msg = MIMEMultipart()
msg["Subject"] = "Example"
msg["From"] = "[email protected]"
msg["To"] = "[email protected],[email protected],[email protected]"
msg["Cc"] = "[email protected],[email protected]"
body = MIMEText("example email body")
msg.attach(body)
smtp = smtplib.SMTP("mailhost.example.com", 25)
smtp.sendmail(msg["From"], msg["To"].split(",") + msg["Cc"].split(","), msg.as_string())
smtp.quit()
149
user1148320

Это действительно работает , я потратил много времени, пытаясь несколько вариантов.

import smtplib
from email.mime.text import MIMEText

s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = '[email protected]'
recipients = ['[email protected]', '[email protected]']
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = ", ".join(recipients)
s.sendmail(sender, recipients, msg.as_string())
254
sorin

Код msg['To'] должен быть строкой:

msg['To'] = "[email protected], [email protected], [email protected]"

Хотя recipients в sendmail(sender, recipients, message) должен быть списком:

sendmail("[email protected]", ["[email protected]", "[email protected]", "[email protected]"], "Howdy")
121
dvdhns

Вам необходимо понять разницу между адресом электронной почты visible и адресом delivery.

msg["To"] по сути то, что напечатано на письме. На самом деле это не имеет никакого эффекта. За исключением того, что ваш почтовый клиент, как и обычный почтальон, будет считать, что вы хотите отправить это письмо.

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

Для этого есть разные причины. Например forwarding. Поле заголовка To: не изменяется при пересылке, однако электронное письмо помещается в другой почтовый ящик.

Команда smtp.sendmail теперь заботится о доставке actual. email.Message только содержание письма, а не доставка.

В низкоуровневом SMTP необходимо указывать получателей по одному, поэтому разумным API является список адресов (не считая имен!).

Для заголовка он также может содержать, например, имя, например, To: First Last <[email protected]>, Other User <[email protected]>. Ваш пример кода поэтому не рекомендуется , так как он не сможет доставить это письмо, так как, просто разбив его на ,, вы все равно не получите действительные адреса!

34
Anony-Mousse

Меня устраивает.

import smtplib
from email.mime.text import MIMEText

s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = '[email protected]'
recipients = '[email protected],[email protected]'
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = recipients
s.sendmail(sender, recipients.split(','), msg.as_string())
13
coolguy

Я попробовал ниже, и это сработало как шарм :)

rec_list =  ['[email protected]', '[email protected]']
rec =  ', '.join(rec_list)

msg['To'] = rec

send_out = smtplib.SMTP('localhost')
send_out.sendmail(me, rec_list, msg.as_string())
8
TopSecret_007

Я придумал эту импортируемую функцию модуля. В этом примере он использует почтовый сервер Gmail. Он разделен на заголовок и сообщение, чтобы вы могли четко видеть, что происходит:

import smtplib

def send_alert(subject=""):

    to = ['[email protected]', '[email protected]_email.com', '[email protected]']
    gmail_user = '[email protected]'
    gmail_pwd = 'my_pass'
    smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo
    smtpserver.login(gmail_user, gmail_pwd)
    header = 'To:' + ", ".join(to) + '\n' + 'From: ' + gmail_user + '\n' + 'Subject: ' + subject + '\n'
    msg = header + '\n' + subject + '\n\n'
    smtpserver.sendmail(gmail_user, to, msg)
    smtpserver.close()
6
radtek

Я понял это несколько месяцев назад и написал об этом в блоге . Резюме:

Если вы хотите использовать smtplib для отправки электронной почты нескольким получателям, используйте email.Message.add_header('To', eachRecipientAsString) для их добавления, а затем при вызове метода sendmail use email.Message.get_all('To') отправьте сообщение всем им. То же самое для Cc и Bcc получателей.

5
James McPherson

Так что на самом деле проблема в том, что SMTP.sendmail и email.MIMEText нужны две разные вещи.

email.MIMEText устанавливает заголовок «Кому:» для тела письма. Он используется ТОЛЬКО для отображения результата человеку на другом конце, и, как и все заголовки электронной почты, должен быть одной строкой. (Обратите внимание, что на самом деле это не имеет ничего общего с людьми, которые фактически получают сообщение.)

SMTP.sendmail, с другой стороны, устанавливает «конверт» сообщения для протокола SMTP. Ему нужен список строк Python, каждая из которых имеет один адрес.

Итак, что вам нужно сделать, это объединить два ответа, которые вы получили. Установите msg ['To'] в одну строку, но передайте необработанный список в sendmail:

emails = ['a.com','b.com', 'c.com']
msg['To'] = ', '.join( emails ) 
....
s.sendmail( msg['From'], emails, msg.as_string())
4
SaiSandeep Golla

Ну, метод в этот asnwer метод не работает для меня. Я не знаю, может быть, это проблема Python3 (я использую версию 3.4) или gmail, но после некоторых попыток решение, которое работало для меня, было

s.send_message(msg)

вместо

s.sendmail(sender, recipients, msg.as_string())
2
Antoine

Я использую Python 3.6 и следующий код работает для меня

email_send = '[email protected],[email protected]'
server.sendmail(email_user,email_send.split(','),text)    
1
Robie
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def sender(recipients): 

    body = 'Your email content here'
    msg = MIMEMultipart()

    msg['Subject'] = 'Email Subject'
    msg['From'] = '[email protected]'
    msg['To'] = (', ').join(recipients.split(','))

    msg.attach(MIMEText(body,'plain'))

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login('[email protected]', 'yourpassword')
    server.send_message(msg)
    server.quit()

if __== '__main__':
    sender('[email protected],[email protected]')

У меня это работало только с функцией send_message и с использованием функции соединения в списке с получателями, python 3.6. 

0
Guilherme Henrique Mendes
Below worked for me.
It sends email to multiple with attachment - "To", "Cc" & "Bcc" successfully.


toaddr = ['mailid_1','mailid_2']
cc = ['mailid_3','mailid_4']
bcc = ['mailid_5','mailid_6']
subject = 'Email from Python Code'
fromaddr = 'sender_mailid'
message = "\n  !! Hello... !!"

msg['From'] = fromaddr
msg['To'] = ', '.join(toaddr)
msg['Cc'] = ', '.join(cc)
msg['Bcc'] = ', '.join(bcc)
msg['Subject'] = subject

s.sendmail(fromaddr, (toaddr+cc+bcc) , message)
0
Omkar

вы можете попробовать это, когда пишете письма получателя в текстовом файле.

from email.mime.text import MIMEText
from email.header import Header
import smtplib

f =  open('emails.txt', 'r').readlines()
for n in f:
     emails = n.rstrip()
server = smtplib.SMTP('smtp.uk.xensource.com')
server.ehlo()
server.starttls()
body = "Test Email"
subject = "Test"
from = "[email protected]"
to = emails
msg = MIMEText(body,'plain','utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] =  Header(from, 'utf-8')
msg['To'] = Header(to, 'utf-8')
text = msg.as_string()
try:
   server.send(from, emails, text)
   print('Message Sent Succesfully')
except:
   print('There Was An Error While Sending The Message')
0
Skiller Dz