পাইথন এসএমটিপ্লিব ব্যবহার করে একাধিক প্রাপককে কীভাবে ইমেল প্রেরণ করবেন?


196

অনেক অনুসন্ধানের পরেও আমি একাধিক প্রাপককে প্রেরণে কিভাবে 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()

1
দেখা যাচ্ছে ওপি তার নিজের প্রশ্নের উত্তর দিয়েছেন: sendmailএকটি তালিকা দরকার।
সিস টিমারম্যান


পাইথন 3 ব্যবহার করে আমাকে প্রাপকদের কাছে লুপ করতে হয়েছিল; for addr in recipients: msg['To'] = addrএবং তারপর এটি কাজ করে। একাধিক অ্যাসাইনমেন্ট আসলে প্রতিটিটির জন্য একটি নতুন 'টু' শিরোনাম যুক্ত করে। এটি একটি খুব উদ্ভট ইন্টারফেস, আমি কীভাবে এটি চেষ্টা করে দেখেছি তা ব্যাখ্যা করতে পারি না। এমনকি আমি subprocessএটি জানার sendmailআগে আমার বিচক্ষণতা বাঁচাতে ইউনিক্স প্যাকেজটি কল করার বিষয়েও বিবেচনা করছি।
mehtunguh

উত্তর:


309

এটি সত্যিই কাজ করে , আমি একাধিক রূপ ব্যবহার করে অনেক সময় ব্যয় করেছি।

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())

3
ডকুমেন্টেশনের উদাহরণ রয়েছে:tolist =["one@one.org","two@two.org","three@three.org","four@four.org"]
chug2k

2
আপনাকে এই লিপিটির জন্য @ সোরিন ধন্যবাদ। পাইথন স্ক্রিপ্ট থেকে ইমেল প্রেরণে আমার সমস্যা হয়েছিল এবং কোডের এই অংশটি সহ আমি এখন ইমেলটি প্রেরণ করতে পারি।
ভয়_ম্যাট্রিক্স

5
এই যদি পাইথন 3 ব্যবহার করছেন একাধিক প্রাপককে পাঠাব না আপনি প্রয়োজন send_messageপরিবর্তে sendmailনিচের Antoine: এর মন্তব্য এবং পাইথন ডক্স অনুযায়ী docs.python.org/3/library/email-examples.html
এলাচ

আপনার প্রতিটি ট্র্যাসভারের জন্য ব্যবহার করতে হবে যা প্রেরক মেইলের জন্য প্রাপকদের, অন্যথায় কেবল প্রথম উপাদানটি মেলটি গ্রহণ করবে।
জনি

2
উপরে উল্লিখিত ইউআরএলটির সংশোধন: docs.python.org/3/library/email.exferences.html
ডেভিড

150

msg['To']একটি স্ট্রিং হতে হবে:

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

যদিও recipientssendmail(sender, recipients, message)চাহিদা তালিকা প্রস্তুত করতে:

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

1
এটির জন্য একটি অদ্ভুত নকশার সিদ্ধান্তsmtplib.
আদম মাতান

2
recipientsএকটি তালিকা হতে হবে না - যদি একটি স্ট্রিং দেওয়া হয়, তবে এটি একটি উপাদান সহ একটি তালিকা হিসাবে বিবেচিত হবে। msg['To']স্ট্রিং কেবল বাদ দেওয়া যেতে পারে।
সুজানা

আমি সত্যিই বুঝতে পারি না, কীভাবে 'a@a.com, b@b.com' পার্স করা হয় তাই কেবল প্রথম ঠিকানাটি ইমেলটি পায়। কিন্তু ধন্যবাদ! এই উত্তর, সেখানে তালিকা রাখা ছিল।
অ্যান্টনওয়ে

আমার জন্য কাজ করেছে, এবং এটি ডকস.পিথন.আর.
রদ্রিগো লেগুনা

43

আপনাকে কোনও ইমেলের দৃশ্যমান ঠিকানা এবং বিতরণের মধ্যে পার্থক্য বুঝতে হবে ।

msg["To"]চিঠিটি মুদ্রিত হয় মূলত যা হয়। এটির আসলে কোনও প্রভাব নেই। আপনার ইমেল ক্লায়েন্টটি, নিয়মিত পোস্ট অফিসারের মতোই ধরে নিবে যে আপনি কে ইমেলটি প্রেরণ করতে চান এটি তিনি।

প্রকৃত বিতরণ তবে অন্যরকম কাজ করতে পারে। সুতরাং আপনি ইমেল (বা একটি অনুলিপি) সম্পূর্ণ আলাদা কারও পোস্টবক্সে ফেলে দিতে পারেন

