পাইথন ব্যবহার করে এইচটিএমএল ইমেল প্রেরণ করা হচ্ছে


260

আমি কীভাবে পাইথন ব্যবহার করে কোনও ইমেলতে এইচটিএমএল সামগ্রী পাঠাতে পারি? আমি সাধারণ পাঠ্য পাঠাতে পারি।


শুধু একটি বড় ফ্যাট সতর্কতা। আপনি অ পাঠানোর হয় হওয়া ASCII ইমেল পাইথন <3.0 ব্যবহার করে, ইমেল ব্যবহার করার বিষয়ে ভাবুন জ্যাঙ্গো । এটি ইউটিএফ -8 স্ট্রিংগুলি সঠিকভাবে আবৃত করে এবং এটি ব্যবহার করাও সহজ। আপনাকে সতর্ক করা হয়েছে :-)
অ্যান্ডারস রুন জেনসেন

1
: যদি আপনি এইচটিএমএল দিয়ে ইউনিকোড এখানে দেখতে পাঠাতে চান stackoverflow.com/questions/36397827/...
guettli

উত্তর:


419

থেকে 18.1.11 - পাইথন v2.7.14 ডকুমেন্টেশন। ইমেল: উদাহরণ :

বিকল্প প্লেইন পাঠ্য সংস্করণ সহ এইচটিএমএল বার্তা কীভাবে তৈরি করবেন তার একটি উদাহরণ এখানে রয়েছে:

#! /usr/bin/python

import smtplib

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

# me == my email address
# you == recipient's email address
me = "my@email.com"
you = "your@email.com"

# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "Link"
msg['From'] = me
msg['To'] = you

# Create the body of the message (a plain-text and an HTML version).
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org"
html = """\
<html>
  <head></head>
  <body>
    <p>Hi!<br>
       How are you?<br>
       Here is the <a href="http://www.python.org">link</a> you wanted.
    </p>
  </body>
</html>
"""

# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')

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

# Send the message via local SMTP server.
s = smtplib.SMTP('localhost')
# sendmail function takes 3 arguments: sender's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail(me, you, msg.as_string())
s.quit()

1
তৃতীয় এবং চতুর্থ অংশ সংযুক্ত করা সম্ভব, উভয় সংযুক্তি (একটি এএসসিআইআই, একটি বাইনারি)? কেউ কীভাবে তা করবে? ধন্যবাদ।
হামিশ গ্রুবিজন

1
হাই, আমি শেষ আপনি লক্ষ্য করেছি যে, বস্তু। আমি যদি একাধিক বার্তা প্রেরণ করতে চাই? আমি যখনই বার্তাটি প্রেরণ করি তখনই কি তাদের ছেড়ে দেওয়া উচিত বা সমস্তগুলি (লুপের জন্য) প্রেরণ করা উচিত এবং তারপরে একবার এবং সকলের জন্য প্রস্থান করা উচিত? quits
এক্সপান্ত

এইচটিএমএলটি সর্বশেষ সংযুক্ত করার বিষয়টি নিশ্চিত করুন, কারণ পছন্দসই (প্রদর্শিত) অংশটি সর্বশেষ সংযুক্ত থাকবে। # According to RFC 2046, the last part of a multipart message, in this case # the HTML message, is best and preferred. আমি আশা করি আমি এটি
ঘন্টা

1
সতর্কতা: পাঠ্যে অ-এসিআই অক্ষর থাকলে এটি ব্যর্থ হয়।
গেটলি

2
হুম, আমি msg.as_string () জন্য ভুল পান: তালিকা বস্তুর কোন অ্যাট্রিবিউট সঙ্কেতাক্ষরে লিখা হয়েছে
JohnAndrews

61

আপনি আমার মেলার মডিউলটি ব্যবহার করার চেষ্টা করতে পারেন ।

from mailer import Mailer
from mailer import Message

message = Message(From="me@example.com",
                  To="you@example.com")
message.Subject = "An HTML Email"
message.Html = """<p>Hi!<br>
   How are you?<br>
   Here is the <a href="http://www.python.org">link</a> you wanted.</p>"""

sender = Mailer('smtp.example.com')
sender.send(message)

