পাইথনের সাথে কীভাবে ইমেল পাঠানো যায়?


169

এই কোডটি কাজ করে এবং আমাকে ঠিক একটি ইমেল প্রেরণ করে:

import smtplib
#SERVER = "localhost"

FROM = 'monty@python.com'

TO = ["jon@mycompany.com"] # must be a list

SUBJECT = "Hello!"

TEXT = "This message was sent with Python's smtplib."

# Prepare actual message

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail

server = smtplib.SMTP('myserver')
server.sendmail(FROM, TO, message)
server.quit()

তবে আমি যদি এটির মতো কোনও কার্যে এটি মোড়ানোর চেষ্টা করি:

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    import smtplib
    """this is some test documentation in the function"""
    message = """\
        From: %s
        To: %s
        Subject: %s
        %s
        """ % (FROM, ", ".join(TO), SUBJECT, TEXT)
    # Send the mail
    server = smtplib.SMTP(SERVER)
    server.sendmail(FROM, TO, message)
    server.quit()

এবং এটিকে কল করুন আমি নিম্নলিখিত ত্রুটিগুলি পেয়েছি:

 Traceback (most recent call last):
  File "C:/Python31/mailtest1.py", line 8, in <module>
    sendmail.sendMail(sender,recipients,subject,body,server)
  File "C:/Python31\sendmail.py", line 13, in sendMail
    server.sendmail(FROM, TO, message)
  File "C:\Python31\lib\smtplib.py", line 720, in sendmail
    self.rset()
  File "C:\Python31\lib\smtplib.py", line 444, in rset
    return self.docmd("rset")
  File "C:\Python31\lib\smtplib.py", line 368, in docmd
    return self.getreply()
  File "C:\Python31\lib\smtplib.py", line 345, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed

কেন কেউ আমাকে বুঝতে সাহায্য করতে পারে?


2
আপনি কিভাবে ফাংশন কল?
জোচেন রিটেল

আপনার ইন্ডেন্টেশনটি আপনার ফাইলটিতে যেমন পোস্ট করা হয়েছে তেমন কি?
gddc

@gddc না আমি সঠিকভাবে ইনডেন্ট করা নিশ্চিত করেছিলাম, ঠিক এটিই আমি
এটিতে আটকিয়েছি

আমি ফাংশনটিকে আমার মূল মডিউলটিতে আমদানি করে এবং যে প্যারামিটারগুলিতে এটি সংজ্ঞায়িত করেছি তা পেরিয়ে বলি।
মেঘ 311

4
যদিও ইমেল প্যাকেজটি ব্যবহার করার জন্য @ অরিয়েতার পরামর্শটি এটি সমাধানের সেরা উপায়, আপনার পদ্ধতির কাজ করতে পারে। আপনার দুটি সংস্করণের মধ্যে পার্থক্যগুলি স্ট্রিংটিতে রয়েছে: (1) @ নিকডেল যেমন উল্লেখ করেছেন, ফাংশন সংস্করণে আপনার নেতৃত্বে সাদা স্থান রয়েছে। শিরোনামগুলির কোনও অগ্রণী স্থান থাকা উচিত নয় (যদি না তারা মোড়ানো থাকে)। (২) যদি না পাঠ্যসূচিতে একটি শীর্ষস্থানীয় ফাঁকা রেখা না থাকে, আপনি শিরোনাম এবং শরীরে বিভাজকটি হারিয়েছেন।
টনি মায়ার

উত্তর:


191

আমি আপনাকে ইমেল প্রেরণের জন্য মানক প্যাকেজগুলি emailএবং smtplibএকসাথে ব্যবহার করার পরামর্শ দিচ্ছি । দয়া করে নীচের উদাহরণটি দেখুন ( পাইথন ডকুমেন্টেশন থেকে পুনরুত্পাদন )। লক্ষ্য করুন যে আপনি যদি এই পদ্ধতির অনুসরণ করেন তবে "সরল" কাজটি সত্যই সহজ এবং আরও জটিল কাজগুলি (যেমন বাইনারি অবজেক্ট সংযুক্ত করা বা প্লেইন / এইচটিএমএল একাধিক বার্তা প্রেরণ করা) খুব দ্রুত সম্পন্ন হয়।

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.mime.text import MIMEText

