262

多くの検索の後、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"] = "me@example.com"
msg["To"] = "malcom@example.com,reynolds@example.com,firefly@example.com"
msg["Cc"] = "serenity@example.com,inara@example.com"
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()
4

15 に答える 15

392

これは本当にうまくいきます。私は多くの時間をかけて複数のバリエーションを試しました。

import smtplib
from email.mime.text import MIMEText

s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = 'me@example.com'
recipients = ['john.doe@example.com', 'john.smith@example.co.uk']
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = ", ".join(recipients)
s.sendmail(sender, recipients, msg.as_string())
于 2012-09-14T10:44:00.850 に答える
180

msg['To']文字列である必要があります:

msg['To'] = "a@b.com, b@b.com, c@b.com"

recipientsinはリストであるsendmail(sender, recipients, message)必要がありますが:

sendmail("a@a.com", ["a@b.com", "b@b.com", "c@b.com"], "Howdy")
于 2015-01-28T22:43:53.760 に答える
56

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

msg["To"]基本的に手紙に印刷されているものです。実際には何の効果もありません。ただし、メール クライアントは、通常の郵便局員と同様に、メールの送信先がこの人物であると想定します。

ただし、実際の配信はまったく異なる場合があります。そのため、メール (またはコピー) をまったく別の人のポストにドロップできます。

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

smtp.sendmailコマンドが実際の配信を処理するようになりました。email.Messageは手紙の内容であり、配達ではありません。

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

ヘッダーの場合、名前などを含めることもできますTo: First Last <email@addr.tld>, Other User <other@mail.tld>あなたのコード例は、このメールの配信に失敗するため、お勧めしません。なぜなら、メールを分割するだけで,はまだ有効なアドレスがないからです!

于 2012-01-14T11:06:27.857 に答える
11

以下を試してみましたが、魅力的に機能しました:)

rec_list =  ['first@example.com', 'second@example.com']
rec =  ', '.join(rec_list)

msg['To'] = rec

send_out = smtplib.SMTP('localhost')
send_out.sendmail(me, rec_list, msg.as_string())
于 2017-11-24T03:57:42.363 に答える
8

このインポート可能なモジュール関数を思いつきました。この例では、gmail 電子メール サーバーを使用します。ヘッダーとメッセージに分割されているため、何が起こっているかを明確に確認できます。

import smtplib

def send_alert(subject=""):

    to = ['email@one.com', 'email2@another_email.com', 'a3rd@email.com']
    gmail_user = 'me@gmail.com'
    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()
于 2014-04-05T20:04:18.137 に答える
7

私は数ヶ月前にこれを理解し、それについてブログを書きました. 要約は次のとおりです。

smtplib を使用して複数の受信者に電子メールを送信する場合は、 を使用email.Message.add_header('To', eachRecipientAsString)してそれらを追加し、次に sendmail メソッドを呼び出すときにuse email.Message.get_all('To')、メッセージをすべての受信者に送信します。Cc および Bcc 受信者についても同様です。

于 2012-07-01T00:20:15.240 に答える
6

さて、この回答方法の方法は私にはうまくいきませんでした。わかりません。おそらくこれはPython3(私は3.4バージョンを使用しています)またはgmail関連の問題ですが、いくつかの試行の後、私にとってうまくいった解決策は次の行でした

s.send_message(msg)

それ以外の

s.sendmail(sender, recipients, msg.as_string())
于 2016-12-25T16:03:10.597 に答える
0

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

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 = "me@example.com"
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')
于 2018-05-07T10:51:57.760 に答える