<tfoot id='YkFlC'></tfoot>

      <bdo id='YkFlC'></bdo><ul id='YkFlC'></ul>

    <small id='YkFlC'></small><noframes id='YkFlC'>

  1. <i id='YkFlC'><tr id='YkFlC'><dt id='YkFlC'><q id='YkFlC'><span id='YkFlC'><b id='YkFlC'><form id='YkFlC'><ins id='YkFlC'></ins><ul id='YkFlC'></ul><sub id='YkFlC'></sub></form><legend id='YkFlC'></legend><bdo id='YkFlC'><pre id='YkFlC'><center id='YkFlC'></center></pre></bdo></b><th id='YkFlC'></th></span></q></dt></tr></i><div id='YkFlC'><tfoot id='YkFlC'></tfoot><dl id='YkFlC'><fieldset id='YkFlC'></fieldset></dl></div>

    <legend id='YkFlC'><style id='YkFlC'><dir id='YkFlC'><q id='YkFlC'></q></dir></style></legend>

      使用 Python 向 Gmail 发送带有内联图像的电子邮件

      时间:2023-10-20
      <legend id='aFr2u'><style id='aFr2u'><dir id='aFr2u'><q id='aFr2u'></q></dir></style></legend>
        • <tfoot id='aFr2u'></tfoot>
            <bdo id='aFr2u'></bdo><ul id='aFr2u'></ul>

                <tbody id='aFr2u'></tbody>

            1. <i id='aFr2u'><tr id='aFr2u'><dt id='aFr2u'><q id='aFr2u'><span id='aFr2u'><b id='aFr2u'><form id='aFr2u'><ins id='aFr2u'></ins><ul id='aFr2u'></ul><sub id='aFr2u'></sub></form><legend id='aFr2u'></legend><bdo id='aFr2u'><pre id='aFr2u'><center id='aFr2u'></center></pre></bdo></b><th id='aFr2u'></th></span></q></dt></tr></i><div id='aFr2u'><tfoot id='aFr2u'></tfoot><dl id='aFr2u'><fieldset id='aFr2u'></fieldset></dl></div>

                <small id='aFr2u'></small><noframes id='aFr2u'>

                本文介绍了使用 Python 向 Gmail 发送带有内联图像的电子邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                我的目标是使用 Python 向具有内嵌图像的 Gmail 用户发送电子邮件.由于图像的敏感性(来自我工作的数据),无法在线托管此图像,然后通过 href 链接到它.

                My objective is to use Python to send an e-mail to a Gmail user that has an inline image. It is not possible to host this image online and then link to it through a href, due to the sensitive nature of the images (data from my work).

                我尝试将 base64 版本编码为 HTML,然后发送 HTML,但众所周知这是行不通的.然后我注意到,在 Gmail 中,您可以将图像拖放到发送框中,它将在接收端内联显示.鉴于此,我尝试从 Python 发送一封电子邮件,并将图像作为附件.这在下面的代码中可以看到,但不幸的是图像没有内联显示.

                I've tried encoding the base64 version into a HTML then sending th is HTML, but this is well known to not work. I then noticed that in Gmail you can drag and drop an image into the send box and it will show up inline in the receiving end. Given this I then tried to send an e-mail from Python with the image as an attachment. This is seen in the below code, but unfortunately the image doesn't show up inline.

                那么我的问题是:如何发送图像以使其内联显示?

                import smtplib
                from email.MIMEMultipart import MIMEMultipart
                from email.MIMEBase import MIMEBase
                from email.MIMEText import MIMEText
                from email import Encoders
                import os
                
                gmail_user = "user1@gmail.com"
                gmail_pwd = "pass"
                
                to = "user2@gmail.com"
                subject = "Report"
                text = "Picture report"
                attach = 'TESTING.png'
                
                msg = MIMEMultipart()
                
                msg['From'] = gmail_user
                msg['To'] = to
                msg['Subject'] = subject
                
                msg.attach(MIMEText(text))
                
                part = MIMEBase('application', 'octet-stream')
                part.set_payload(open(attach, 'rb').read())
                Encoders.encode_base64(part)
                part.add_header('Content-Disposition',
                   'attachment; filename="%s"' % os.path.basename(attach))
                msg.attach(part)
                
                mailServer = smtplib.SMTP("smtp.gmail.com", 587)
                mailServer.ehlo()
                mailServer.starttls()
                mailServer.ehlo()
                mailServer.login(gmail_user, gmail_pwd)
                mailServer.sendmail(gmail_user, to, msg.as_string())
                # Should be mailServer.quit(), but that crashes...
                mailServer.close()
                

                当我手动将内联图像发送给自己时,原始电子邮件"是这样的:

                When I send the inline image to myself manually this is what the "original email" looks like:

                  Content-Type: multipart/related; boundary=047d7bd761fe73e03304e7e02237
                
                --047d7bd761fe73e03304e7e02237
                Content-Type: multipart/alternative; boundary=047d7bd761fe73e03004e7e02236
                
                --047d7bd761fe73e03004e7e02236
                Content-Type: text/plain; charset=ISO-8859-1
                
                [image: Inline images 1]
                
                --047d7bd761fe73e03004e7e02236
                Content-Type: text/html; charset=ISO-8859-1
                
                <div dir="ltr"><img alt="Inline images 1" src="cid:ii_141810ee4ae92ac6" height="400" width="534"><br></div>
                
                --047d7bd761fe73e03004e7e02236--
                --047d7bd761fe73e03304e7e02237
                Content-Type: image/png; name="Testing.png"
                Content-Transfer-Encoding: base64
                Content-ID: <ii_141810ee4ae92ac6>
                X-Attachment-Id: ii_141810ee4ae92ac6
                

                当我通过 Python 将它作为附件发送给自己时,情况就大不相同了:

                When I send it to myself through Python as an attachment it is very different:

                Content-Type: multipart/mixed; boundary="===============6881579935569047077=="
                MIME-Version: 1.0
                (.... some stuff deleted here)
                --===============6881579935569047077==
                Content-Type: text/plain; charset="us-ascii"
                MIME-Version: 1.0
                Content-Transfer-Encoding: 7bit
                
                See attachment for report.
                --===============6881579935569047077==
                Content-Type: application/octet-stream
                MIME-Version: 1.0
                Content-Transfer-Encoding: base64
                Content-Disposition: attachment; filename="TESTING.png"
                

                推荐答案

                看来按照gmail邮件模板可以:

                It seems that following the gmail email template works:

                * multipart/alternative
                  - text/plain
                  - multipart/related
                    + text/html
                      <img src="cid:msgid"/>
                    + image/png
                      Content-ID: <msgid>
                

                基于 email 模块文档:

                Based on the example from email module docs:

                #!/usr/bin/env python3
                import html
                import mimetypes
                from email.headerregistry import Address
                from email.message import EmailMessage
                from email.utils import make_msgid
                from pathlib import Path
                
                title = 'Picture report…'
                path = Path('TESTING.png')
                me = Address("Pepé Le Pew", *gmail_user.rsplit('@', 1))
                
                msg = EmailMessage()
                msg['Subject'] = 'Report…'
                msg['From'] = me
                msg['To'] = [me]
                msg.set_content('[image: {title}]'.format(title=title))  # text/plain
                cid = make_msgid()[1:-1]  # strip <>    
                msg.add_alternative(  # text/html
                    '<img src="cid:{cid}" alt="{alt}"/>'
                    .format(cid=cid, alt=html.escape(title, quote=True)),
                    subtype='html')
                maintype, subtype = mimetypes.guess_type(str(path))[0].split('/', 1)
                msg.get_payload()[1].add_related(  # image/png
                    path.read_bytes(), maintype, subtype, cid="<{cid}>".format(cid=cid))
                
                # save to disk a local copy of the message
                Path('outgoing.msg').write_bytes(bytes(msg))
                

                通过 gmail 发送 msg:

                To send msg via gmail:

                import smtplib
                import ssl
                
                with smtplib.SMTP('smtp.gmail.com', timeout=10) as s:
                    s.starttls(context=ssl.create_default_context())
                    s.login(gmail_user, gmail_password)
                    s.send_message(msg)
                

                Python 2/3 兼容版本

                * multipart/related
                  - multipart/alternative
                    + text/plain
                    + text/html
                      <div dir="ltr"><img src="cid:ii_xyz" alt="..."><br></div>
                  - image/jpeg
                    Content-ID: <ii_xyz>
                

                基于 发送带有嵌入图像和纯文本替代的 HTML 电子邮件:

                #!/usr/bin/env python
                # -*- coding: utf-8 -*-
                import cgi
                import uuid
                import os
                from email.mime.multipart import MIMEMultipart
                from email.mime.text      import MIMEText
                from email.mime.image     import MIMEImage
                from email.header         import Header    
                
                img = dict(title=u'Picture report…', path=u'TESTING.png', cid=str(uuid.uuid4()))
                
                msg = MIMEMultipart('related')
                msg['Subject'] = Header(u'Report…', 'utf-8')
                msg['From'] = gmail_user
                msg['To'] = ", ".join([to])
                msg_alternative = MIMEMultipart('alternative')
                msg.attach(msg_alternative)
                msg_text = MIMEText(u'[image: {title}]'.format(**img), 'plain', 'utf-8')
                msg_alternative.attach(msg_text)
                
                msg_html = MIMEText(u'<div dir="ltr">'
                                     '<img src="cid:{cid}" alt="{alt}"><br></div>'
                                    .format(alt=cgi.escape(img['title'], quote=True), **img),
                                    'html', 'utf-8')
                msg_alternative.attach(msg_html)
                
                with open(img['path'], 'rb') as file:
                    msg_image = MIMEImage(file.read(), name=os.path.basename(img['path']))
                    msg.attach(msg_image)
                msg_image.add_header('Content-ID', '<{}>'.format(img['cid']))
                

                通过 gmail 发送 msg:

                To send msg via gmail:

                import ssl
                
                s = SMTP_SSL('smtp.gmail.com', timeout=10,
                             ssl_kwargs=dict(cert_reqs=ssl.CERT_REQUIRED,
                                             ssl_version=ssl.PROTOCOL_TLSv1,
                                             # http://curl.haxx.se/ca/cacert.pem
                                             ca_certs='cacert.pem')) 
                s.set_debuglevel(0)
                try:
                    s.login(gmail_user, gmail_pwd)
                    s.sendmail(msg['From'], [to], msg.as_string())
                finally:
                    s.quit()
                

                SMTP_SSL 是可选的,您可以使用问题中的 starttls 方法:

                SMTP_SSL is optional, you could use starttls method from your question instead:

                import smtplib
                import socket
                import ssl
                import sys
                
                class SMTP_SSL(smtplib.SMTP_SSL):
                    """Add support for additional ssl options."""
                    def __init__(self, host, port=0, **kwargs):
                        self.ssl_kwargs = kwargs.pop('ssl_kwargs', {})
                        self.ssl_kwargs['keyfile'] = kwargs.pop('keyfile', None)
                        self.ssl_kwargs['certfile'] = kwargs.pop('certfile', None)
                        smtplib.SMTP_SSL.__init__(self, host, port, **kwargs)
                
                    def _get_socket(self, host, port, timeout):
                        if self.debuglevel > 0:
                            print>>sys.stderr, 'connect:', (host, port)
                        new_socket = socket.create_connection((host, port), timeout)
                        new_socket = ssl.wrap_socket(new_socket, **self.ssl_kwargs)
                        self.file = getattr(smtplib, 'SSLFakeFile', lambda x: None)(new_socket)
                        return new_socket
                

                这篇关于使用 Python 向 Gmail 发送带有内联图像的电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                上一篇:使用 imaplib 获取电子邮件,但不要将其标记为 SEEN 下一篇:使用 utf-8 编码的主题的 Python IMAP 搜索

                相关文章

                  <bdo id='Z4ssu'></bdo><ul id='Z4ssu'></ul>

                1. <tfoot id='Z4ssu'></tfoot>

                2. <legend id='Z4ssu'><style id='Z4ssu'><dir id='Z4ssu'><q id='Z4ssu'></q></dir></style></legend>
                3. <small id='Z4ssu'></small><noframes id='Z4ssu'>

                  1. <i id='Z4ssu'><tr id='Z4ssu'><dt id='Z4ssu'><q id='Z4ssu'><span id='Z4ssu'><b id='Z4ssu'><form id='Z4ssu'><ins id='Z4ssu'></ins><ul id='Z4ssu'></ul><sub id='Z4ssu'></sub></form><legend id='Z4ssu'></legend><bdo id='Z4ssu'><pre id='Z4ssu'><center id='Z4ssu'></center></pre></bdo></b><th id='Z4ssu'></th></span></q></dt></tr></i><div id='Z4ssu'><tfoot id='Z4ssu'></tfoot><dl id='Z4ssu'><fieldset id='Z4ssu'></fieldset></dl></div>