# Open a plain text file for reading.  For this example, assume that
# the text file contains only ASCII characters.
with open(textfile, 'rb') as fp:
    # Create a text/plain message
    msg = MIMEText(fp.read())

# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you

# Send the message via our own SMTP server, but don't include the
# envelope header.
s = smtplib.SMTP('localhost')
s.sendmail(me, [you], msg.as_string())
s.quit()

একাধিক গন্তব্যে ইমেল প্রেরণের জন্য, আপনি পাইথন ডকুমেন্টেশনে উদাহরণটি অনুসরণ করতে পারেন :

# Import smtplib for the actual sending function
import smtplib

# Here are the email package modules we'll need
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

# Create the container (outer) email message.
msg = MIMEMultipart()
msg['Subject'] = 'Our family reunion'
# me == the sender's email address
# family = the list of all recipients' email addresses
msg['From'] = me
msg['To'] = ', '.join(family)
msg.preamble = 'Our family reunion'

# Assume we know that the image files are all in PNG format
for file in pngfiles:
    # Open the files in binary mode.  Let the MIMEImage class automatically
    # guess the specific image type.
    with open(file, 'rb') as fp:
        img = MIMEImage(fp.read())
    msg.attach(img)

# Send the email via our own SMTP server.
s = smtplib.SMTP('localhost')
s.sendmail(me, family, msg.as_string())
s.quit()

যেহেতু আপনি দেখতে পারেন, হেডার Toমধ্যে MIMETextবস্তুর ইমেল ঠিকানাগুলি কমা দ্বারা পৃথক নিয়ে গঠিত স্ট্রিং হতে হবে। অন্যদিকে, দ্বিতীয় যুক্তিsendmail ফাংশনের অবশ্যই স্ট্রিংগুলির তালিকা হতে হবে (প্রতিটি স্ট্রিং একটি ইমেল ঠিকানা)।

সুতরাং, যদি আপনি তিনটি ইমেল ঠিকানাগুলি আছে: person1@example.com, person2@example.com, এবং person3@example.com, আপনি কি করতে পারেন হিসাবে অনুসরণ করে (সুস্পষ্ট বিভাগে বাদ দেওয়া):

to = ["person1@example.com", "person2@example.com", "person3@example.com"]
msg['To'] = ",".join(to)
s.sendmail(me, to, msg.as_string())

দ্য ",".join(to)অংশ তালিকা কমা দ্বারা পৃথক বাইরে একটি একক পংক্তি করে তোলে।

আপনার প্রশ্নগুলি থেকে আমি সংগ্রহ করি যে আপনি পাইথন টিউটোরিয়ালটি দিয়ে যাননি - আপনি পাইথনের যে কোনও জায়গায় যেতে চাইলে এটি আবশ্যক - ডকুমেন্টেশন বেশিরভাগ স্ট্যান্ডার্ড লাইব্রেরির জন্য দুর্দান্ত।


1
আপনাকে একটি ফাংশন থেকে খুব সুন্দরভাবে কাজ করার জন্য ধন্যবাদ, তবে আমি কীভাবে একাধিক প্রাপককে প্রেরণ করতে পারি? যেহেতু চিত্র [থেকে] দেখে মনে হচ্ছে এটি একটি অভিধান কী আছে, তাই আমি সেমিকোলনটি দিয়ে [[]] পৃথক করার চেষ্টা করেছি তবে এটি কার্যকর বলে মনে হচ্ছে না।
মেঘ 311

1
@ কোড311 আপনার কোডটিতে ঠিক যেমন রয়েছে। এটি কমা দিয়ে সীমিত একটি স্ট্রিং চায়: ", ".join(["a@example.com", "b@example.net"])
টিম ম্যাকনামারা

