Django 中的电子邮件未发送

Email in Django not sending

我正在尝试使用 Gmail SMTP 发送电子邮件,我的所有电子邮件设置都是正确的,但电子邮件没有发送,我也没有收到任何异常。 我从 HTML 表格中提取我的价值观。另外,我注意到当我尝试从 shell 终端发送邮件时,它实际上发送了,但不是在应用程序本身。

电子邮件设置

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD')
EMAIL_HOST_USER = config('EMAIL_HOST_USER')
EMAIL_USE_TLS = config('EMAIL_USE_TLS', default=True, cast=bool)

views.py

from django.shortcuts import render
from django.core.mail import send_mail

def send_mail(request):
    if request.method == "POST":
        name= request.POST["name"]
        gender= request.POST["gender"]
        contact_addr= request.POST["contact_addr"]

        msg = 'Hello', name


        send_mail(
            "Subject",
            msg,
            'sender@gmail.com',
            ["receiver@gmail.com"],
            fail_silently=False,
        )

        return render(request, "main.html", {'name':name})
    else:
        return render(request, "main.html", {})

html 模板

<form
        action="{% url 'app:success' %}"
        method="POST"
      >
        {% csrf_token %}
        <div class="row">
          <label for="name">Name</label>
          <input
            name="name"
            id="name"
          />
        </div>

        <div class="row">
          <label for="gender">Gender</label>
          <input
            name="gender"
            id="gender"
          />
        </div>

        <div class="row">
          <label for="contact">Contact</label>
          
          <input
            name="contact"
            id="contact"
          />
        </div>

        <div class="row">
          <input type="submit" value="send" />
        </div>
      </form>
  • 您没有向 Django 适当地提供 email 以发送邮件。

  • 更改视图名称。

  • 你没有提供 Django 知道是否发送电子邮件的任何信息。

您应该创建一个表单(可能用于测试)。 (你也可以不用表格):-

forms.py

class EmailForm(forms.Form):
    name = forms.CharField(max_length=25)
    description = forms.CharField(widget=forms.Textarea)

views.py

from .forms import EmailForm
 
def sending_email_django(request):

    sent = False
    if request.method == "POST":
        form = EmailForm(request.POST)

        subject = f" This is email via Django."\
        message = f" Is email is receiving ? "\

        send_mail(subject, message, 'sender_host_email@gmail.com',
                   ['receiver_host_email@gmail.com'])

        sent = True # Email is sent

    else:
        form = EmailForm()

    context = {'form':form}
    return render(request, 'send_email_page.html', context)

Don't forget to import the EmailForm in view.

注:-

  • 我没有在 database 中保存表格。

  • 如果你想向 Django 的注册用户发送电子邮件,那么你必须在 [receiver_host_email@gmail.com] 的位置指定 receiver 的电子邮件,如 [request.user.email]

好吧,我明白了。我注意到要发送邮件,表单操作必须 return 自身(我不知道为什么,但这就是它发送的方式)。所以 <form action="{% url 'app:success' %}" method="POST"> 变成 <form action="{% url 'app:send_mail' %}" method="POST">