মেলার মডিউলটি দুর্দান্ত তবে এটি জিমেইলের সাথে কাজ করার দাবি করে, তবে কোনও ডক্স নেই।
এমএফবি

1
@ এমএফবি - আপনি কি বিটবকেটের রেপো চেষ্টা করেছেন? bitbucket.org/ginstrom/mailer
রায়ান Ginstrom

2
জিমেইলের জন্য একটি সরবরাহ করা উচিত use_tls=True, usr='email'এবং pwd='password'যখন আরম্ভ করা হয় Mailerএবং এটি কাজ করবে।
টুনএলফ্রিঙ্ক

আমি আপনার message.Body = """Some text to show when the client cannot show HTML emails"""
কোডটিতে ম্যাসেজের

দুর্দান্ত তবে কীভাবে লিঙ্কটিতে ভেরিয়েবলের মান যুক্ত করতে হবে তার অর্থ এই <a href=" python.org/somevalues"> লিঙ্ক </ a > এর মতো একটি লিঙ্ক তৈরি করা যাতে আমি যে মানগুলিতে যায় সেগুলি থেকে সেই মানগুলিতে অ্যাক্সেস করতে পারি। ধন্যবাদ
তারাগুরুং

49

এখানে গৃহীত উত্তরের একটি Gmail বাস্তবায়ন:

import smtplib

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

# me == my email address
# you == recipient's email address
me = "my@email.com"
you = "your@email.com"

# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "Link"
msg['From'] = me
msg['To'] = you

# Create the body of the message (a plain-text and an HTML version).
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org"
html = """\
<html>
  <head></head>
  <body>
    <p>Hi!<br>
       How are you?<br>
       Here is the <a href="http://www.python.org">link</a> you wanted.
    </p>
  </body>
</html>
"""

# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')

# 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)
# Send the message via local SMTP server.
mail = smtplib.SMTP('smtp.gmail.com', 587)

mail.ehlo()

mail.starttls()

mail.login('userName', 'password')
mail.sendmail(me, you, msg.as_string())
mail.quit()

2
দুর্দান্ত কোড, এটি আমার পক্ষে কাজ করে, যদি আমি গুগলে কম সুরক্ষা
তোভাস্ক

15
আমি পাইথন স্মটিপ্লিবের সাথে একটি গুগল অ্যাপ্লিকেশন সুনির্দিষ্ট পাসওয়ার্ড ব্যবহার করেছি, কম সুরক্ষা ছাড়াই কৌশলটি করেছি।
yoyo

2
উপরের মন্তব্যগুলি যে কারও জন্য পড়ছেন: আপনি যদি কেবল নিজের Gmail অ্যাকাউন্টে 2 পদক্ষেপ যাচাইকরণ সক্ষম করে থাকেন তবে আপনার কেবলমাত্র একটি "অ্যাপ্লিকেশন পাসওয়ার্ড" দরকার।
মুগেন

বার্তার এইচটিএমএল অংশে গতিশীল কিছু যুক্ত করার উপায় আছে কি?
ম্যাজমা

40

এইচটিএমএল ইমেল প্রেরণের একটি সহজ উপায়, কেবলমাত্র পাঠ্য / এইচটিএমএল হিসাবে সামগ্রী-ধরণের শিরোনাম নির্দিষ্ট করে:

import email.message
import smtplib

msg = email.message.Message()
msg['Subject'] = 'foo'
msg['From'] = 'sender@test.com'
msg['To'] = 'recipient@test.com'
msg.add_header('Content-Type','text/html')
msg.set_payload('Body of <b>message</b>')

# Send the message via local SMTP server.
s = smtplib.SMTP('localhost')
s.starttls()
s.login(email_login,
        email_passwd)
s.sendmail(msg['From'], [msg['To']], msg.as_string())
s.quit()