এর বিভিন্ন কারণ রয়েছে। উদাহরণস্বরূপ ফরওয়ার্ডিংTo:হেডার ক্ষেত্র ফরওয়ার্ডিং উপর পরিবর্তন করে না, কিন্তু ইমেল একটি ভিন্ন মেলবক্সে অবনমিত হয়েছে।

smtp.sendmailকমান্ড এখন যত্ন নেয় প্রকৃত ডেলিভারি। email.Messageকেবলমাত্র চিঠির বিষয়বস্তু, বিতরণ নয়।

নিম্ন-স্তরে SMTP, আপনাকে একের পর এক প্রাপ্তি দেওয়া দরকার, এ কারণেই অ্যাড্রেসের একটি তালিকা (নাম সহ নয়!) বুদ্ধিমান এপিআই।

শিরোলেখের ক্ষেত্রে এটিতে উদাহরণস্বরূপ নামও থাকতে পারে To: First Last <email@addr.tld>, Other User <other@mail.tld>সুতরাং আপনার কোড উদাহরণটি সুপারিশ করা হয়নি , কারণ এটি এই মেলটি সরবরাহ করতে ব্যর্থ হবে, কারণ এটি কেবল ,আপনার উপর বিভাজন করে এখনও বৈধ ঠিকানাগুলি নেই!


2
আরএফসি 2822 একটি প্রদত্ত শিরোলেখের জন্য সর্বোচ্চ 988 টি অক্ষরের প্রশস্ততা এবং 78 টি অক্ষরের প্রস্তাবিত প্রস্থ চাপিয়েছে। আপনার যদি খুব বেশি ঠিকানা থাকে তবে আপনাকে অবশ্যই শিরোনামটি "ভাঁজ" করতে হবে।
স্টিভ হান্ট

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, কারণ এটি কেন এবং কীভাবে তা ব্যাখ্যা করে explains
Serrano,

দুর্দান্ত উত্তর। সিসি এবং বিসিসি ইমেল ক্ষেত্রগুলি সম্পর্কে কী? আমি ধরে নিই আমাদেরও সিসি এবং বিসিসি ইমেলটি এসএমটিপি.সেন্ডে অন্তর্ভুক্ত করতে হবে। এবং শুধুমাত্র ক্ষেত্রগুলিতে সিসি তালিকা (এবং বিসিসি তালিকা নয়)?
তাগর

হ্যাঁ, এটি কীভাবে কাজ করে। মেল সার্ভারগুলি সম্ভবত বিসিসি ক্ষেত্রটি ফেলে দেবে (এটিকে দৃশ্যমান হতে না দেওয়ার জন্য, এবং আমি মনে করি না যে তারা সবাই তা করে) তবে তারা এটি বিশ্লেষণ করবে না।
কিউইট আছে - অ্যানি-মুউসে

19

এটা আমার জন্য কাজ করে.

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())

আপনি অজগর এর কোন সংস্করণ ব্যবহার করছেন? আমি মূল পোস্টার হিসাবে একই সমস্যা পেয়েছি এবং আমি পাইথন
২. 2..৯

1
কেন recipients = ['john.doe@example.com','john.smith@example.co.uk']এটি স্ট্রিং তৈরির পরিবর্তে, এবং তারপরে তালিকা তৈরি করার জন্য বিভক্ত নয়?
ওউজে

to Woj, কারণ * ['টু'] স্ট্রিং হওয়া উচিত এবং এসএমএসের একটি তালিকা থাকা উচিত: (প্রেরক, >>> এখানে তালিকা <<<, msg.as_string ())। এর অর্থ এটি দেখতে যতটা বিরক্তিকর, আপনি উভয় ক্ষেত্রের জন্য একই ধরণের [স্ট্রিং বা তালিকা] ব্যবহার করতে পারবেন না
পাস্কাল লুই-মেরি

আমার জন্য একটি কবজ ভালো কাজ করে। পাইথন ৩. 3..৩।
আনাদিন

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())

নীচে এফওয়াইআর সম্পূর্ণ সহজ কোড: import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText sender = 'myEmailAddress@example.com' rec_list = ['first@example.com', 'second@example.com'] 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()
মাস্টারমাইন্ড

10

সুতরাং আসলে সমস্যাটি হ'ল এসএমটিপি.সেন্ডমেল এবং ইমেল M এমআইএমইটিসেক্স্টের জন্য দুটি আলাদা জিনিস দরকার।

ইমেল.মিমেক্সটেক্সট ই-মেইলের মূল অংশের জন্য "To:" শিরোনাম সেট করে। এটি কেবলমাত্র অন্য প্রান্তে একটি ফলাফল প্রদর্শনের জন্য ব্যবহৃত হয়, এবং সমস্ত ই-মেইল শিরোনামের মতো, অবশ্যই একটি স্ট্রিং হওয়া উচিত। (মনে রাখবেন যে প্রকৃতপক্ষে বার্তাটি পাওয়া লোকদের সাথে এর কোনও সম্পর্ক নেই does)

