Outlook в Windows изменяет размер изображений в электронных письмах

У меня есть следующая функция для отправки писем:

import logging
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

import boto3


def send_email(body, subject, recipients, region_name='us-east-1',
               sender='[email protected]', attachments=False):
    logging.info('Generating email from {} to {} about {}'.format(sender,
                                                                  str(recipients),
                                                                  subject))

    message = MIMEMultipart()
    message['Subject'] = subject
    message['From'] = sender
    message['To'] = ', '.join(recipients)

    logging.info('Adding attachments...')

    if attachments:
        for attachment in attachments:
            logging.info('Adding ' + attachment)

            f = open(os.path.normpath(attachment), 'rb')
            a = MIMEApplication(f.read())
            f.close()
            a.add_header('Content-Disposition', 'attachment',
                         filename=os.path.basename(attachment))
            message.attach(a)

            logging.info('Attachment added!')

    else:
        logging.info('No attachments found!')

    logging.info('Adding body...')

    part = MIMEText(body, 'html')
    message.attach(part)

    client = boto3.client('ses', region_name=region_name)

    logging.info('Sending...')
    client.send_raw_email(
        Source=message['From'],
        Destinations=recipients,
        RawMessage={
            'Data': message.as_string()
        }
    )

    logging.info('Sent!')

Это работает как шарм, и я использую его во множестве вариантов использования. Один из вариантов использования - отправить изображение в теле письма. Когда это происходит, я делаю что-то вроде этого:

send_email('''<img src="cid:{}" width={} height={}>'''.format(final_image_name,
                                                                  width_of_new_image,
                                                                  height_of_new_image),
               'Email with body image', recipients,
               attachments=['/tmp/{}'.format(final_image_name), ])

И это работает. Все идеально, когда вы открываете электронную почту на iPad, iPhone, в почтовом приложении или в Outlook для Mac. Однако ... ад начинается, когда мои коллеги открывают их в Outlook в Windows. Кто-то видит очень крошечные изображения, кто-то искажает изображение, кому-то нужно увеличить размер до 250%, кому-то, чтобы увидеть письмо в удобочитаемом размере. Поскольку это работает со всем остальным, за исключением Outlook в Windows, я должен предположить, что проблема здесь. Есть ли способ исправить это в коде? Есть ли настройка Outlook, чтобы предотвратить это? Большинство моих коллег используют Windows, поэтому мне нужна небольшая помощь.


person rodrigocf    schedule 16.10.2020    source источник


Ответы (1)


У меня нет Outlook, поэтому я не могу воспроизвести проблему.

Попробуйте добавить кавычки и px с атрибутами ширины и высоты, например:

send_email('''<img src="cid:{}" width="{}px" height="{}px">'''.format(final_image_name,
                                                                  width_of_new_image,
                                                                  height_of_new_image),
               'Email with body image', recipients,
               attachments=['/tmp/{}'.format(final_image_name), ])

Может быть, Outlook уменьшает изображение, чтобы оно поместилось в окне?

Попробуйте обернуть тег img в div и установить минимальную ширину / высоту.

html_str = f'''<div style="width: 100%; min-width: {width_of_new_image}px; height: 100%; min-height: {height_of_new_image}px;"><img src="cid:{final_image_name}" width="{width_of_new_image}px" height="{height_of_new_image}px"></div>'''
send_email(html_str, 'Email with body image', recipients, attachments=['/tmp/{}'.format(final_image_name), ])

Приведенный выше код должен выдать что-то вроде этого:

<div style="width: 100%; min-width: 800px; height: 100%; min-height: 600px;"><img src="cid:imagename" width="800px" height="600px"></div>
person GordonAitchJay    schedule 20.10.2020