পাইথন থেকে এসএমটিপি ব্যবহার করে মেল পাঠানো


118

আমি পাইথন থেকে এসএমটিপি ব্যবহার করে মেল প্রেরণের জন্য নিম্নলিখিত পদ্ধতিটি ব্যবহার করছি। এটি ব্যবহারের সঠিক পদ্ধতি নাকি আমি মিস করছি এমন কিছু আছে?

from smtplib import SMTP
import datetime

debuglevel = 0

smtp = SMTP()
smtp.set_debuglevel(debuglevel)
smtp.connect('YOUR.MAIL.SERVER', 26)
smtp.login('USERNAME@DOMAIN', 'PASSWORD')

from_addr = "John Doe <john@doe.net>"
to_addr = "foo@bar.com"

subj = "hello"
date = datetime.datetime.now().strftime( "%d/%m/%Y %H:%M" )

message_text = "Hello\nThis is a mail from your server\n\nBye\n"

msg = "From: %s\nTo: %s\nSubject: %s\nDate: %s\n\n%s" 
        % ( from_addr, to_addr, subj, date, message_text )

smtp.sendmail(from_addr, to_addr, msg)
smtp.quit()

2
আপনি তারিখ / সময় সঠিক পেয়েছেন তা নিশ্চিত করুন। আমি নীচের ফাংশনটি বেশ কার্যকর খুঁজে পেয়েছি, যা আপনাকে তারিখ- শিরোলেখের
লিবারিয়ান

এখানে একটি কোড উদাহরণ রয়েছে যা ইউনিকোড পাঠ্য সহ এবং / অথবা শরীরে ইমেল পাঠাতে
jfs

এখানে একটি কোড উদাহরণ রয়েছে যা চিত্রগুলি কীভাবে ইনলাইন প্রেরণ করতে হয় তা প্রদর্শন করে (এইচটিএমএল এবং সরল পাঠ্য অংশ উভয় সহ ইমেল) । এটি পুরানো পাইথন সংস্করণগুলিতে কীভাবে এসএসএল প্যারামিটারগুলি কনফিগার করতে হয় তাও দেখায়।
jfs

2
মনে রাখবেন যে মোড়কের পাঠাগারগুলি উপলভ্য রয়েছে যা ইমেলগুলি প্রেরণে অনেক কম কোড তৈরি করে (যেমন ইয়াগমেল )
পাস্কালভিকুটেন

উত্তর:


111

আমি যে স্ক্রিপ্টটি ব্যবহার করি তা বেশ একই রকম; ইমেলটি কীভাবে ব্যবহার করতে হয় তার উদাহরণ হিসাবে আমি এখানে এটি পোস্ট করি * * মাইএমএইচ বার্তা উত্পন্ন করার জন্য মডিউলগুলি; সুতরাং এই স্ক্রিপ্টটি সহজেই ছবি ইত্যাদি সংযুক্ত করার জন্য সংশোধন করা যায় etc.

তারিখের সময় শিরোনাম যুক্ত করতে আমি আমার আইএসপির উপর নির্ভর করি।

