Django + Anymail + Mailgun — электронная почта HTML рендерится без кнопки и изображения

У меня возникла проблема при попытке отправить электронное письмо, содержащее html и изображение, через mailgun, используя библиотеку anymail.

Это мой код:

url_formulario = CLIENT_URL + str(token.key)
email = EmailMultiAlternatives('Confirmación Vacante', to=emails)
cid = attach_inline_image_file(email, '/var/www/static/icons/ba_logo.png')
contexto = {'nombre_contacto': contacto.responsable_nombre, 
            'nombre_alumno': contacto.alumno_nombre, 
            'url_formulario': url_formulario,
            'imagen':cid}
mensaje = render_to_string('email.html', context=contexto)
email.attach_alternative(mensaje, "text/html")
email.track_clicks = True
email.send()

Я также пытался сделать это следующим образом:

url_formulario = CLIENT_URL + str(token.key)
contexto = {'nombre_contacto': contacto.responsable_nombre, 
            'nombre_alumno': contacto.alumno_nombre, 
            'url_formulario': url_formulario}
mensaje = render_to_string('email.html', context=contexto)
content = strip_tags(mensaje)
email = EmailMultiAlternatives('Confirmación Vacante', content,to=emails)
email.attach_alternative(mensaje, "text/html")
email.track_clicks = True
email.send()

Вот две соответствующие версии html-файла, которые я использую:

<html>
<head>
    <title>Ingresa al formulario</title>
        <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

    <!-- Bastrap CSS -->
    <link rel="stylesheet" href="/static/css/bastrap.css">      
    <style>
            .contenedor-general{
                background:#e5e5e5;
                padding-top:3em;
            }
            .contenedor-general img{
                padding-bottom:3em;
            }
            .contenido-mensaje{
                background:white;
                margin-bottom:calc(43px + 6em);
            }
            .contenido-mensaje p{
                font-family:"CHANEWEI", Helvetica, Arial, sans-serif;
                margin:7%;
                color:#717170;
            }
            .contenido-mensaje h1,
            .contenido-mensaje a{
                margin: 0 7% 0 7%;
            }
            .contenido-mensaje h1{
                padding-top:7%;
                color:#717170;
            }
            .contenido-mensaje a{
                color:#333;
            }
            .btn-primary{
                background-color:#fcda59 !important;
                color:#685723 !important;
                box-shadow:none !important;
            }

            .btn-primary:hover{
                background-color:#fdd306 !important;
                border-color:#fdd306 !important;
                color:#685723 !important;
                box-shadow:none !important;
            }
    </style>
</head>
<body>
    <div class="container">
        <div class="contenedor-general col-lg-8 col-lg-offset-2">
            <img src="{{imagen}}" alt="Logo Buenos Aires" class="center-block"/>
            <div class="col-lg-8 col-lg-offset-2 contenido-mensaje">
                <h2>Hola {{nombre_contacto}},</h2>
                <p>Tenemos una vacante escolar pendiente para {{nombre_alumno}}</p>
                <a href='{{url_formulario}}' class="btn btn-lg btn-primary">Confirmar vacante</a>
                <p>Si tenés problemas para ingresar comunicate al XXXX-XXXX (Número de télefono)</p>
                <p>Muchas gracias</p>
            </div>
    </div>
    </body>
</html>

Другой вариант тега без передачи изображения:

<img src="" alt="Logo Buenos Aires" class="center-block"/>

Это полученное электронное письмо:

введите здесь описание изображения

Есть ли способ прикрепить html-файл после его рендеринга к строке с указанным контекстом и прикрепленным изображением?

Спасибо.


person Guido    schedule 29.08.2018    source источник


Ответы (1)


Похоже, в вашем шаблоне отсутствует cid: часть <img src>. У вас есть:

<img src="{{imagen}}" alt="Logo Buenos Aires" class="center-block"/>

Но это должно быть:

<img src="cid:{{imagen}}" alt="Logo Buenos Aires" class="center-block"/>

Схема cid: позволяет почтовому клиенту обрабатывать значение {{imagen}} как встроенный Content-ID. Без этого клиент не знает, где он должен искать этот источник изображения, поэтому вместо этого вы получаете значок сломанного изображения.

Более подробная информация содержится в документах по Anymail.

person medmunds    schedule 30.08.2018