<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 发送带有内联图像的电子邮件

      Send e-mail to Gmail with inline image using Python(使用 Python 向 Gmail 发送带有内联图像的电子邮件)
      <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 发送带有内联图像的电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                Running .jl file from R or Python(从 R 或 Python 运行 .jl 文件)
                Running Julia .jl file in python(在 python 中运行 Julia .jl 文件)
                Using PIP in a Azure WebApp(在 Azure WebApp 中使用 PIP)
                How to run python3.7 based flask web api on azure(如何在 azure 上运行基于 python3.7 的烧瓶 web api)
                Azure Python Web App Internal Server Error(Azure Python Web 应用程序内部服务器错误)
                Run python dlib library on azure app service(在 azure app 服务上运行 python dlib 库)
                  <tbody id='Z4ssu'></tbody>
                  <bdo id='Z4ssu'></bdo><ul id='Z4ssu'></ul>

                    • <tfoot id='Z4ssu'></tfoot>

                      • <legend id='Z4ssu'><style id='Z4ssu'><dir id='Z4ssu'><q id='Z4ssu'></q></dir></style></legend>

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