Как я могу прикрепить файлы изображений и одно и то же изображение, встроенные в текст сообщения электронной почты в формате html? - PullRequest
1 голос
/ 08 апреля 2019

Я могу только прикреплять файлы изображений, но встроенные файлы изображений не отображаются в письме.Это говорит, что изображение ссылки не может быть отображено, файл может быть удален, удален или переименован.проверьте точку ссылки, чтобы исправить файл изображения и местоположение, а также вложенные файлы имеют одинаковый размер.ниже приведен код, который я использовал

from requests_toolbelt import MultipartEncoder
import requests
import smtplib
import base64
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.image import MIMEImage
from os.path import basename
from jinja2 import Template

def send_mail(send_from: str, subject: str, text: str,send_to: list, files= None):

    send_to= default_address if not send_to else send_to
    main = Template('''
    <html><body>
    {% for image in pictures %}<img src="cid:{{image}}">{% endfor %}
    </body></html>''')  
    msg = MIMEMultipart()
    html = main.render(pictures=files)
    part2 = MIMEText(html, 'html')
    msg.attach(part2)
    msg['From'] = send_from
    msg['To'] = ', '.join(send_to)
    msg['Subject'] = subject
    for f in files or []:
        with open(f, "rb") as fil:
            msgImage = MIMEImage(fil.read())
            ext = f.split('.')[-1:]
            attachedfile = MIMEApplication(fil.read(), _subtype = ext)
            fil.close()
            msgImage.add_header('Content-ID', '<{}>'.format(f))
            msgImage.add_header('content-Disposition','inline',filename=f)
            msg.attach(msgImage)
            attachedfile.add_header(
                'content-disposition', 'attachment', filename=basename(f) )
        msg.attach(msgImage)
        msg.attach(attachedfile)
    smtp = smtplib.SMTP(host="smtp-mail.outlook.com", port= 25)
    smtp.starttls()
    smtp.login(usr,pwd)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.close()
send_mail(send_from= frommail,
subject="Daily backup Testing",
text='files added: ',
send_to= tomail,
files= files_list)

Я получаю почту как screenshot.Файлы пути к изображениям верны.когда я печатаю, я получаю это files ['check123\\Screenshot (161).png', 'check123\\Screenshot (163).png', 'check123\\Screenshot (164).png'] Как я могу решить эту проблему?

1 Ответ

1 голос
/ 08 апреля 2019

Имена файлов не особенно подходят в качестве идентификаторов cid:.В частности, обратные косые черты и круглые скобки недопустимы в cid: идентификаторах.См. Также Каковы действительные символы для сообщения Mime Multipart ContentId "CID:"?

Может быть, просто сгенерировать уникальные случайные идентификаторы из ограниченного набора символов и сопоставить их с именами файлов вместо.

С макушки головы (не проверено),

import random # in addition to the other imports you have
import string

# cribbed from https://stackoverflow.com/a/2030081/874188
def random_cid ():
    letters = string.ascii_lowercase
    return ''.join(random.choice(letters) for i in range(10))

def send_mail(send_from: str, subject: str, text: str,send_to: list, files= None):

    send_to= default_address if not send_to else send_to

    cid_map = { x: random_cid() for x in files }
    main = Template('''
    <html><body>
    {% for image in pictures %}<img src="cid:{{cid_map[image]}}">{% endfor %}
    </body></html>''')
    msg = MIMEMultipart()
    html = main.render(pictures=files, cid_map=cid_map)
    part2 = MIMEText(html, 'html')  
    # ...
    for f in files:
        with open(f, "rb") as fil:
            msgImage = MIMEImage(fil.read())
            ext = f.split('.')[-1:]
            attachedfile = MIMEApplication(fil.read(), _subtype = ext)
            fil.close()
            msgImage.add_header('Content-ID', '<{}>'.format(cid_map[f]))
            msgImage.add_header('content-Disposition','inline',filename=f)
            msg.attach(msgImage)
            attachedfile.add_header(
                'content-disposition', 'attachment', filename=basename(f) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...