كيفية إرسال البريد الإلكتروني إلى عدة مستلمين باستخدام python smtplib؟


Answers

يجب أن تكون الرسالة msg['To'] عبارة عن سلسلة:

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

بينما يحتاج recipients في sendmail(sender, recipients, message) إلى قائمة:

sendmail("a@a.com", ["a@b.com", "b@b.com", "c@b.com"], "Howdy")
Question

بعد الكثير من البحث لم أتمكن من معرفة كيفية استخدام 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()



وهو يعمل بالنسبة لي.

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'] = recipients
s.sendmail(sender, recipients.split(','), msg.as_string())



لذلك في الواقع المشكلة هي أن SMTP.sendmail و email.MIMEText بحاجة إلى شيئين مختلفين.

email.MIMEText إعداد رأس "إلى:" لجسم البريد الإلكتروني. يتم استخدامه فقط لعرض نتيجة للإنسان في الطرف الآخر ، وكما هو الحال مع جميع رؤوس البريد الإلكتروني ، يجب أن تكون سلسلة واحدة. (لاحظ أنه لا يجب أن يكون له في الواقع أي علاقة بالأشخاص الذين يتلقون الرسالة بالفعل).

SMTP.sendmail ، على الجانب الآخر ، بإعداد "مغلف" الرسالة لبروتوكول SMTP. يحتاج إلى قائمة بيثون من السلاسل ، كل منها يحتوي على عنوان واحد.

لذا ، ما عليك القيام به هو COMBINE الردود اثنين التي تلقيتها. عيّن msg ['To'] على سلسلة واحدة ، لكن قم بتمرير القائمة الأولية إلى sendmail:

emails = ['a.com','b.com', 'c.com']
msg['To'] = ', '.join( emails ) 
....
s.sendmail( msg['From'], emails, msg.as_string())



لقد اكتشفت ذلك بعد بضعة أشهر وكتبت عنه . الملخص هو:

إذا كنت تريد استخدام smtplib لإرسال بريد إلكتروني إلى عدة مستلمين ، فاستخدم email.Message.add_header('To', eachRecipientAsString) لإضافتها ، ثم عند استدعاء أسلوب sendmail ، use email.Message.get_all('To') ارسل الرسالة اليهم جميعا. كما سبق للمتلقين Cc و Bcc.




حسنا ، لم تنجح الطريقة في هذه الطريقة بالنسبة لي. لا أعرف ، ربما هذا هو Python3 (أنا أستخدم الإصدار 3.4) أو إصدار gmail ، ولكن بعد بعض المحاولات ، كان الحل الذي كان يعمل بالنسبة لي هو الخط

s.send_message(msg)

بدلا من

s.sendmail(sender, recipients, msg.as_string())



Related