Как отправить электронное письмо нескольким получателям, используя 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()

Ответ 1

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

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())

Ответ 3

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

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

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

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

Теперь команда smtp.sendmail заботится о фактической доставке. email.Message - это содержимое только буквы, а не доставка.

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

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

Ответ 4

Это работает для меня.

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())

Ответ 5

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

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())

Ответ 6

Так что на самом деле проблема в том, что 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())

Ответ 7

Я придумал эту функцию импортируемого модуля. В этом примере используется почтовый сервер 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()

Ответ 8

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

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

Ответ 9

Решение ниже работает для меня. Он успешно отправляет электронное письмо нескольким получателям, включая "CC" и "BCC".

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)

Ответ 10

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

s.send_message(msg)

вместо

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

Ответ 11

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

email_send = '[email protected],[email protected]'
server.sendmail(email_user,email_send.split(','),text)    

Ответ 12

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 __name__ == '__main__':
    sender('[email protected],[email protected]')

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

Ответ 13

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

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')

Ответ 14

Я делаю это так:

def send_mail
    msg['Subject'] = subject
    msg['From']    = sender
    msg['To']      = [[email protected],[email protected]]
    msg['Cc']      = [[email protected],[email protected]]
    msg['Bcc']     = [[email protected],[email protected]]
    recips  = [[email protected],[email protected],[email protected],[email protected],[email protected],[email protected]]
    sendmail(sender, recips, msg.as_string())


msg['From']    = sender
msg['To']      = [[email protected],[email protected]]
msg['Cc']      = [[email protected],[email protected]]
msg['Bcc']     = [[email protected],[email protected]]
recips  = [[email protected],[email protected],[email protected],[email protected],[email protected],[email protected]]
sendmail(sender, recips, msg.as_string())