何度も検索したところ、smtplib.sendmailを使用して複数の受信者に送信する方法を見つけることができませんでした。問題は、メールが送信されるたびにメールヘッダに複数のアドレスが含まれているように見えることでしたが、実際には最初の受信者だけがEメールを受信します。
問題は、 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()
これ本当にうまくいきました、私は複数の変種を試すのに多くの時間を費やしました。
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())
msg['To']
は文字列である必要があります。
msg['To'] = "[email protected], [email protected], [email protected]"
sendmail(sender, recipients, message)
のrecipients
はリストである必要がありますが:
sendmail("[email protected]", ["[email protected]", "[email protected]", "[email protected]"], "Howdy")
Eメールの表示アドレスと配信の違いを理解する必要があります。
msg["To"]
は基本的に手紙に印刷されているものです。実際には効果がありません。あなたのEメールクライアントは、通常のポストオフィサーと同じように、これがあなたがEメールを送りたい人であると想定するでしょう。
しかし実際の配達はかなり異なる場合があります。だからあなたは完全に違う人のポストボックスにEメール(あるいはコピー)を入れることができます。
これにはさまざまな理由があります。たとえば、転送です。 To:
ヘッダーフィールドは転送時に変わりませんが、電子メールは別のメールボックスにドロップされます。
smtp.sendmail
コマンドは、実際の配信を処理するようになりました。 email.Message
はレターの内容のみで、配信はできません。
低レベルのSMTP
では、受信者を1人ずつ指定する必要があります。そのため、アドレスのリスト(名前は含まない!)が賢明なAPIです。
ヘッダについては、それはまた例えば名前を含むことができる。 To: First Last <[email protected]>, Other User <[email protected]>
。 あなたのコード例では、したがって、推奨されません、それはちょうどあなたがまだ有効で住所がを持っていないではない,
でそれを分割することであるため、このメールを配送する失敗しますよう!
わたしにはできる。
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())
私は以下を試してみました、そしてそれは魅力のように働きました:)
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())
そのため実際には、SMTP.sendmailとemail.MIMETextには2つの異なることが必要です。
email.MIMETextは、Eメールの本文に「To:」ヘッダーを設定します。それは、相手方に結果を表示するためにのみ使用され、すべての電子メールヘッダーと同様に、単一の文字列である必要があります。 (実際にメッセージを受信した人とは関係ないということに注意してください。)
一方、SMTP.sendmailはSMTPプロトコル用のメッセージの「エンベロープ」を設定します。 Pythonの文字列リストが必要です。それぞれの文字列は単一のアドレスを持ちます。
だから、あなたがする必要があるのはあなたが受け取った2つの返事を結合することです。 msg ['To']を単一の文字列に設定しますが、生のリストをsendmailに渡します。
emails = ['a.com','b.com', 'c.com']
msg['To'] = ', '.join( emails )
....
s.sendmail( msg['From'], emails, msg.as_string())
私はこのインポート可能なモジュール機能を思い付きました。この例では、Gmailの電子メールサーバーを使用しています。ヘッダーとメッセージに分割されているので、はっきりしていることがわかります。
import smtplib
def send_alert(subject=""):
to = ['[email protected]', 'email2@another_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()
私は数ヶ月前にこれを考え出して それについてブログしました 。要約は以下のとおりです。
Smtplibを使用して複数の受信者にEメールを送信したい場合は、email.Message.add_header('To', eachRecipientAsString)
を使用してそれらを追加してから、sendmailメソッドを呼び出すと、use email.Message.get_all('To')
がすべての受信者にメッセージを送信します。 CcとBccの受信者も同じです。
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)
さて、 this asnwer methodのメソッドは私にはうまくいきませんでした。私は知らない、多分これはPython3(私は3.4バージョンを使っている)かgmailに関連した問題である、しかしいくつかの試みの後、私のために働いた解決策はラインだった
s.send_message(msg)
の代わりに
s.sendmail(sender, recipients, msg.as_string())
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のjoin関数を使うことだけでうまくいきました。
私はpython 3.6を使っていて、以下のコードがうまくいきます。
email_send = '[email protected],[email protected]'
server.sendmail(email_user,email_send.split(','),text)
テキストファイルに受信者のメールを書き込むときにこれを試すことができます
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')