OSError [Errno 101] Сеть недоступна при попытке отправить электронную почту в Django с помощью smtplib на сервере GoDaady

У меня странная проблема. У меня есть приложение Payment на Django, развернутое на GoDaddy. В приложении мне нужно отправлять электронное письмо пользователю, когда его платеж проходит успешно. Я использую библиотеки smtplib и email. Я выполнил следующие шаги:

  • Создал пароль приложения в аккаунте Google
  • Использовал свою электронную почту, пароль приложения, 587 порт и smtp.gmail.com сервер

Проблема в том, что он полностью работает на моем локальном хосте, и я получаю электронную почту. Но он не работает на GoDaddy, и я получаю следующую ошибку:

[Errno 101] Network is unreachable
Traceback (most recent call last):
  File "/home/g549hesohwxf/public_html/pl_payment_gateway/app/utils.py", line 52, in send_email
    with smtplib.SMTP(smtp_server, smtp_port) as server:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/alt/python311/lib64/python3.11/smtplib.py", line 255, in __init__
    (code, msg) = self.connect(host, port)
                  ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/alt/python311/lib64/python3.11/smtplib.py", line 341, in connect
    self.sock = self._get_socket(host, port, self.timeout)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/alt/python311/lib64/python3.11/smtplib.py", line 312, in _get_socket
    return socket.create_connection((host, port), timeout,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/alt/python311/lib64/python3.11/socket.py", line 851, in create_connection
    raise exceptions[0]
  File "/opt/alt/python311/lib64/python3.11/socket.py", line 836, in create_connection
    sock.connect(sa)
OSError: [Errno 101] Network is unreachable

Я поискал в Интернете и узнал, что многие хосты блокируют эти порты по умолчанию, чтобы избежать рассылки спама. Я попытался поговорить со службой поддержки GoDaddy. Они сказали следующее:

  • GoDaddy не блокирует этот порт
  • .
  • Используйте подробную информацию о SMTP-сервере Microsoft Office 365.

Я использовал их собственные данные, а именно smtp.office365.com, 587 порт и электронную почту, которую я создал на своем домене в GoDaddy. Но я все еще вижу ту же ошибку. Я сообщил об этой проблеме в GoDaddy, и они сказали, что не могут помочь, проблема в моем приложении. Я не могу разобраться в проблеме, так как она прекрасно работает на моем локальном хосте. Еще более странно то, что данные SMTP принадлежат той же учетной записи, которую я использую в предоставленной GoDaddy учетной записи электронной почты, и эта учетная запись работает нормально, и я могу отправлять письма через нее, просто мое приложение Django не может отправлять письма, используя те же данные учетной записи.

Ниже приведен мой код отправки электронной почты:

import logging

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


logger = logging.getLogger()

def send_email(response_status_code, response_dict, order_details):
    logger.info("SETTING UP SMTP SERVER...")
        
    smtp_server = 'smtp.office365.com'
    smtp_port = 587
    smtp_username = 'no-reply@parkinglink.com.au'
    smtp_password = [hidden-password]
    sender_email = 'no-reply@parkinglink.com.au'
    receiver_email = order_details['email']
    
    logger.info("SETTING EMAIL DETAILS...")
    
    msg = MIMEMultipart()
    msg['From'] = sender_email
    msg['To'] = receiver_email
    msg['Subject'] = 'New Booking Creation Status | ParkingLink'
    
    booking_status = "NOT created"
    
    if int(response_status_code) == 200 and str(response_dict["success"]).lower() == "true":
        booking_status = "created successfully"
        
    logger.info("WRITING EMAIL BODY...")
    
    email_body = f"""
    Dear User,
    
    Your booking was {booking_status}.
    
    Regards,
    ParkingLink
    """
    
    logger.info("EMAIL BODY: %s", email_body) # CODE WORKS FINE UP TO THIS STEP
    
    msg.attach(MIMEText(email_body, 'plain'))
    
    try:
        logger.info("CONNECTING TO SMTP SERVER...")
        with smtplib.SMTP(smtp_server, smtp_port) as server:
            logger.info("STARTING TLS...")
            server.starttls()  # Secure the connection
            logger.info("LOGGING INTO EMAIL CLIENT...")
            server.login(smtp_username, smtp_password) 
            logger.info("CREATING NEW EMAIL...")
            text = msg.as_string()
            logger.info("SENDING EMAIL...")
            server.sendmail(sender_email, receiver_email, text) 
        logger.info("EMAIL SENT SUCCESSFULLY!")
    except Exception as e:
        logger.info("Failed to send email: %s", e, exc_info=True)

Кто-то также посоветовал мне просто написать следующие детали в settings.py:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25

и просто используйте класс EmailMessage для отправки письма. Это устраняет ошибку, но письмо все равно не отправляется.

Может ли кто-нибудь помочь мне, что я делаю не так?

Вернуться на верх