web-dev-qa-db-ja.com

python smtplibを使用して複数の受信者に電子メールを送信する方法

何度も検索したところ、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()
162
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())
267
sorin

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")
123
dvdhns

Eメールの表示アドレスと配信の違いを理解する必要があります。

msg["To"]は基本的に手紙に印刷されているものです。実際には効果がありません。あなたのEメールクライアントは、通常のポストオフィサーと同じように、これがあなたがEメールを送りたい人であると想定するでしょう。

しかし実際の配達はかなり異なる場合があります。だからあなたは完全に違う人のポストボックスにEメール(あるいはコピー)を入れることができます

これにはさまざまな理由があります。たとえば、転送です。 To:ヘッダーフィールドは転送時に変わりませんが、電子メールは別のメールボックスにドロップされます。

smtp.sendmailコマンドは、実際の配信を処理するようになりました。 email.Messageはレターの内容のみで、配信はできません。

低レベルのSMTPでは、受信者を1人ずつ指定する必要があります。そのため、アドレスのリスト(名前は含まない!)が賢明なAPIです。

ヘッダについては、それはまた例えば名前を含むことができる。 To: First Last <[email protected]>, Other User <[email protected]>あなたのコード例では、したがって、推奨されません、それはちょうどあなたがまだ有効で住所がを持っていないではない,でそれを分割することであるため、このメールを配送する失敗しますよう!

36
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())
9
TopSecret_007

そのため実際には、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())
6

私はこのインポート可能なモジュール機能を思い付きました。この例では、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()
6
radtek

私は数ヶ月前にこれを考え出して それについてブログしました 。要約は以下のとおりです。

Smtplibを使用して複数の受信者にEメールを送信したい場合は、email.Message.add_header('To', eachRecipientAsString)を使用してそれらを追加してから、sendmailメソッドを呼び出すと、use email.Message.get_all('To')がすべての受信者にメッセージを送信します。 CcとBccの受信者も同じです。

5
James McPherson
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)
3
Omkar

さて、 this asnwer methodのメソッドは私にはうまくいきませんでした。私は知らない、多分これはPython3(私は3.4バージョンを使っている)かgmailに関連した問題である、しかしいくつかの試みの後、私のために働いた解決策はラインだった

s.send_message(msg)

の代わりに

s.sendmail(sender, recipients, msg.as_string())
2
Antoine
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)    
1
Robie

テキストファイルに受信者のメールを書き込むときにこれを試すことができます

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