আমার আইএসপিতে আমার মেল প্রেরণের জন্য একটি সুরক্ষিত এসএমটিপি সংযোগ ব্যবহার করা প্রয়োজন, আমি এসএমটিপি্লিব মডিউলের উপর নির্ভর করি ( http://www1.cs.columbia.edu/~db2501/ssmtplib.py এ ডাউনলোডযোগ্য )

আপনার স্ক্রিপ্টের মতো, এসএমটিপি সার্ভারে প্রমাণীকরণ করতে ব্যবহৃত ব্যবহারকারীর নাম এবং পাসওয়ার্ড (নীচে ডামি মান দেওয়া হয়েছে) উত্সের সরল পাঠ্যে রয়েছে। এটি একটি সুরক্ষা দুর্বলতা; তবে সর্বোত্তম বিকল্প নির্ভর করে যে এগুলি রক্ষা করার জন্য আপনার কতটা সতর্কতা অবলম্বন করা উচিত (চান?)।

=======================================

#! /usr/local/bin/python


SMTPserver = 'smtp.att.yahoo.com'
sender =     'me@my_email_domain.net'
destination = ['recipient@her_email_domain.com']

USERNAME = "USER_NAME_FOR_INTERNET_SERVICE_PROVIDER"
PASSWORD = "PASSWORD_INTERNET_SERVICE_PROVIDER"

# typical values for text_subtype are plain, html, xml
text_subtype = 'plain'


content="""\
Test message
"""

subject="Sent from Python"

import sys
import os
import re

from smtplib import SMTP_SSL as SMTP       # this invokes the secure SMTP protocol (port 465, uses SSL)
# from smtplib import SMTP                  # use this for standard SMTP protocol   (port 25, no encryption)

# old version
# from email.MIMEText import MIMEText
from email.mime.text import MIMEText

try:
    msg = MIMEText(content, text_subtype)
    msg['Subject']=       subject
    msg['From']   = sender # some SMTP servers will do this automatically, not all

    conn = SMTP(SMTPserver)
    conn.set_debuglevel(False)
    conn.login(USERNAME, PASSWORD)
    try:
        conn.sendmail(sender, destination, msg.as_string())
    finally:
        conn.quit()

except:
    sys.exit( "mail failed; %s" % "CUSTOM_ERROR" ) # give an error message

1
@ ভিনসেন্ট: মেল ব্যর্থ হয়েছে; 'মডিউল' অবজেক্টটির কোনও এসএসএলফেকসকেট নেই - Gmail ব্যবহার করে :(
RadiantHex

এটি ট্র্যাক করে সহায়তা করতে এটি কোনও সংস্করণ বা আমদানির সমস্যার মতো মনে হচ্ছে: পাইথন আপনি কোন সংস্করণটি চালাচ্ছেন? - আপনার কি এসএমএস-এর মাধ্যমে আপনার এসএমটিপি সার্ভারের সাথে সংযোগ স্থাপনের দরকার আছে (এবং যদি আপনি উপরের মতো এসএমটিপিপ্লিব আমদানি করছেন)? আপনি কি পাইথন ইন্টারেক্টিভ থেকে সরাসরি এসএমটিপ্লিব আমদানি করতে পারেন, যদি তা হয় তবে সেখানে কোনও স্মটপ্লিব.এসএসএলফেকসকেট শ্রেণি সংজ্ঞায়িত হয়েছে? আশা করি আমি সহায়তা করতে পারি
ভিনসেন্ট মারচেটি

2
Ssmtplib.STMP_SSL (তৃতীয় পক্ষের মডিউল উপরে উল্লিখিত) এর পরিবর্তে সংযোগ তৈরি করতে smtplib.SMTP_SSL (পাইথনের সর্বশেষ সংস্করণে স্ট্যান্ডার্ড) ব্যবহার করুন। লক্ষ্য করুন স্ট্যান্ডার্ড মডিউলটি একটি একক 's' দিয়ে শুরু হয়। এটা আমার জন্য কাজ করেছে।
জুলিও গর্জি

2
প্রতিস্থাপন from ssmtplib import SMTP_SSL as SMTPসঙ্গে from smtplib import SMTP_SSL as SMTP, এবং এই উদাহরণে মান পাইথন লাইব্রেরি থেকে কাজ করবে।
আদম মতান

9
যোগ করুন msg['To'] = ','.join(destination), অন্যথায় গন্তব্য জিমেইলে দেখা যায় না
তাহা জাহাঙ্গীর

88

আমি সাধারণত যে পদ্ধতিটি ব্যবহার করি ... কিছুটা আলাদা নয় তবে কিছুটা

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

msg = MIMEMultipart()
msg['From'] = 'me@gmail.com'
msg['To'] = 'you@gmail.com'
msg['Subject'] = 'simple email in python'
message = 'here is the email'
msg.attach(MIMEText(message))

mailserver = smtplib.SMTP('smtp.gmail.com',587)
# identify ourselves to smtp gmail client
mailserver.ehlo()
# secure our email with tls encryption
mailserver.starttls()
# re-identify ourselves as an encrypted connection
mailserver.ehlo()
mailserver.login('me@gmail.com', 'mypassword')

mailserver.sendmail('me@gmail.com','you@gmail.com',msg.as_string())

mailserver.quit()

এটাই


আপনি যদি ২ টি পদক্ষেপ যাচাইকরণ ব্যবহার করেন তবে আপনাকে প্রথমে একটি অ্যাপ্লিকেশন নির্দিষ্ট পাসওয়ার্ড তৈরি করতে হবে এবং এটির সাথে আপনার সাধারণ পাসওয়ার্ডটি প্রতিস্থাপন করতে হবে। অ্যাপ পাসওয়ার্ড ব্যবহার করে সাইন ইন
সুজানা

2
আমি সম্মত, এটি সেরা উত্তর এবং গ্রহণ করা উচিত। আসলে যা গ্রহণ করা হয় তা নিকৃষ্টমানের।
হ্যালো ওয়ার্ল্ড

6
অজগর 3 এর জন্য, ব্যবহার করুন:from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText
আর্ট

21

এছাড়াও আপনি যদি এসএসএল-এর বিপরীতে টিএলএস দিয়ে এসএমটিপি লেখক করতে চান তবে আপনাকে কেবল পোর্টটি পরিবর্তন করতে হবে (587 ব্যবহার করুন) এবং smtp.starttls () করতে হবে। এটি আমার পক্ষে কাজ করেছে:

...
smtp.connect('YOUR.MAIL.SERVER', 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login('USERNAME@DOMAIN', 'PASSWORD')
...

6

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


6

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


6

এই সম্পর্কে কি?

import smtplib

SERVER = "localhost"

FROM = "sender@example.com"
TO = ["user@example.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(SERVER)
server.sendmail(FROM, TO, message)
server.quit()

4

নিম্নলিখিত কোডটি আমার পক্ষে ভাল কাজ করছে:

import smtplib

to = 'mkyong2002@yahoo.com'
gmail_user = 'mkyong2002@gmail.com'
gmail_pwd = 'yourpassword'
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo() # extra characters to permit edit
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject:testing \n'
print header
msg = header + '\n this is test msg from mkyong.com \n\n'
smtpserver.sendmail(gmail_user, to, msg)
print 'done!'
smtpserver.quit()

উল্লেখ: http://www.mkyong.com/python/how-do-send-email-in-python-via-smtplib/


1
ফ্লাস্কের ইমেলের জন্য একটি কাঠামো রয়েছে: ফ্ল্যাস.সেক্সট.মেল থেকে আমদানি মেল। আমি এটির সমস্যার সমাধান করছি এবং ভেবেছিলাম আমি কাজ করার জন্য কিছু পেতে পারি কিনা তা দেখার জন্য আমি পাইথন কোডে ফিরে যাব। আমি এই উত্তরটি পছন্দ করেছি কারণ এটি খালি হাড় ছিল। ওহ হ্যাঁ, এবং এটি কাজ করে!

দৃষ্টি আকর্ষণ: উত্তরের পূর্ববর্তী সংস্করণটিতে লাইনটি অন্তর্ভুক্ত ছিল: smtpserver.close()এটি অবশ্যই হওয়া উচিত: smtpserver.quit()কারণ close()টিএলএস-সংযোগটি সঠিকভাবে শেষ করবে না! close()সময় বলা হবে quit()
অরোনাদাল

হাই, আমি কমান্ডগুলির উপরে রান্নাইন করতে সমস্যা করছি। .. রিপোর্ট যখন আমি smtpserver.starttls ব্যবহার (), আমি একটি SMTP এর ত্রুটি "[Errno 10054]:: সংযোগ অপ্রত্যাশিতভাবে বন্ধ SMTPServerDisconnected" পেতে stackoverflow.com/questions/46094175/...
fazkan


3

আমি এসএমটিপি ব্যবহার করে মেল প্রেরণের জন্য কোড কোডটি করেছি।

import smtplib, ssl

smtp_server = "smtp.gmail.com"
port = 587  # For starttls
sender_email = "sender@email"
receiver_email = "receiver@email"
password = "<your password here>"
message = """ Subject: Hi there

This message is sent from Python."""


# Create a secure SSL context
context = ssl.create_default_context()

# Try to log in to server and send email
server = smtplib.SMTP(smtp_server,port)

try:
    server.ehlo() # Can be omitted
    server.starttls(context=context) # Secure the connection
    server.ehlo() # Can be omitted
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, message)
except Exception as e:
    # Print any error messages to stdout
    print(e)
finally:
    server.quit()

2

এই সমস্ত দীর্ঘ উত্তর দেখুন? দু'এক লাইনে এগুলি করে আমাকে প্রচার করার অনুমতি দিন।

আমদানি করুন এবং সংযুক্ত করুন:

import yagmail
yag = yagmail.SMTP('john@doe.net', host = 'YOUR.MAIL.SERVER', port = 26)

তারপরে এটি কেবল একটি এক-লাইনার:

yag.send('foo@bar.com', 'hello', 'Hello\nThis is a mail from your server\n\nBye\n')

এটি সুযোগের বাইরে গেলে (বা ম্যানুয়ালি বন্ধ করা যেতে পারে) এটি বন্ধ হয়ে যাবে। তদ্ব্যতীত, এটি আপনাকে আপনার কিরিংয়ে আপনার ব্যবহারকারীর নামটি রেজিস্টার করতে দেয় যে আপনাকে আপনার স্ক্রিপ্টে নিজের পাসওয়ার্ডটি লিখতে হবে না (এটি লেখার আগে সত্যিই আমাকে বিরক্ত করেছিল yagmail!)

প্যাকেজ / ইনস্টলেশনগুলির জন্য, টিপস এবং কৌশলগুলি গিথ বা পাইপটি দেখুন , পাইথন 2 এবং 3 উভয়ের জন্যই উপলব্ধ।


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

0

আপনি এটা করতে পারেন

import smtplib
from email.mime.text import MIMEText
from email.header import Header


server = smtplib.SMTP('mail.servername.com', 25)
server.ehlo()
server.starttls()

server.login('username', 'password')
from = 'me@servername.com'
to = 'mygfriend@servername.com'
body = 'That A Message For My Girl Friend For tell Him If We will go to eat Something This Nigth'
subject = 'Invite to A Diner'
msg = MIMEText(body,'plain','utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = Header(from, 'utf-8')
msg['To'] = Header(to, 'utf-8')
message = msg.as_string()
server.sendmail(from, to, message)

0

পাইথন ৩.x এর কার্যকারী উদাহরণ এখানে

#!/usr/bin/env python3

from email.message import EmailMessage
from getpass import getpass
from smtplib import SMTP_SSL
from sys import exit

smtp_server = 'smtp.gmail.com'
username = 'your_email_address@gmail.com'
password = getpass('Enter Gmail password: ')

sender = 'your_email_address@gmail.com'
destination = 'recipient_email_address@gmail.com'
subject = 'Sent from Python 3.x'
content = 'Hello! This was sent to you via Python 3.x!'

# Create a text/plain message
msg = EmailMessage()
msg.set_content(content)

msg['Subject'] = subject
msg['From'] = sender
msg['To'] = destination

try:
    s = SMTP_SSL(smtp_server)
    s.login(username, password)
    try:
        s.send_message(msg)
    finally:
        s.quit()

except Exception as E:
    exit('Mail failed: {}'.format(str(E)))

0

এই উদাহরণের ভিত্তিতে আমি নিম্নলিখিত ফাংশন করেছি:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def send_email(host, port, user, pwd, recipients, subject, body, html=None, from_=None):
    """ copied and adapted from
        /programming/10147455/how-to-send-an-email-with-gmail-as-provider-using-python#12424439
    returns None if all ok, but if problem then returns exception object
    """

    PORT_LIST = (25, 587, 465)

    FROM = from_ if from_ else user 
    TO = recipients if isinstance(recipients, (list, tuple)) else [recipients]
    SUBJECT = subject
    TEXT = body.encode("utf8") if isinstance(body, unicode) else body
    HTML = html.encode("utf8") if isinstance(html, unicode) else html

    if not html:
        # Prepare actual message
        message = """From: %s\nTo: %s\nSubject: %s\n\n%s
        """ % (FROM, ", ".join(TO), SUBJECT, TEXT)
    else:
                # /programming/882712/sending-html-email-using-python#882770
        msg = MIMEMultipart('alternative')
        msg['Subject'] = SUBJECT
        msg['From'] = FROM
        msg['To'] = ", ".join(TO)

        # Record the MIME types of both parts - text/plain and text/html.
        # utf-8 -> /programming/5910104/python-how-to-send-utf-8-e-mail#5910530
        part1 = MIMEText(TEXT, 'plain', "utf-8")
        part2 = MIMEText(HTML, 'html', "utf-8")

        # Attach parts into message container.
        # According to RFC 2046, the last part of a multipart message, in this case
        # the HTML message, is best and preferred.
        msg.attach(part1)
        msg.attach(part2)

        message = msg.as_string()


    try:
        if port not in PORT_LIST: 
            raise Exception("Port %s not one of %s" % (port, PORT_LIST))

        if port in (465,):
            server = smtplib.SMTP_SSL(host, port)
        else:
            server = smtplib.SMTP(host, port)

        # optional
        server.ehlo()

        if port in (587,): 
            server.starttls()

        server.login(user, pwd)
        server.sendmail(FROM, TO, message)
        server.close()
        # logger.info("SENT_EMAIL to %s: %s" % (recipients, subject))
    except Exception, ex:
        return ex

    return None

যদি আপনি কেবল পাস করেন bodyতবে সরল পাঠ্য মেল প্রেরণ করা হবে তবে আপনি htmlযুক্তির পাশাপাশি bodyতর্কটি পাস করলে এইচটিএমএল ইমেল প্রেরণ করা হবে (এইচএমটিএমএল / মাইম প্রকার সমর্থন করে না এমন ইমেল ক্লায়েন্টদের পাঠ্য সামগ্রীতে ফ্যালব্যাক সহ)।

ব্যবহারের উদাহরণ:

ex = send_email(
      host        = 'smtp.gmail.com'
   #, port        = 465 # OK
    , port        = 587  #OK
    , user        = "xxx@gmail.com"
    , pwd         = "xxx"
    , from_       = 'xxx@gmail.com'
    , recipients  = ['yyy@gmail.com']
    , subject     = "Test from python"
    , body        = "Test from python - body"
    )
if ex: 
    print("Mail sending failed: %s" % ex)
else:
    print("OK - mail sent"

BTW। আপনি যদি পরীক্ষা বা উত্পাদন এসএমটিপি সার্ভার হিসাবে জিমেইল ব্যবহার করতে চান তবে কম সুরক্ষিত অ্যাপ্লিকেশনগুলিতে অস্থায়ী বা স্থায়ী অ্যাক্সেস সক্ষম করুন:

  • গুগল মেল / অ্যাকাউন্টে লগইন করুন
  • এখানে যান: https://myaccount.google.com/lesssecureapps
  • সক্ষম করা
  • এই ফাংশন বা অনুরূপ ব্যবহার করে ইমেল প্রেরণ করুন
  • (প্রস্তাবিত) এ যান: https://myaccount.google.com/lesssecureapps
  • (প্রস্তাবিত) অক্ষম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.