पायथन का उपयोग करके HTML ईमेल भेजना


260

मैं पायथन का उपयोग करके ईमेल में HTML सामग्री कैसे भेज सकता हूं? मैं साधारण पाठ भेज सकता हूं।


बस एक बड़ी मोटी चेतावनी। यदि आप Python <3.0 का उपयोग करके गैर- ASCII ईमेल भेज रहे हैं , तो Django में ईमेल का उपयोग करने पर विचार करें । यह UTF-8 स्ट्रिंग्स को सही ढंग से लपेटता है, और उपयोग करने के लिए बहुत सरल है। आपको चेतावनी दी गई है :-)
एंडर्स रूण जेनसेन

1
यदि आप यूनिकोड के साथ एक HTML भेजना चाहते हैं तो यहां देखें: stackoverflow.com/questions/36397827/…
guettli

जवाबों:


419

से 18.1.11 - अजगर v2.7.14 प्रलेखन। ईमेल: उदाहरण :

एक वैकल्पिक सादे पाठ संस्करण के साथ HTML संदेश बनाने का एक उदाहरण इस प्रकार है:

#! /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
xpanta

एचटीएमएल को अंतिम रूप से संलग्न करना सुनिश्चित करें, क्योंकि पसंदीदा (दिखा रहा) हिस्सा अंतिम संलग्न होगा। # According to RFC 2046, the last part of a multipart message, in this case # the HTML message, is best and preferred. मेरी इच्छा है कि मैं इसे 2 वर्ष पहले
पढ़ूं

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
@MFB - क्या आपने Bitbucket repo की कोशिश की है? bitbucket.org/ginstrom/mailer
रयान जिंस्ट्रोम

2
जीमेल के लिए एक प्रदान करना चाहिए use_tls=True, usr='email'और pwd='password'जब इनिशियलाइज़ करना Mailerऔर यह काम करेगा।
टूनअल्फ्रिंक

मैं आपके कोड को संदेश के बाद सही लाइन में जोड़ने की सलाह message.Body = """Some text to show when the client cannot show HTML emails"""
दूंगा। HTML

महान, लेकिन चर मानों को लिंक से कैसे जोड़ा जाए, मेरा मतलब है कि इस <a href=" python.org/somevalues"> लिंक </ a > जैसा लिंक बनाना ताकि मैं उन मूल्यों तक पहुँच पा सकूँ , जिन मार्गों तक यह जाता है। धन्यवाद
TaraGurung

49

यहां स्वीकृत उत्तर का जीमेल कार्यान्वयन है:

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
महान कोड, यह मेरे लिए काम करता है, अगर मैं Google में कम सुरक्षा
तोवस्क

15
मैं python smtplib के साथ एक Google एप्लिकेशन विशिष्ट पासवर्ड का उपयोग करता हूं , कम सुरक्षा जाने के बिना चाल चली।
योय

2
उपरोक्त टिप्पणियों को पढ़ने वाले किसी के लिए: आपको केवल "ऐप पासवर्ड" की आवश्यकता होती है यदि आपने पहले अपने जीमेल खाते में 2 चरण सत्यापन सक्षम किया है।
मुगें

क्या संदेश के HTML भाग में गतिशील रूप से कुछ जोड़ने का एक तरीका है?
मैग्मा

40

यहां HTML ईमेल भेजने का एक सरल तरीका है, केवल सामग्री-प्रकार के शीर्षक को 'टेक्स्ट / html' के रूप में निर्दिष्ट करके:

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
यह एक अच्छा सरल उत्तर है, त्वरित और गंदी लिपियों के लिए आसान है, धन्यवाद। BTW एक सरल smtplib.SMTP()उदाहरण के लिए स्वीकृत उत्तर को संदर्भित कर सकता है , जो tls का उपयोग नहीं करता है। मैंने इसे आंतरिक स्क्रिप्ट के लिए काम में उपयोग किया जहां हम ssmtp और एक स्थानीय मेलहब का उपयोग करते हैं। साथ ही, यह उदाहरण गायब है s.quit()
माइक एस।

1
"mailmerge_conf.smtp_server" परिभाषित नहीं किया गया है ... कम से कम पायथन 3.6 कहता है ...
ZEE

सूची आधारित रसीदों का उपयोग करते समय मुझे त्रुटि मिली थी AttrearError: 'सूची' ऑब्जेक्ट का कोई समाधान 'lstrip' नहीं है?
नवोतेरा

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

python3 के लिए, @taltman के उत्तर में सुधार करें :

  • ईमेल के निर्माण के email.message.EmailMessageबजाय उपयोग करें email.message.Message
  • email.set_contentदुर्गंध का उपयोग करें , subtype='html'तर्क असाइन करें । निम्न स्तर के फ़ंक के बजाय set_payloadऔर हेडर को मैन्युअल रूप से जोड़ें।
  • ईमेल भेजने के लिए SMTP.send_messagefunc के बजाय func का उपयोग करें 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

दरअसल, यागमेल ने कुछ अलग तरीका अपनाया।

यह डिफ़ॉल्ट रूप से HTML भेज सकता है, अक्षम ईमेल-पाठकों के लिए स्वचालित वापसी के साथ। यह अब 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)

स्थापना के निर्देश और कई और अधिक महान सुविधाओं के लिए, पर एक नजर है GitHub


3

यहाँ smtplibCC और BCC विकल्पों के साथ-साथ Python के सादे पाठ और HTML ईमेल भेजने का एक कार्यशील उदाहरण दिया गया है ।

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)

सोचें कि यह उत्तर सब कुछ कवर करता है। शानदार लिंक
स्टिंगमैटिस

1

यहाँ boto3 का उपयोग कर AWS के लिए मेरा जवाब है

    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

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

यहाँ df html टेबल में कनवर्ट की गई डेटाफ्रेम है, जिसे html_template पर इंजेक्ट किया जा रहा है


कार्यालय या संगठनात्मक खाते का उपयोग करने के बारे में कुछ भी उल्लेख नहीं करता है। अच्छा योगदान लेकिन
पूछने वाले के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.