Не удается заставить send_mail работать в Django 2.3.Нет сообщения об ошибке.Никакое сообщение журнала, указывающее, что электронное письмо отправлено или не отправлено - PullRequest
0 голосов
/ 10 июля 2019

Итак, я искал интернет, пытаясь заставить мой код работать, и мне кажется, что я прочитал все посты об этой проблеме и до сих пор не понял, почему я не могу получить свою форму, чтобы отправить мне электронное письмо,Я создал представление на основе классов, которое наследует FormView, и написал метод, который должен отправлять мне электронное письмо в любое время после пост-запроса.На всю жизнь я не могу заставить его работать.

Для тех, кто находится в одной лодке, этот пост казался многообещающим, поэтому, надеюсь, он поможет вам, даже если он мне не поможет:

Django отправка электронной почты

Мои views.py: (оба адреса электронной почты одинаковы. Это должно имитировать отправку мне письма себе.)

class CandRegisterView(FormView):
    template_name = 'website/candidate_register.html'
    form_class = UploadResumeForm
    def send_email(self, request):
        if request.method == 'POST':
            send_mail('Test', 'This is a test', 'myemail@gmail.com', ['myemail@gmail.com'], fail_silently=False)

my forms.py:

from django import forms

class UploadResumeForm(forms.Form):
    first_name = forms.CharField(
        widget=forms.TextInput(
            attrs={
            'type':'text',
            'class': 'form-control',
            'placeholder': 'First Name',
            }), 
        required=True)

my settings.py (переменные хранятся в файле .env, и я использую развязку python, чтобы добавить их, не раскрывая информацию на github. Но это их соответствующие значения)

EMAIL_USE_TLS=True
EMAIL_USE_SSL=False
EMAIL_HOST=smtp.gmail.com
EMAIL_HOST_USER=myemail@gmail.com
EMAIL_HOST_PASSWORD=***************
EMAIL_PORT=587
EMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend'
DEFAULT_FROM_EMAIL='myemail@gmail.com'
SERVER_EMAIL='myemail@gmail.com

urls.py:

from django.urls import path, re_path
from .views import CandRegisterView

re_path(r'^candidate-register/$', CandRegisterView.as_view(success_url="/candidate-register/"), name='cand_register'),

candid_register.html:

<form method= "post" action="" accept-charset="UTF-8" role="form">
                {% csrf_token %}

                <fieldset>
                  <div class="form-group">
                    <div class="input-group input-group-lg">
                      <span class="input-group-addon"><i class="fa fa-fw fa-user"></i></span>
                      {{form.first_name}}
                      <!-- <input type="text"  class="form-control" placeholder="First Name" name={{form.first_name}}> -->
                    </div>
                  </div>
                  <input class="btn btn-lg btn-primary btn-block" type="submit" value="Send Email">
                </fieldset>
              </form>

Вот что я получаю из консоли после нажатия кнопки «Отправить» .:

[10/Jul/2019 13:19:21] "POST /candidate-register/ HTTP/1.1" 302 0
[10/Jul/2019 13:19:22] "GET /candidate-register/ HTTP/1.1" 200 16782
[10/Jul/2019 13:19:22] "GET /candidate-register/ HTTP/1.1" 200 16782

Все, что я хочу, чтобы это было в состоянии сделать, это отправить мне имя человека прямо сейчас.позже я хочу, чтобы они могли прислать мне файл с их резюме, но я решил, что я начну с простого и сделаю его более сложным, включая другие поля, но я даже не могу заставить это работать.Любая помощь или советы будут с благодарностью.Похоже, что почтовый запрос происходит, но электронное письмо не отправляется.Я также попытался использовать функцию send_mail в python manage.py shell, и он показал ответ, который выглядел многообещающе (журнал показал, как будет выглядеть электронная почта), но не отправил письмо на мою учетную запись.

1 Ответ

1 голос
/ 10 июля 2019

В вашем классе формы вы захотите определить функцию send_mail, которую можно вызывать после form_valid.Например,

from django.core.mail import EmailMessage as email_msg


class UploadResume(forms.Form):
    first_name = forms.CharField()
    last_name = forms.CharField()
    email = forms.EmailField()
    resume_file = forms.FileField()

    class Meta:
        title = 'Resume Upload'

    def send_message(self, email, first_name, last_name, file):
        '''
        This function will be used to create an email object that will then be \
transmitted via a connection call.  This function takes in arguments that will \
be provided by the corresponding CBV's form_valid function.
        '''
        email_obj = email_msg(
            subject=f'Resumed Uploaded by {first_name} {last_name}!',
            body = 'You received a resume upload from {first_name} {last_name} \
                    at {email}.  Please follow-up.  \nThank you,\nYour Platform'
            from_email=email,
            to=['myemail@gmail.com'],
            reply_to= ['myemail@gmail.com']
            )
        # after creating the email object with the cleaned data generated from
        # the form fields, we will attach the resume contents to the object,
        # then submit it via SMTP settings from the settings.py file.

        attach_name = file.name
        try:
            attach_content = file.open().read()
        except Exception:
            attach_content = file.getvalue()
        attach_mimetype = mimetypes.guess_type(attach_name)[0]
        email_obj.attach(attach_name, attach_content, attach_mimetype)
        try:
            email_obj.send()
        except Exception as e:
            print(type(e), e.args, e)

Здесь вы можете перезаписать функцию form_valid в CBV, получить соответствующие аргументы с помощью функции form.cleaned_data.get(insert_arg_here).

Пример того, как это сделатьэто может быть следующим образом:

class CandRegisterView(FormView):
    template_name = 'website/candidate_register.html'
    form_class = UploadResumeForm

    def form_valid(self, form):
        if form.is_valid:
            email_addr = form.cleaned_data.get('email')
            first_name = form.cleaned_data.get('first_name')
            last_name = form.cleaned_data.get('last_name')
            file = form.cleaned_data.get('resume_file')
            form.send_message(email_addr, first_name, last_name, file)
        else:
            return form.errors

Только что заметил: когда вы создаете тег формы в своем HTML, убедитесь, что в теге присутствует enctype="multipart/form-data".

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