3
এছাড়াও খেয়াল করুন যে টু: শিরোনামে খাম প্রাপ্তির চেয়ে আলাদা শব্দার্থক রয়েছে। উদাহরণস্বরূপ, আপনি To: শিরোনামে একটি ঠিকানা হিসাবে '' টনি মায়ার '<tony.meyer@gmail.com>' ব্যবহার করতে পারেন, তবে খামটি প্রাপককে অবশ্যই "টনি.মিয়ার@gmail.com" থাকতে হবে। একটি 'সুন্দর' এতে: ঠিকানা তৈরি করতে, ইমেল.ইটিলস.ফর্ম্যাট্যাড্রার ("টনি মায়ার", "টনি.মায়ার @ gmail.com") এর মতো ইমেল.ইটিলস.ফর্ম্যাট্যাডার ব্যবহার করুন।
টনি মায়ার

1
ছোট উন্নতি: ফাইল ব্যবহার করে খোলা হবে with: with open(textfile, 'rb') as fp:। সুস্পষ্ট বন্ধটি বাদ দেওয়া যেতে পারে, কারণ withব্লকটির ভিতরে কোনও ত্রুটি দেখা দিলে ফাইলটি বন্ধ করে দেওয়া হবে।
jpmc26

1
এই উত্তরের সাথে সুনির্দিষ্ট নয়, তবে আপনি নিয়ন্ত্রণ করেন না এমন কোনও এসএমটিপি সার্ভারের সাথে সংযোগ করার সময়, আপনার এই সম্ভাবনাটি বিবেচনা করা উচিত যে এটি অ্যাক্সেসযোগ্য, ধীর, সংযোগ প্রত্যাখ্যান করা বা অন্য যে কোনও কিছুই। কোড-ভিত্তিক আপনি একটি ব্যতিক্রম পাবেন, তবে আপনাকে পরে কিছুক্ষণ পরে প্রেরণটির পুনরায় চেষ্টা করার উপায় খুঁজে বের করতে হবে। আপনি যদি নিজের নিজস্ব সেন্ডমেল / পোস্টফিক্সের সাথে কথা বলেন তবে তা আপনার জন্য পুনরায় প্রেরণের যত্ন নেবে।
রাল্ফ বোল্টন

66

ভাল, আপনি একটি উত্তর পেতে চান যা আধুনিক ও আধুনিক।

আমার উত্তর এখানে:

যখন পাইথনে আমাকে মেইল ​​করা দরকার তখন আমি এটি ব্যবহার করি মেলগানটি করি এপিআই মেলগুলি সাজানোর সাথে সাথে অনেকটা মাথা ব্যথা হয়। তাদের একটি বিস্ময়কর অ্যাপ্লিকেশন / এপিআই রয়েছে যা আপনাকে মাসে 10,000 ইমেইল বিনা মূল্যে পাঠাতে দেয় send

একটি ইমেল প্রেরণা হবে:

def send_simple_message():
    return requests.post(
        "https://api.mailgun.net/v3/YOUR_DOMAIN_NAME/messages",
        auth=("api", "YOUR_API_KEY"),
        data={"from": "Excited User <mailgun@YOUR_DOMAIN_NAME>",
              "to": ["bar@example.com", "YOU@YOUR_DOMAIN_NAME"],
              "subject": "Hello",
              "text": "Testing some Mailgun awesomness!"})

আপনি ইভেন্টগুলি এবং আরও অনেক কিছু ট্র্যাক করতে পারেন, দেখুন , কুইকস্টার্ট গাইডটি দেখুন

আশা করি এটি আপনার কাজে লাগবে!


3
এটি প্রকৃতপক্ষে "এই তারিখের" অনেক বেশি। যদিও এটি একটি বাহ্যিক এপিআই ব্যবহার করে। অভ্যন্তরীণ রাখার জন্য আমি ব্যক্তিগতভাবে ইয়াগমেলের মতো কিছু ব্যবহার করব ।
পাস্কালভিকুটেন

