Как отправить таблицу в сообщение почты в Питоне?

Есть необходимость вставить таблицу в почтовое сообщение в Питоне. Как это можно организовать? Как я понимаю, нужно преобразовать текст в html код?

def order_created_shop(order_id):
    """
    Задача для отправки уведомления по электронной почте при успешном создании заказа на почту магазина. 
    """
    order = Order.objects.get(id=order_id)
    subject = 'Заказ №10{}'.format(order_id)
    message = 'Добрый день, заказ №10{}. сформирован на сайте "kosmetica".'.format(order.id)
    sum_order = 0                                         
    for item in OrderItem.objects.filter(order=order):
        sum_order += round(item.quantity*item.price, 1)
        message += '\n{}, кол-во: {} шт., сумма: {} руб.'\
            .format(item.product, item.quantity, round(item.quantity*item.price, 1))
        sum_order_coupon = round(sum_order - sum_order/100*order.discount, 1)
    message += '\n\nСтоимость заказа - {} руб.'.format(sum_order)
    if order.coupon is not None:
        message += '\n\nСкидка ("{}") - {} руб.'.format(order.coupon, round(sum_order/100*order.discount, 1))
    message += '\n\nОкончательная стоимость - {} руб.'.format(sum_order_coupon)
    message += '\n\nГород {}'.format(order.city)
    message += '<html>'
    message += '<table><tr>'
    message += '<th>Имя</th>'
    message += '<th>Фамилия</th>'
    message += '<th>Отчество</th>'
    message += '</tr></table>'
    message += '</html>'

    mail_sent = send_mail(subject,
                            message,
                            settings.EMAIL_HOST_USER,
                            ['[email protected]'])
    return mail_sent

исправленный код


def order_created_shop(order_id):
    """
    Задача для отправки уведомления по электронной почте при успешном создании заказа на почту магазина. 
    """
    order = Order.objects.get(id=order_id)
    subject = 'Заказ №10{}'.format(order_id)
    message = 'Добрый день, заказ №10{}. сформирован на сайте "kosmetica".'.format(order.id)
    sum_order = 0                                         
    for item in OrderItem.objects.filter(order=order):
        sum_order += round(item.quantity*item.price, 1)
        message += '\n{}, кол-во: {} шт., сумма: {} руб.'\
            .format(item.product, item.quantity, round(item.quantity*item.price, 1))
        sum_order_coupon = round(sum_order - sum_order/100*order.discount, 1)
    message += '\n\nСтоимость заказа - {} руб.'.format(sum_order)
    if order.coupon is not None:
        message += '\n\nСкидка ("{}") - {} руб.'.format(order.coupon, round(sum_order/100*order.discount, 1))
    message += '\n\nОкончательная стоимость - {} руб.'.format(sum_order_coupon)
    message += '\n\nЗаказчик:\n' 

    data = [
        ('Имя: ', f"{order.first_name}"),
        ('Фамилия: ', f"{order.last_name}"),
        ('Телефон: ', f"{order.telefon}"),
        ('Email: ', f"{order.email}"),
        ('Город: ', f"{order.city}"),
        ('Индекс: ', f"{order.postal_code}"),
        ('Адрес: ', f"{order.address}"),
        ('Создан: ', f"{order.updated}"),
        ]

    message += tabulate(data)

    html = f'''
    <!DOCTYPE html><html><head>
    <meta charset="utf-8" /></head><body><table><tr>
    <th>{order.first_name}</th>'
    <th>Фамилия</th>
    <th>Отчество</th>
    </tr></table></body></html>
    '''

    # message += html

    # mail_sent = EmailMessage(subject,
    #                         message,
    #                         settings.EMAIL_HOST_USER,
    #                         ['[email protected]'])
    # mail_sent.content_subtype = 'html'

    mail_sent = EmailMultiAlternatives(subject,
                                message,
                                settings.EMAIL_HOST_USER,
                                ['[email protected]'])
    mail_sent.attach_alternative(html, 'text/html')
    return mail_sent

Ответы (2 шт):

Автор решения: asanisimov

Вы можете использовать стандартный шаблонизатор.


html_mess = render_to_string('<ваш шаблон:html>',
                                         context=<ваш контекст:dict>)
em = EmailMultiAlternatives(...kwargs)
em.attach_alternative(html_message, 'text/html')
em.send()
→ Ссылка
Автор решения: Albert

В исправленном коде вы пропустили строчку в конце функции:

mail_sent.send()
→ Ссылка