Как отправить таблицу в сообщение почты в Питоне?
Есть необходимость вставить таблицу в почтовое сообщение в Питоне. Как это можно организовать? Как я понимаю, нужно преобразовать текст в 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()