2
এটি একটি দুর্দান্ত সহজ উত্তর, দ্রুত এবং নোংরা স্ক্রিপ্টগুলির জন্য কার্যকর, ধন্যবাদ। বিটিডব্লিউর একটি সাধারণ smtplib.SMTP()উদাহরণের জন্য গৃহীত উত্তরকে উল্লেখ করতে পারে , যা tls ব্যবহার করে না। আমি এটি কাজের ক্ষেত্রে অভ্যন্তরীণ স্ক্রিপ্টের জন্য ব্যবহার করেছি যেখানে আমরা এসএমএসটিপি এবং একটি স্থানীয় মেলহাব ব্যবহার করি। এছাড়াও, এই উদাহরণটি অনুপস্থিত s.quit()
মাইক এস

1
"মেলরম_কনফ.স্মিটপি_সভার" সংজ্ঞায়িত করা হয়নি ... পাইথন ৩. 3. যা বলেছে তা কমপক্ষে ...
ZEE

তালিকাভিত্তিক গ্রাহকগণ অ্যাট্রিবিউটআরার ব্যবহার করার সময় আমি ত্রুটি পেয়েছি: 'তালিকা' অবজেক্টটির কোনও 'এলস্ট্রিপ' কোনও সমাধান নেই?
নাভোটেরা

10

এখানে নমুনা কোড। পাইথন কুকবুক সাইটে পাওয়া কোড থেকে এটি অনুপ্রাণিত হয়েছে (সঠিক লিঙ্কটি খুঁজে পাচ্ছে না)

def createhtmlmail (html, text, subject, fromEmail):
    """Create a mime-message that will render HTML in popular
    MUAs, text in better ones"""
    import MimeWriter
    import mimetools
    import cStringIO

    out = cStringIO.StringIO() # output buffer for our message 
    htmlin = cStringIO.StringIO(html)
    txtin = cStringIO.StringIO(text)

    writer = MimeWriter.MimeWriter(out)
    #
    # set up some basic headers... we put subject here
    # because smtplib.sendmail expects it to be in the
    # message body
    #
    writer.addheader("From", fromEmail)
    writer.addheader("Subject", subject)
    writer.addheader("MIME-Version", "1.0")
    #
    # start the multipart section of the message
    # multipart/alternative seems to work better
    # on some MUAs than multipart/mixed
    #
    writer.startmultipartbody("alternative")
    writer.flushheaders()
    #
    # the plain text section
    #
    subpart = writer.nextpart()
    subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
    pout = subpart.startbody("text/plain", [("charset", 'us-ascii')])
    mimetools.encode(txtin, pout, 'quoted-printable')
    txtin.close()
    #
    # start the html subpart of the message
    #
    subpart = writer.nextpart()
    subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
    #
    # returns us a file-ish object we can write to
    #
    pout = subpart.startbody("text/html", [("charset", 'us-ascii')])
    mimetools.encode(htmlin, pout, 'quoted-printable')
    htmlin.close()
    #
    # Now that we're done, close our writer and
    # return the message body
    #
    writer.lastpart()
    msg = out.getvalue()
    out.close()
    print msg
    return msg

if __name__=="__main__":
    import smtplib
    html = 'html version'
    text = 'TEST VERSION'
    subject = "BACKUP REPORT"
    message = createhtmlmail(html, text, subject, 'From Host <sender@host.com>')
    server = smtplib.SMTP("smtp_server_address","smtp_port")
    server.login('username', 'password')
    server.sendmail('sender@host.com', 'target@otherhost.com', message)
    server.quit()


5

পাইথন 3 এর জন্য, @ টালটম্যানের উত্তরের উন্নতি করুন :

  • ইমেল তৈরির email.message.EmailMessageপরিবর্তে ব্যবহার করুন email.message.Message
  • email.set_contentFunc ব্যবহার করুন , subtype='html'যুক্তি বরাদ্দ করুন । নিম্ন স্তরের ফানকের পরিবর্তে set_payloadএবং ম্যানুয়ালি শিরোনাম যুক্ত করুন।
  • ইমেল প্রেরণের জন্য SMTP.send_messageফানকের পরিবর্তে ফানক ব্যবহার করুন SMTP.sendmail
  • withঅটো বন্ধ সংযোগ ব্লক ব্যবহার করুন ।
from email.message import EmailMessage
from smtplib import SMTP

# construct email
email = EmailMessage()
email['Subject'] = 'foo'
email['From'] = 'sender@test.com'
email['To'] = 'recipient@test.com'
email.set_content('<font color="red">red color text</font>', subtype='html')

