Po wielu poszukiwaniach nie mogłem dowiedzieć się, jak używać smtplib.sendmail do wysyłania wiadomości do wielu odbiorców. Problem polegał na tym, że za każdym razem, gdy wiadomość była wysyłana, wydawało się, że nagłówki zawierają wiele adresów, ale tak naprawdę tylko pierwszy adresat otrzymał wiadomość.
Problem polega na tym, że email.Message
moduł oczekuje czegoś innego niż smtplib.sendmail()
funkcja.
Krótko mówiąc, aby wysłać do wielu odbiorców, należy ustawić nagłówek jako ciąg adresów e-mail rozdzielanych przecinkami. sendmail()
Parametr to_addrs
jednak powinna być lista adresów e-mail.
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()
sendmail
potrzebuje listy.for addr in recipients: msg['To'] = addr
i wtedy zadziałało. Wiele przypisań faktycznie dodaje nowy nagłówek „Do” dla każdego. To bardzo dziwny interfejs, nie umiem nawet wyjaśnić, jak go wypróbowałem. Zastanawiałem się nawet, czy niesubprocess
zadzwonić dosendmail
pakietu unix , aby uratować moje zdrowie psychiczne, zanim się zorientowałem.Odpowiedzi:
To naprawdę działa , spędziłem dużo czasu próbując wielu wariantów.
źródło
tolist =["[email protected]","[email protected]","[email protected]","[email protected]"]
send_message
zamiastsendmail
zgodnie z poniższym komentarzem Antoine i dokumentacją Python docs.python.org/3/library/email-examples.htmlmsg['To']
Musi być ciągiem:Podczas gdy
recipients
insendmail(sender, recipients, message)
musi być listą:źródło
smtplib.
recipients
nie musi być listą - jeśli podany zostanie ciąg, jest traktowany jak lista z jednym elementem.msg['To']
Ciąg można po prostu pominąć.Musisz zrozumieć różnicę między widocznym adresem e-mail a dostawą .
msg["To"]
jest zasadniczo tym, co wydrukowano na liście. To nie ma żadnego efektu. Tyle że twój klient poczty, podobnie jak zwykły urzędnik pocztowy, przyjmie, że właśnie do tego chcesz wysłać wiadomość e-mail.Rzeczywista dostawa może jednak działać zupełnie inaczej. Więc może upuścić e-mail (lub kopię) do postu polu kogoś zupełnie innego.
Są tego różne przyczyny. Na przykład przekazywanie . Pole
To:
nagłówka nie zmienia się podczas przekazywania, jednak wiadomość e-mail jest upuszczana w innej skrzynce pocztowej.smtp.sendmail
Komenda teraz dba o rzeczywistej dostawy.email.Message
to tylko treść listu, a nie dostawa.Na niskim poziomie
SMTP
musisz przekazywać odbiorcom jeden po drugim, dlatego lista adresów (bez nazw!) Jest rozsądnym API.W nagłówku może również zawierać na przykład nazwę, np
To: First Last <[email protected]>, Other User <[email protected]>
. Dlatego twój przykładowy kod nie jest zalecany , ponieważ nie powiedzie się dostarczenie tej wiadomości, ponieważ po prostu dzieląc ją na,
ciebie, nadal nie masz prawidłowych adresów!źródło
Mi to pasuje.
źródło
recipients = ['[email protected]','[email protected]']
zamiast zrobić ciąg, a następnie podzielić go, aby utworzyć listę?Próbowałem poniżej i zadziałało to jak urok :)
źródło
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText sender = '[email protected]' rec_list = ['[email protected]', '[email protected]'] rec = ', '.join(rec_list) msg = MIMEMultipart('alternative') msg['Subject'] = 'The required subject' msg['From'] = sender msg['To'] = rec html = ('whatever html code') htm_part = MIMEText(html, 'html') msg.attach(htm_part) send_out = smtplib.SMTP('localhost') send_out.sendmail(sender, rec_list, msg.as_string()) send_out.quit()
Problem polega na tym, że SMTP.sendmail i email.MIMEText potrzebują dwóch różnych rzeczy.
email.MIMEText ustawia nagłówek „Do:” dla treści wiadomości e-mail. Służy TYLKO do wyświetlania wyniku człowiekowi na drugim końcu i, podobnie jak wszystkie nagłówki wiadomości e-mail, musi być pojedynczym ciągiem. (Pamiętaj, że tak naprawdę nie musi to mieć nic wspólnego z osobami, które faktycznie otrzymują wiadomość).
Z drugiej strony SMTP.sendmail ustawia „kopertę” wiadomości dla protokołu SMTP. Potrzebuje listy napisów w języku Python, z których każdy ma jeden adres.
Musisz więc ŁĄCZYĆ dwie otrzymane odpowiedzi. Ustaw msg ['To'] na pojedynczy ciąg, ale przekaż nieprzetworzoną listę do sendmaila:
źródło
Wymyśliłem tę funkcję modułu do importowania. W tym przykładzie używa serwera e-mail Gmail. Podzielony jest na nagłówek i wiadomość, dzięki czemu możesz wyraźnie zobaczyć, co się dzieje:
źródło
Zrozumiałem to kilka miesięcy temu i napisałem o tym na blogu . Podsumowanie to:
Jeśli chcesz używać smtplib do wysyłania wiadomości e-mail do wielu odbiorców, użyj
email.Message.add_header('To', eachRecipientAsString)
ich, aby je dodać, a następnie, gdy wywołasz metodę sendmail,use email.Message.get_all('To')
wyślij wiadomość do wszystkich. To samo dotyczy odbiorców DW i UDW.źródło
Poniższe rozwiązanie działało dla mnie. Z powodzeniem wysyła wiadomość e-mail do wielu odbiorców, w tym „CC” i „BCC”.
źródło
Cóż, metoda w tej metodzie asnwer nie działała dla mnie. Nie wiem, może to jest problem związany z Python3 (używam wersji 3.4) lub Gmailem, ale po kilku próbach rozwiązaniem, które działało dla mnie, było linijka
zamiast
źródło
Używam Pythona 3.6, a następujący kod działa dla mnie
źródło
Działa tylko dla mnie z funkcją send_message i używaniem funkcji dołączania na liście z adresatami, python 3.6.
źródło
możesz tego spróbować, pisząc wiadomości e-mail o adresatach w pliku tekstowym
źródło