6
@ প্যাস্কালভকুটেন ইয়াগমেলের জন্য আপনার ধ্রুবক বিজ্ঞাপনটি অনুসরণ করতে একেবারে মজাদার (হ্যাঁ স্যার, আমি পরের বার এটি বিবেচনা করব, স্যার;)। তবে আমি এটি খুব বিভ্রান্তিকর বলে মনে করি যে প্রায় কেউই ওপিএস ইস্যুটির জন্য যত্ন নিয়েছে বলে মনে হচ্ছে না, বরং অনেকগুলি ভিন্ন সমাধানের পরামর্শ দেয়। এটি এমনভাবে মনে হচ্ছে যে আমি আমার ২০০৯ এর স্মার্টটিতে বাল্বগুলি কীভাবে পরিবর্তন করতে চাই এবং উত্তরটি হ'ল: সত্যিকারের মার্সিডিজ কিনুন ...
flaschbier

দুর্দান্ত যে আমার মিশনের কারও কাছে কিছু বিনোদনমূলক মূল্য রয়েছে।
পাসক্যালভিকুটেন

4
@ ফ্ল্যাশবিয়ার ওপিএস ইস্যু সম্পর্কে কারও পাত্তা না দেওয়ার কারণ শিরোনামটি ভুল। "পাইথনের সাথে কীভাবে ইমেল পাঠাব?" এই প্রশ্নটিতে লোকেরা ক্লিক করার সময় লোকেরা আসার আসল কারণ এবং তারা ইয়াগমেল যে উত্তর সরবরাহ করতে পারে তা প্রত্যাশা করবে : সুন্দর এবং সংক্ষিপ্ত। এই নাও. আরও ইয়াগমেল বিজ্ঞাপন।
পাসক্যালভিকুটেন

1
মেলগুন গ্রাহকদের জন্য কেবল এটি বলা যায় যে এসএমটিপি (বিশেষত কোনও সংযুক্তি ব্যবহার করে) এর চেয়ে ওয়েবসার্চেসিসের মাধ্যমে মেল পাঠানো যথেষ্ট ব্যান্ডউইথ-বান্ধব।
রাল্ফ বোল্টন

44

আমি ইয়াগমেল প্যাকেজটি পরামর্শ দিয়ে ইমেল প্রেরণে আপনাকে সহায়তা করতে চাই (বিজ্ঞাপনটির জন্য আমি রক্ষণাবেক্ষণকারী, দুঃখিত, তবে আমি মনে করি এটি সত্যিই সহায়তা করতে পারে!))

আপনার জন্য পুরো কোডটি হ'ল:

import yagmail
yag = yagmail.SMTP(FROM, 'pass')
yag.send(TO, SUBJECT, TEXT)

নোট করুন যে আমি সমস্ত যুক্তির জন্য ডিফল্ট সরবরাহ করি, উদাহরণস্বরূপ আপনি যদি নিজের কাছে প্রেরণ করতে চান তবে আপনি বাদ দিতে পারেন, আপনি TOযদি কোনও বিষয় না চান তবে আপনি এটি বাদও দিতে পারেন।

তদুপরি, লক্ষ্যটি এইচটিএমএল কোড বা চিত্রগুলি (এবং অন্যান্য ফাইল) সংযুক্ত করা সত্যই সহজ করে তোলাও।

যেখানে আপনি বিষয়বস্তু রেখেছেন আপনি এখানে কিছু করতে পারেন:

contents = ['Body text, and here is an embedded image:', 'http://somedomain/image.png',
            'You can also find an audio file attached.', '/local/path/song.mp3']

বাহ, সংযুক্তি পাঠানো কত সহজ! ইয়াগমেল ছাড়াই এটি 20 লাইনের মতো লাগবে;)

