Setelah banyak pencarian, saya tidak dapat menemukan cara menggunakan smtplib.sendmail untuk mengirim ke banyak penerima. Masalahnya adalah setiap kali surat dikirimkan, tajuk surat tampaknya berisi banyak alamat, tetapi kenyataannya hanya penerima pertama yang akan menerima email.
Masalahnya tampaknya bahwa email.Message
modul mengharapkan sesuatu yang berbeda dari smtplib.sendmail()
fungsinya.
Singkatnya, untuk mengirim ke banyak penerima, Anda harus mengatur tajuk menjadi serangkaian alamat email yang dibatasi koma. The sendmail()
parameter to_addrs
namun harus daftar alamat email.
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
perlu daftar.for addr in recipients: msg['To'] = addr
dan kemudian berhasil. Banyak tugas sebenarnya menambahkan header 'To' baru untuk masing-masing. Ini adalah antarmuka yang sangat aneh, saya bahkan tidak bisa menjelaskan bagaimana saya berpikir untuk mencobanya. Saya bahkan mempertimbangkansubprocess
untuk menggunakan memanggilsendmail
paket unix untuk menyelamatkan kewarasan saya sebelum saya menemukan ini.Jawaban:
Ini benar-benar berfungsi , saya menghabiskan banyak waktu untuk mencoba berbagai varian.
sumber
tolist =["[email protected]","[email protected]","[email protected]","[email protected]"]
send_message
alih-alihsendmail
sesuai komentar Antoine di bawah ini dan dokumen Python docs.python.org/3/library/email-examples.htmlThe
msg['To']
perlu string:Sementara
recipients
insendmail(sender, recipients, message)
perlu daftar:sumber
smtplib.
recipients
tidak harus menjadi daftar - jika string diberikan, itu diperlakukan sebagai daftar dengan satu elemen. Themsg['To']
String hanya dapat dihilangkan.Anda perlu memahami perbedaan antara yang terlihat alamat email, dan pengiriman .
msg["To"]
pada dasarnya adalah apa yang dicetak pada surat itu. Sebenarnya tidak memiliki efek apa pun. Kecuali bahwa klien surel Anda, sama seperti petugas pos biasa, akan menganggap bahwa ini yang ingin Anda kirimi surel.Namun pengiriman yang sebenarnya dapat bekerja sangat berbeda. Jadi, Anda dapat memasukkan email (atau salinan) ke kotak pos seseorang yang sama sekali berbeda.
Ada berbagai alasan untuk ini. Misalnya penerusan . Bidang
To:
tajuk tidak berubah saat penerusan, namun surel dijatuhkan ke kotak surat lain.The
smtp.sendmail
perintah sekarang mengurus sebenarnya pengiriman.email.Message
adalah isi surat saja, bukan pengiriman.Pada level rendah
SMTP
, Anda perlu memberikan penerima satu-per-satu, itulah sebabnya daftar alamat (tidak termasuk nama!) Adalah API yang masuk akal.Untuk tajuk, dapat juga berisi misalnya nama, misalnya
To: First Last <[email protected]>, Other User <[email protected]>
. Karena itu contoh kode Anda tidak disarankan , karena akan gagal mengirimkan email ini, karena hanya dengan membaginya pada,
Anda masih belum memiliki alamat yang valid!sumber
Ini bekerja untuk saya.
sumber
recipients = ['[email protected]','[email protected]']
membuatnya menjadi string, lalu membaginya menjadi daftar?Saya mencoba di bawah ini dan bekerja seperti pesona :)
sumber
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()
Jadi sebenarnya masalahnya adalah SMTP.sendmail dan email. SIMET membutuhkan dua hal yang berbeda.
email.MIMEText mengatur tajuk "Ke:" untuk isi email. Ini HANYA digunakan untuk menampilkan hasil kepada manusia di ujung lainnya, dan seperti semua header email, harus berupa string tunggal. (Perhatikan bahwa itu sebenarnya tidak ada hubungannya dengan orang yang benar-benar menerima pesan.)
SMTP.sendmail, di sisi lain, mengatur "amplop" pesan untuk protokol SMTP. Perlu daftar string Python, yang masing-masing memiliki satu alamat.
Jadi, yang perlu Anda lakukan adalah menggabungkan dua balasan yang Anda terima. Atur msg ['Ke'] menjadi satu string, tetapi berikan daftar mentah ke sendmail:
sumber
Saya datang dengan fungsi modul yang dapat diimpor ini. Ini menggunakan server email gmail dalam contoh ini. Ini dibagi menjadi header dan pesan sehingga Anda dapat dengan jelas melihat apa yang terjadi:
sumber
Saya menemukan ini beberapa bulan yang lalu dan membuat blog tentang hal itu . Ringkasannya adalah:
Jika Anda ingin menggunakan smtplib untuk mengirim email ke banyak penerima, gunakan
email.Message.add_header('To', eachRecipientAsString)
untuk menambahkannya, dan kemudian ketika Anda memanggil metode sendmail,use email.Message.get_all('To')
kirim pesan ke semuanya. Ditto untuk penerima Cc dan Bcc.sumber
Solusi di bawah ini berhasil untuk saya. Itu berhasil mengirim email ke beberapa penerima, termasuk "CC" dan "BCC."
sumber
Nah, metode dalam metode asnwer ini tidak berhasil untuk saya. Saya tidak tahu, mungkin ini adalah Python3 (saya menggunakan versi 3.4) atau masalah terkait gmail, tetapi setelah beberapa kali mencoba, solusi yang bekerja untuk saya, adalah garis
dari pada
sumber
Saya menggunakan python 3.6 dan kode berikut ini berfungsi untuk saya
sumber
Ini hanya bekerja untuk saya dengan fungsi send_message dan menggunakan fungsi gabung dalam daftar dengan penerima, python 3.6.
sumber
Anda dapat mencoba ini ketika Anda menulis email penerima pada file teks
sumber