【问题标题】:Python 3 EmailMessage html message with Image带有图像的 Python 3 EmailMessage html 消息
【发布时间】:2016-04-28 12:30:47
【问题描述】:

我正在尝试将图像显示为使用 Python 发送的邮件的一部分。 Python 文档中有一个示例不起作用。

from datetime import datetime
import sys

import smtplib

from email.message import EmailMessage
from email.headerregistry import Address
from email.utils import make_msgid



from email.mime.image import MIMEImage

attachment = '/user/file/test.png'


import email.policy
msg = EmailMessage()
msg['To'] = Address("Srujan", 'myemail@example.com')
msg['From'] = Address("Srujan", 'myemail@example.com')
msg['Subject'] = "Nice message goes with it "+str(datetime.now())
id = make_msgid()
msg.set_type('text/html')
msg.set_content(" This is the Data Message that we want to send")
html_msg = "<br> <b><u> This is the Text .... </u></b><br> <img src='cid:{image_id}' />".format(image_id=id[1:-1])
msg.add_alternative(html_msg, subtype="html")
image_data = open(attachment, "rb")
image_mime = MIMEImage(image_data.read())
image_data.close()
msg.add_attachment(image_mime,   cid=id, filename = "myown.png" ,)


try:
    with smtplib.SMTP('example.com') as s:
        s.ehlo()
        s.starttls()
        s.ehlo()
        
        s.send_message(msg)
        s.close()
    print("Email sent!")
except:
    print("Unable to send the email. Error: ", sys.exc_info()[0])
    raise

我注意到最后一部分是message/rfc822,然后包含image/png

To: Srujan <"myemail@example.com"> From: Srujan
<"myemail@example.com"> Subject: Nice message goes with it 2016-01-21
17:39:23.642762 MIME-Version: 1.0 Content-Type: multipart/mixed;
boundary="===============3463325241650937591=="

--===============3463325241650937591==
Content-Type: multipart/alternative; boundary="===============0739224896516732414=="

--===============0739224896516732414==
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit

 This is the Data Message that we want to send

--===============0739224896516732414==
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: 7bit MIME-Version: 1.0

<br> <b><u> This is the Text .... </u></b><br> <img
src='cid:20160122013923.64205.76661' />

--===============0739224896516732414==--

--===============3463325241650937591==
Content-Type: message/rfc822
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="myown.png"
Content-ID: <20160122013923.64205.76661>
MIME-Version: 1.0

Content-Type: image/png
MIME-Version: 1.0
Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAIAAAAVFBUnAAAABmJLR0QA/wD/AP+gvaeTAAAgAElE
QVR4nOzdd2BUVfYH8HNfmZJAChAEQ1FAqoKgCAsWLEgTG4gKP11FQNG1AauIgGBXVhRUsCK4i6gI

现在附加的消息有两个内容类型值。电子邮件只有文字,没有图片。

我已经通过MultiPart 类成功地做到了,但希望通过EmailMessage 来实现。

【问题讨论】:

    标签: python-3.x smtp html-email


    【解决方案1】:

    很遗憾,关于这个主题的 Python 文档不完整/错误。我想做同样的事情并遇到同样的问题(附件有两种内容类型)

    通过在EmailMessage 对象上使用attach() 方法而不是add_attachment() 解决了问题。唯一需要注意的是,在执行此操作之前,您必须将 EmailMessage 转换为 multipart/mixed 类型。一个例子:

    from smtplib import SMTP
    from email.message import EmailMessage
    from email.mime.text import MIMEText
    from email.headerregistry import Address
    from ssl import SSLContext, PROTOCOL_TLSv1_2
    
    # Creating and populating email data:
    msg = EmailMessage()
    msg['From'] = Address(display_name='Recipient', addr_spec='rcpt@example.org')
    msg['To'] = Address(display_name='Sender', addr_spec='sender@example.org')
    msg['Subject'] = 'An email for you'    
    msg.set_content('This should be in the email body')  
    # It is possible to use msg.add_alternative() to add HTML content too  
    
    # Attaching content:
    att = MIMEText('This should be in an attached file') # Or use MIMEImage, etc
    # The following line is to control the filename of the attached file
    att.add_header('Content-Disposition', 'attachment', filename='attachment.txt')
    msg.make_mixed() # This converts the message to multipart/mixed
    msg.attach(att) # Don't forget to convert the message to multipart first!
    
    # Sending the email:
    with SMTP(host='smtp.example.org', port=587) as smtp_server:
        try:
            # You can choose SSL/TLS encryption protocol to use as shown
            # or just call starttls() without parameters
            smtp_server.starttls(context=SSLContext(PROTOCOL_TLSv1_2))
            smtp_server.login(user='user@smtp.example.org', password='password')
            smtp_server.send_message(msg)
    
        except Exception as e:                
            print('Error sending email. Details: {} - {}'.format(e.__class__, e))
    

    【讨论】:

    • 我尝试了这条路线,但 gmail 一直拒绝它:'不接受在 From: 550 5.7.1 标头中缺少有效地址或没有 From: 标头的邮件'。我什至没有尝试过 Flask 应用程序。让我们知道您是否有更新
    • 不幸的是,很久以前我停止使用 Python 进行开发。这次恐怕帮不了你了?
    猜你喜欢
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2015-06-14
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多