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

#python #python-3.x #email #outlook #amazon-ses

#python #python-3.x #Адрес электронной почты #outlook #amazon-ses

Вопрос:

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

 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='default@sender.com', 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, приложении Mail и Outlook для Mac. Однако… весь ад вырывается на свободу, когда мои коллеги открывают их в Outlook в Windows. Некоторые видят очень крошечные изображения, некоторые получают искаженные изображения, некоторым нужно сделать 250%, чтобы увидеть электронное письмо в удобочитаемом размере. Поскольку это работает со всем остальным, за исключением Outlook в Windows, я должен предположить, что проблема есть. Есть ли способ исправить это в коде? Есть ли настройка Outlook для предотвращения этого? Большинство моих коллег используют Windows, поэтому мне нужна небольшая помощь.

Ответ №1:

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

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

 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 тег в a 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>