অন্যদিকে, এসএমটিপি.সেন্ডমেল এসএমটিপি প্রোটোকলের জন্য বার্তার "খাম" সেট আপ করে। এটিতে স্ট্রিংগুলির একটি পাইথন তালিকা প্রয়োজন, যার প্রত্যেকটিরই একক ঠিকানা রয়েছে।

সুতরাং, আপনাকে যা করতে হবে তা হল আপনি যে দুটি উত্তর পেয়েছেন তা একত্রিত করুন। একক স্ট্রিং-তে '[' তে '] সেট করুন, তবে প্রেরণতাকে কাঁচা তালিকাটি পাস করুন:

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

7

আমি এই আমদানিযোগ্য মডিউল ফাংশন নিয়ে এসেছি। এটি এই উদাহরণে জিমেইল ইমেল সার্ভার ব্যবহার করে। এটি শিরোনাম এবং বার্তায় বিভক্ত হয়েছে যাতে আপনি পরিষ্কারভাবে দেখতে পাচ্ছেন কী চলছে:

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()

7

আমি কয়েক মাস আগে এটি আবিষ্কার করেছি এবং এটি সম্পর্কে ব্লগ করেছি । সংক্ষিপ্তসারটি হ'ল:

আপনি যদি একাধিক প্রাপকদের ইমেল প্রেরণের জন্য smtplib ব্যবহার করতে চান email.Message.add_header('To', eachRecipientAsString)তবে সেগুলি যুক্ত করতে ব্যবহার করুন এবং তারপরে আপনি যখন সেন্ডমেল পদ্ধতিটি চালু করবেন তখন use email.Message.get_all('To')তাদের সকলকে বার্তা প্রেরণ করুন। সিসি এবং সিসি প্রাপকদের জন্য ডিট্টো।


পাইথন ৩.7 বার্তা সহ একটি ব্যতিক্রম ছুঁড়েছে: ব্যতিক্রম ঘটেছে: মান ভঙ্গি একটি বার্তায় সর্বাধিক 1 টি শিরোনাম থাকতে পারে
ওয়াজিয়াচ জাকুবাস

6

নীচের সমাধানটি আমার পক্ষে কাজ করেছে। এটি সফলভাবে "সিসি" এবং "বিসিসি" সহ একাধিক প্রাপকদের কাছে একটি ইমেল প্রেরণ করে।

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)

1
এটি আংশিকভাবে কাজ করে, সত্যিই বিসিসিকে আড়াল করতে আপনাকে অবশ্যই বিসিসি লাইন বিসিসি = বাদ দিতে হবে [['মেইলিড_5', 'মেলিড_6']] নাহলে এটি শিরোনামে বিসিসির উদ্দেশ্যকে পরাস্ত করবে। জিমেইল এবং অন্যান্য মেল সার্ভার দিয়ে পরীক্ষিত।
Wil

@ তবে কীভাবে আপনি এই ক্ষেত্রে বিসিসি বাস্তবায়ন করবেন?
পিট

4

ঠিক আছে, এই অ্যাসওয়ার পদ্ধতিতে পদ্ধতিটি আমার পক্ষে কার্যকর হয়নি। আমি জানি না, সম্ভবত এটি পাইথন 3 (আমি ৩.৪ সংস্করণ ব্যবহার করছি) বা জিমেইল সম্পর্কিত সমস্যা, তবে কিছু চেষ্টা করার পরেও যে সমাধানটি আমার পক্ষে কাজ করেছিল তা ছিল লাইন

s.send_message(msg)

পরিবর্তে

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

4

আমি পাইথন ৩.6 ব্যবহার করি এবং নিম্নলিখিত কোডটি আমার পক্ষে কাজ করে

email_send = 'xxxxx@xxx.xxx,xxxx@xxx.xxx'
server.sendmail(email_user,email_send.split(','),text)    

3
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'] = 'your.email@gmail.com'
    msg['To'] = (', ').join(recipients.split(','))

    msg.attach(MIMEText(body,'plain'))

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login('your.email@gmail.com', 'yourpassword')
    server.send_message(msg)
    server.quit()

if __name__ == '__main__':
    sender('email_1@domain.com,email_2@domain.com')

এটি কেবলমাত্র সেন্ড_মেসেজ ফাংশন এবং লিস্টে প্রাপক, পাইথন ৩.6 এর সাথে জয়েন্ট ফাংশনটি ব্যবহার করে আমার পক্ষে কাজ করেছে।


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')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.