Django не отправляет электронные письма
ребята!
У меня возникла проблема с моим проектом Django.
О проекте:
Django version: 3.0.7
Django hosting provider: Digitalocean
E-mail hosting provider: Beget.com
OS: Ubuntu 18.04.6
Здесь находится мой settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.beget.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = 'my@email.com'
EMAIL_HOST_PASSWORD = 'MyVerySecretPassword'
DEFAULT_FROM_EMAIL='my@email.com'
Здесь находится мой views.py
from django.core.mail import send_mail
def register(request):
if request.method == 'POST':
form = UserRegistrationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
current_site = get_current_site(request)
mail_subject = 'Please, activate your account by clicking the link below.'
message = render_to_string('acc_active_email.html', {
'user': user,
'domain': current_site.domain,
'uid':urlsafe_base64_encode(force_bytes(user.pk)),
'token':account_activation_token.make_token(user),
})
to_email = form.cleaned_data.get('email')
send_mail(mail_subject, message, settings.DEFAULT_FROM_EMAIL, [to_email])
Что я пытался сделать для решения своей проблемы:
- Using gmail account (yes, with anabled 'Allow less secure apps')
- Sending via Django shell (nope, it returns code '1', the mailbox is as empty as my ideas: ( )
- I have opened 587 and 465 ports in ufw
- I tried to write and run simple python smtp script to send e-mail via Django shell (spoiler: it worked perfectly on my server via shell), but when I tried to implement this code into my Django code, it failed just like Django send_mail() function:
вот код:
import smtplib
def send_email(user, pwd, recipient, subject, body):
FROM = user
TO = recipient if isinstance(recipient, list) else [recipient]
SUBJECT = subject
TEXT = body
message = """From: %s\nTo: %s\nSubject: %s\n\n%s""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
print(message)
try:
server_ssl = smtplib.SMTP_SSL("smtp.beget.com", 465)
server_ssl.ehlo()
server_ssl.login(user, pwd)
server_ssl.sendmail(FROM, TO, message)
server_ssl.close()
print('successfully sent the mail')
except:
print("failed to send mail")
usn='sender@email.com'
pwd='MyVerySecretPassword'
rc=['reciever@email.com']
subj='HoHoHo'
body='Hello, world'
send_email(usn,pwd,rc,subj,body)
- I checked all the variables (rendered them on the screen) which I tried to send via e-mail, all of them are correct.
- Sorry, I am not interested in third party projects like Sendgrid. I just want to understand what I am doing wrong.
Надеюсь, что кто-нибудь сможет помочь мне найти ошибку. Большое спасибо!
Я нашел решение. Спасибо Solarissmoke за ответ на мой вопрос.
На самом деле мой хостинг-провайдер заблокировал исходящий трафик. Поэтому лучшим решением является использование стороннего провайдера доставки почты, например Google или Sendinblue. После того, как я изменил настройки, все заработало. Надеюсь, мой пост поможет кому-нибудь.