এছাড়াও, আপনি যদি এটি একবার সেট আপ করেন তবে আপনাকে আর কখনও পাসওয়ার্ড প্রবেশ করতে হবে না (এবং এটি নিরাপদে সঞ্চিত রাখতে হবে)। আপনার ক্ষেত্রে আপনি যেমন কিছু করতে পারেন:

import yagmail
yagmail.SMTP().send(contents = contents)

যা অনেক বেশি সংক্ষিপ্ত!

আমি আপনাকে গিথুব দেখার জন্য আমন্ত্রণ জানিয়েছি বা এটি সরাসরি ইনস্টল করার জন্য pip install yagmail


4
এটি শীর্ষ সমাধান হওয়া উচিত।
রিচার্ড ডি রে

1
ওএমজি, এটি একটি মিষ্টি, সহজ ইমেল মডিউল। ধন্যবাদ!
পেপলুয়ান

1
আমি কি yagmailজিমেইল ছাড়া অন্য ব্যবহার করতে পারি ? আমি আমার নিজের এসএমটিপি সার্ভারের জন্য ব্যবহার করার চেষ্টা করছি।
অনির্বাণ নাগ 'tintinmj'

@dtgq আপনার উদ্বেগের জন্য ধন্যবাদ ব্যক্তিগতভাবে, আমি আক্রমণ ভেক্টর দেখতে পাচ্ছি না। যদি আপনি যে পথটি পাঠাতে চান তার অধীনে কেউ যদি ফাইলটি পরিবর্তন করতে চলেছে, তবে আপনার কোনও Attachmentক্লাস আছে কিনা তা বিবেচ্য নয় ; এটি এখনও একই জিনিস। যদি তারা আপনার কোড পরিবর্তন করতে পারে তবে তারা যেভাবেই হোক তারা যে কোনও কিছু করতে পারে (রুট সহ / ছাড়াই, এটি একই একই ইমেল প্রেরণ)। এটি আমার কাছে সাধারণত "এটি সুবিধাজনক / যাদুবিদ্যার মতো লাগে তাই এটি কম সুরক্ষিত হওয়া উচিত"। আমি কৌতুহলী আছি তুমি কি বাস্তব হুমকি দেখছ?
পাসক্যালভিকুটেন

14

ইন্ডেন্টেশন সমস্যা আছে। নীচের কোডটি কাজ করবে:

import textwrap

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    import smtplib
    """this is some test documentation in the function"""
    message = textwrap.dedent("""\
        From: %s
        To: %s
        Subject: %s
        %s
        """ % (FROM, ", ".join(TO), SUBJECT, TEXT))
    # Send the mail
    server = smtplib.SMTP(SERVER)
    server.sendmail(FROM, TO, message)
    server.quit()


3
@ জিওথোরি SERVERভেরিয়েবলটি যে ফাংশনে পাস হয় তা হ'ল ব্যবহারকারীর শংসাপত্র।
ব্যবহারকারী

সাধারণ স্ট্রিং ইন্টারপোলেশন সহ একটি বৈধ এসএমটিপি বার্তা ম্যানুয়ালি পাইক করা বাঞ্ছনীয় নয় এবং আপনার উত্তরের একটি বাগ রয়েছে যা এটি পুরোপুরি চিত্রিত করে। (এটি একটি বৈধ বার্তা হওয়ার জন্য বডিটি খালি লাইন দিয়ে শুরু করা দরকার)) 1980 এর দশকে 7-বিট ইংলিশ-কেবল মার্কিন-এএসসিআইআই (সংযুক্তি, আন্তর্জাতিকীকরণ এবং অন্যান্য মাইম সমর্থন) এর জন্য সরল পাঠ ব্যতীত অন্য যে কোনও চরিত্রের সাথে জড়িত কোনও কিছুই আপনি সংযুক্ত করতে পারেন you সত্যিই এমন লাইব্রেরি ব্যবহার করতে চান যা এই জিনিসগুলি পরিচালনা করে। পাইথন emailগ্রন্থাগারটি এটি যথাযথভাবে ভাল করে (বিশেষত ৩.6 থেকে) যদিও এটি করার জন্য আপনার এখনও কিছুটা বোঝার প্রয়োজন।
ট্রিপলি

