Как отправить письмо с html страницей в Django? - PullRequest
0 голосов
/ 30 апреля 2019

Я новичок в Джанго! Я не знаю, как отправить письмо в Джанго. Я ссылаюсь на документацию Django, но она мне не помогла. Мне нужно отправить письмо с html-страницей разным пользователям. В models.py у меня есть два значения Name и Email. Когда я нажимаю кнопку, HTML-страница должна быть отправлена ​​на адрес электронной почты соответствующего пользователя

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Существует множество различных решений, как отправлять электронные письма в django. Вы можете использовать даже php или любой другой язык сценариев, если считаете, что сложно использовать только код python / django.

Просто пример почтовой утилиты из пользовательской почтовой подписки:

email_utility.py:

import logging, traceback
from django.urls import reverse
import requests
from django.template.loader import get_template
from django.utils.html import strip_tags
from django.conf import settings


def send_email(data):
    try:
        url = "https://api.mailgun.net/v3/<domain-name>/messages"
        status = requests.post(
            url,
            auth=("api", settings.MAILGUN_API_KEY),
            data={"from": "YOUR NAME <admin@domain-name>",
                  "to": [data["email"]],
                  "subject": data["subject"],
                  "text": data["plain_text"],
                  "html": data["html_text"]}
        )
        logging.getLogger("info").info("Mail sent to " + data["email"] + ". status: " + str(status))
        return status
    except Exception as e:
        logging.getLogger("error").error(traceback.format_exc())
        return False

Не забудьте создать токен, который мы проверим, когда пользователь щелкнет ссылку подтверждения. Токен будет зашифрован, чтобы никто не мог подделать данные.

token = encrypt(email + constants.SEPARATOR + str(time.time()))

Также проверьте эту ссылку и эту .

0 голосов
/ 30 апреля 2019

Вот наивный пример использования django send_mail:

import smtplib
from django.core.mail import send_mail
from django.utils.html import strip_tags
from django.template.loader import render_to_string


#user will be a queryset like:
users = User.objects.all() # or more specific query
subject = 'Subject'
from_email = 'from@xxx.com'

def send_email_to_users(users,subject,from_email):
    full_traceback = []
    for user in users:
        to = [user.email] # list of people you want to sent mail to.
        html_content = render_to_string('mail_template.html', {'title':'My Awesome email title', 'content' : 'Some email content', 'username':user.username}) # render with dynamic context you can retrieve in the html file
        traceback = {}
        try:
            send_mail(subject,strip_tags(html_content),from_email, to, html_message=html_content, fail_silently=False)
            traceback['status'] = True

        except smtplib.SMTPException as e:
            traceback['error'] = '%s (%s)' % (e.message, type(e))
            traceback['status'] = False

        full_traceback.append(traceback)
    errors_to_return = []
    error_not_found = []
    for email in full_traceback:
        if email['status']:
            error_not_found.append(True)
        else:
            error_not_found.append(False)
            errors_to_return.append(email['error'])

    if False in error_not_found:
        error_not_found = False
    else:
        error_not_found = True
    return (error_not_found, errors_to_return)



#really naive view using the function on top
def my_email_view(request,user_id):
    user = get_object_or_404(User, pk=user_id)
    subject = 'Subject'
    from_email = 'myemail@xxx.com'
    email_sent, traceback = send_email_to_users(user, subject, from_email)

    if email_sent:
        return render(request,'sucess_template.html')

    return render(request,'fail_template.html',{'email_errors' : traceback})

В вашем шаблоне mail_template.html:

<h1>{{title}}</h1>
<p>Dear {{username}},</p>
<p>{{content}}</p>

И не забудьте установить настройки электронной почты в настройках.py: https://docs.djangoproject.com/fr/2.2/ref/settings/#email-backend

Send_mail от документов: https://docs.djangoproject.com/fr/2.2/topics/email/#send-mail

Render_to_string из документа: https://docs.djangoproject.com/fr/2.2/topics/templates/#django.template.loader.render_to_string

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...