# Send the message via local SMTP server.
with smtplib.SMTP('localhost') as s:
    s.login('foo_user', 'bar_password')
    s.send_message(email)

4

আসলে, ইয়াগমেল কিছুটা ভিন্ন পন্থা নিয়েছিল।

এটি ডিফল্টরূপে অক্ষম ইমেল-পাঠকদের জন্য স্বয়ংক্রিয় ফ্যালব্যাক সহ এইচটিএমএল প্রেরণ করবে । এটি এখন 17 তম শতাব্দী নয়।

অবশ্যই, এটি ওভাররাইড করা যেতে পারে তবে এখানে যায়:

import yagmail
yag = yagmail.SMTP("me@example.com", "mypassword")

html_msg = """<p>Hi!<br>
              How are you?<br>
              Here is the <a href="http://www.python.org">link</a> you wanted.</p>"""

yag.send("to@example.com", "the subject", html_msg)

ইনস্টলেশন নির্দেশাবলী এবং আরও অনেক দুর্দান্ত বৈশিষ্ট্যের জন্য, গিথুবটি দেখুন


3

smtplibসিসি এবং বিসিসি বিকল্পগুলির সাথে পাইথন থেকে প্লেইন পাঠ্য এবং এইচটিএমএল ইমেল প্রেরণের একটি কার্যকারী উদাহরণ এখানে example

https://varunver.wordpress.com/2017/01/26/python-smtplib-send-plaintext-and-html-emails/

#!/usr/bin/env python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def send_mail(params, type_):
      email_subject = params['email_subject']
      email_from = "from_email@domain.com"
      email_to = params['email_to']
      email_cc = params.get('email_cc')
      email_bcc = params.get('email_bcc')
      email_body = params['email_body']

      msg = MIMEMultipart('alternative')
      msg['To'] = email_to
      msg['CC'] = email_cc
      msg['Subject'] = email_subject
      mt_html = MIMEText(email_body, type_)
      msg.attach(mt_html)

      server = smtplib.SMTP('YOUR_MAIL_SERVER.DOMAIN.COM')
      server.set_debuglevel(1)
      toaddrs = [email_to] + [email_cc] + [email_bcc]
      server.sendmail(email_from, toaddrs, msg.as_string())
      server.quit()

# Calling the mailer functions
params = {
    'email_to': 'to_email@domain.com',
    'email_cc': 'cc_email@domain.com',
    'email_bcc': 'bcc_email@domain.com',
    'email_subject': 'Test message from python library',
    'email_body': '<h1>Hello World</h1>'
}
for t in ['plain', 'html']:
    send_mail(params, t)

ভাবুন এই উত্তরটি সবকিছুকে কভার করে। দুর্দান্ত লিঙ্ক
stingMantis

1

বোটো 3 ব্যবহার করে এডাব্লুএস এর জন্য আমার উত্তরটি এখানে

    subject = "Hello"
    html = "<b>Hello Consumer</b>"

    client = boto3.client('ses', region_name='us-east-1', aws_access_key_id="your_key",
                      aws_secret_access_key="your_secret")

client.send_email(
    Source='ACME <do-not-reply@acme.com>',
    Destination={'ToAddresses': [email]},
    Message={
        'Subject': {'Data': subject},
        'Body': {
            'Html': {'Data': html}
        }
    }

0

অফিস 365 এ সাংগঠনিক অ্যাকাউন্ট থেকে ইমেল প্রেরণের সহজ সমাধান:

from O365 import Message

html_template =     """ 
            <html>
            <head>
                <title></title>
            </head>
            <body>
                    {}
            </body>
            </html>
        """

final_html_data = html_template.format(df.to_html(index=False))

o365_auth = ('sender_username@company_email.com','Password')
m = Message(auth=o365_auth)
m.setRecipients('receiver_username@company_email.com')
m.setSubject('Weekly report')
m.setBodyHTML(final_html_data)
m.sendMessage()

এখানে ডিএফ একটি এইচটিএমএল সারণিতে রূপান্তরিত একটি ডেটা ফ্রেম যা html_template এ ইনজেকশন করা হচ্ছে


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