7

এখানে পাইথন উপর একটি উদাহরণ 3.x, তুলনায় অনেক সহজ 2.x:

import smtplib
from email.message import EmailMessage
def send_mail(to_email, subject, message, server='smtp.example.cn',
              from_email='xx@example.com'):
    # import smtplib
    msg = EmailMessage()
    msg['Subject'] = subject
    msg['From'] = from_email
    msg['To'] = ', '.join(to_email)
    msg.set_content(message)
    print(msg)
    server = smtplib.SMTP(server)
    server.set_debuglevel(1)
    server.login(from_email, 'password')  # user & password
    server.send_message(msg)
    server.quit()
    print('successfully sent the mail.')

এই ফাংশন কল:

send_mail(to_email=['12345@qq.com', '12345@126.com'],
          subject='hello', message='Your analysis has done!')

নীচে কেবল চীনা ব্যবহারকারীর জন্যই হতে পারে:

আপনি যদি 126/163, 网易 邮箱 ব্যবহার করেন তবে আপনাকে নীচের মত "客户 端 授权 密码" সেট করতে হবে:

এখানে চিত্র বর্ণনা লিখুন

রেফ: https://stackoverflow.com/a/41470149/2803344 https://docs.python.org/3/library/email.example.html#email- উদাহরণ


4

ফাংশনে আপনার কোডটি ইনডেন্ট করার সময় (যা ঠিক আছে), আপনি কাঁচা বার্তার স্ট্রিংয়ের লাইনগুলি ইনডেন্টও করেছিলেন। তবে শীর্ষস্থানীয় সাদা স্থান বোঝায় শিরোলেখের রেখাগুলি ভাঁজ (সংমিশ্রণ), যেমন বিভাগের ২.২.৩ এবং ৩.২.৩ বর্ণিত আরএফসি 2822 এর এ - ইন্টারনেট বার্তা ফর্ম্যাট :

প্রতিটি শিরোলেখ ক্ষেত্রটি যুক্তিযুক্তভাবে ক্ষেত্রের নাম, কোলন এবং ফিল্ড বডি সমন্বিত অক্ষরের একক লাইন। তবে সুবিধার জন্য এবং প্রতি লাইন 998/78 অক্ষরের সীমাবদ্ধতাগুলি মোকাবেলা করার জন্য, শিরোনামের ক্ষেত্রের ক্ষেত্রের ক্ষেত্রের অংশটি একাধিক লাইন উপস্থাপনায় বিভক্ত করা যেতে পারে; এটিকে "ভাঁজ" বলা হয়।

আপনার sendmailকলটির ফাংশন আকারে , সমস্ত লাইন সাদা স্থানের সাথে শুরু হয় এবং তাই "উন্মুক্ত" (কনটেনেটেড) হয় এবং আপনি প্রেরণের চেষ্টা করছেন

From: monty@python.com    To: jon@mycompany.com    Subject: Hello!    This message was sent with Python's smtplib.

অন্য চেয়ে আমাদের মন প্রস্তাব দেওয়া হয়, smtplibবুঝতে পারে না হবে To:এবং Subject:হেডার আর, কারণ এই নামগুলি শুধুমাত্র একটি লাইন শুরুতে স্বীকৃত হয়। পরিবর্তে smtplibখুব দীর্ঘ প্রেরকের ইমেল ঠিকানা ধরে নেওয়া হবে:

monty@python.com    To: jon@mycompany.com    Subject: Hello!    This message was sent with Python's smtplib.

এটি কাজ করবে না এবং তাই আপনার ব্যতিক্রম আসে।

সমাধানটি সহজ: messageস্ট্রিংটি আগের মতো সংরক্ষণ করুন । এটি কোনও ফাংশন (জিশান প্রস্তাবিত হিসাবে) দ্বারা বা সরাসরি সোর্স কোডে করা যেতে পারে:

import smtplib

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    """this is some test documentation in the function"""
    message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
    # Send the mail
    server = smtplib.SMTP(SERVER)
    server.sendmail(FROM, TO, message)
    server.quit()

এখন উদ্ঘাটন ঘটে না এবং আপনি প্রেরণ করেন

From: monty@python.com
To: jon@mycompany.com
Subject: Hello!

This message was sent with Python's smtplib.

আপনার পুরানো কোড দ্বারা কোনটি কাজ করে এবং কী করে।

নোট করুন যে আমি আরএফসি - র ৩.৪ অনুচ্ছেদে (যা প্রয়োজনীয়) শিরোনাম এবং শিরোনাম এবং বডি মধ্যে ফাঁকা লাইনটি সংরক্ষণ করেছিলাম এবং পাইথন স্টাইল গাইড পিইপি -২০০৮ (যা alচ্ছিক ) অনুযায়ী ফাংশনের বাইরে অন্তর্ভুক্ত রেখেছি


3

এটি সম্ভবত আপনার বার্তায় ট্যাব লাগিয়েছে। বার্তা প্রেরণ মেল আপনি প্রেরণ আগে প্রিন্ট আউট।


1

নিশ্চিত করুন যে আপনি প্রেরক এবং প্রাপক উভয়েরই ইমেল প্রেরণ এবং ইমেল অ্যাকাউন্টে অজানা উত্স (বহিরাগত উত্স) থেকে ইমেল গ্রহণের অনুমতি পেয়েছেন।

import smtplib

#Ports 465 and 587 are intended for email client to email server communication - sending email
server = smtplib.SMTP('smtp.gmail.com', 587)

#starttls() is a way to take an existing insecure connection and upgrade it to a secure connection using SSL/TLS.
server.starttls()

#Next, log in to the server
server.login("#email", "#password")

msg = "Hello! This Message was sent by the help of Python"

#Send the mail
server.sendmail("#Sender", "#Reciever", msg)

এখানে চিত্র বর্ণনা লিখুন


msgকোনও বৈধ এসএমটিপি বার্তা নয়, এবং যদি আপনার মেইল ​​সার্ভার এটি গ্রহণ করে তবে ইথারটিতে অদৃশ্য হয়ে যাবে।
ট্রিপলি

0

ভেবেছিলাম যে আমি আমার দুটি বিট এখানে রেখেছি যেহেতু আমি কীভাবে এটি কাজ করে তা সন্ধান করে ফেলেছি।

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

স্মটপ্লিব.এসএমটিপি ডক্স অনুসারে, আপনার এহলো বা হেলোর অনুরোধ / প্রতিক্রিয়াটি স্বয়ংক্রিয়ভাবে যত্ন নেওয়া উচিত, সুতরাং আপনাকে এই সম্পর্কে উদ্বিগ্ন হওয়ার দরকার নেই (তবে সমস্ত কিছু ব্যর্থ হলে এটি নিশ্চিত করার মতো কিছু হতে পারে)।

নিজেকে জিজ্ঞাসা করার জন্য আরেকটি বিষয় হ'ল আপনি কি নিজের এসএমটিপি সার্ভারে এসএমটিপি সংযোগের অনুমতি দিয়েছেন? কিছু জিমেইল এবং জোহোর মতো সাইটের জন্য আপনাকে অবশ্যই ইমেল অ্যাকাউন্টের মধ্যেই প্রবেশ করতে হবে এবং আইএমএপি সংযোগগুলি সক্রিয় করতে হবে। আপনার মেইল ​​সার্ভার সম্ভবত 'লোকালহোস্ট' থেকে আসে না এমন এসএমটিপি সংযোগগুলিকে মঞ্জুরি দেয় না? কিছু দেখার জন্য।

চূড়ান্ত বিষয়টি হ'ল আপনি চেষ্টা করতে এবং টিএলএসে সংযোগটি শুরু করতে চাইতে পারেন। বেশিরভাগ সার্ভারের এখন এই ধরণের প্রমাণীকরণের প্রয়োজন।

আপনি দেখতে পাবেন আমি আমার ইমেলটিতে দুটি টো ফিল্ড জ্যাম করেছি। # ['TO'] এবং msg ['FROM'] # অভিধানের আইটেমগুলি সঠিক ইমেলটির শিরোনামগুলিতে সঠিক তথ্য প্রদর্শন করতে দেয়, যা প্রত্যক্ষভাবে ক্ষেত্রগুলিতে ইমেলটি প্রাপ্ত হওয়ার পরে দেখায় (আপনি / এমনকি এখানে ফিল্ড করতে একটি জবাব যোগ করতে সক্ষম হতে পারে TO সার্ভারের যা প্রয়োজন তা TO এবং FROM ক্ষেত্রগুলি নিজেরাই হয় I আমি জানি আমি কিছু ইমেল সার্ভারগুলির ঠিক মতো ইমেল শিরোনাম না থাকলে ইমেলগুলি প্রত্যাখ্যান করে শুনেছি।

এই কোডটি আমি একটি ফাংশনে ব্যবহার করেছি, এটি আমার জন্য স্থানীয় * কম্পিউটার এবং একটি দূরবর্তী এসএমটিপি সার্ভার (দেখানো হিসাবে ZOHO) ব্যবহার করে একটি * .txt ফাইলের বিষয়বস্তু ইমেল করতে কাজ করে:

def emailResults(folder, filename):

    # body of the message
    doc = folder + filename + '.txt'
    with open(doc, 'r') as readText:
        msg = MIMEText(readText.read())

    # headers
    TO = 'to_user@domain.com'
    msg['To'] = TO
    FROM = 'from_user@domain.com'
    msg['From'] = FROM
    msg['Subject'] = 'email subject |' + filename

    # SMTP
    send = smtplib.SMTP('smtp.zoho.com', 587)
    send.starttls()
    send.login('from_user@domain.com', 'password')
    send.sendmail(FROM, TO, msg.as_string())
    send.quit()

0

এটি লক্ষণীয় যে এসএমটিপি মডিউলটি প্রসঙ্গ পরিচালককে সমর্থন করে তাই ম্যানুয়ালি ছাড়ার () ছাড়ার কল করার দরকার নেই, এটি কোনও ব্যতিক্রম থাকলেও এটি সর্বদা ডেকে আনা নিশ্চিত করবে।

    with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:
        server.ehlo()
        server.login(user, password)
        server.sendmail(from, to, body)

-1

যতদূর আপনার কোড সম্পর্কিত, এটির সাথে এটিতে মূলত কিছু ভুল বলে মনে হচ্ছে না, আপনি প্রকৃতপক্ষে কীভাবে এই ফাংশনটি ডাকছেন তা স্পষ্ট নয়। আমি কেবল এটিই ভাবতে পারি যে যখন আপনার সার্ভারটি সাড়া দিচ্ছে না তখন আপনি এই SMTPServerDisconnected ত্রুটি পাবেন। আপনি যদি smtplib (নীচে অংশ) এর getreply () ফাংশনটি সন্ধান করেন তবে আপনি একটি ধারণা পাবেন।

def getreply(self):
    """Get a reply from the server.

    Returns a tuple consisting of:

      - server response code (e.g. '250', or such, if all goes well)
        Note: returns -1 if it can't read response code.

      - server response string corresponding to response code (multiline
        responses are converted to a single, multiline string).

    Raises SMTPServerDisconnected if end-of-file is reached.
    """

https://github.com/rreddy80/sendEmails/blob/master/sendEmailAttachments.py এ একটি উদাহরণ পরীক্ষা করুন যা ইমেল প্রেরণের জন্য একটি ফাংশন কলও ব্যবহার করে, যদি আপনি যা করতে চেষ্টা করছেন (ডিআরওয়াই অ্যাপ্রোচ)।

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