4

У меня есть сервер под управлением Raspbian Jessie, с которого я хочу отправлять электронные письма, используя Python. Я видел два модуля, которые могут работать, включая smtpd и smtplib .

Я видел много примеров, в том числе smtp.gmail.com и localhost . Я хочу отправить электронное письмо с определенным доменным именем, например: myname@mydomain.name Я новичок в SMTP, и все, что я получаю, - это множество ошибок. Как мне создать код SMTP-сервера для отправки электронной почты?

Traceback (most recent call last):
  File "C:\Users\Josua\Desktop\smtp_test.py", line 42, in <module>
    s = smtplib.SMTP('sigsmileyface.ddns.net')
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 251, in __init__
    (code, msg) = self.connect(host, port)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 336, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 307, in _get_socket
    self.source_address)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\socket.py", line 724, in create_connection
    raise err
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\socket.py", line 713, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

1 ответ1

2

отказ

Я ожидаю, что по крайней мере часть приведенной ниже информации будет для вас излишней. Пожалуйста, потерпите меня. знак равно

smtplib против smptd

Python поставляется с двумя модулями для работы с электронной почтой - smtplib и smtpd. Разница между ними заключается в том, что smtplib используется для отправки электронных писем, а smptd - для получения электронных писем. В этом случае для отправки писем вам нужно всего лишь использовать smtplib .

Электронная почта с Python 3.6 smtplib

Я хочу отправить электронное письмо через мое доменное имя (например, myname@mydomain.name).

Поскольку вы не предоставили свой исходный скрипт, я перечислил рабочий почтовый скрипт Python 3.6 для справки ниже:

# Python mail script with smtplib, email.utils and email.mime.text.

# --- imports ---

import smtplib
import email.utils
from email.mime.text import MIMEText

# --- create our message ---

# Create our message. 
msg = MIMEText('The body of your message.')
msg['To'] = email.utils.formataddr(('Recipient Name', 'recipient@example.com'))
msg['From'] = email.utils.formataddr(('Your Name', 'yourname@yourdomain.com'))
msg['Subject'] = 'Your Subject'

# --- send the email ---

# SMTP() is used with normal, unencrypted (non-SSL) email.
# To send email via an SSL connection, use SMTP_SSL().
server = smtplib.SMTP()

# Specifying an empty server.connect() statement defaults to ('localhost', 25).
# Therefore, we specify which mail server we wish to connect to.
server.connect ('mail.example.com', 25)

# Optional login for the receiving mail_server.
# server.login ('login@example.com', 'Password')

# Dump communication with the receiving server straight to to the console.
# server.set_debuglevel(True)  

# 'yourname@yourdomain.com' is our envelope address and specifies the return
# path for bounced emails.
try:
    server.sendmail('yourname@yourdomain.com', ['recipient@example.com'], msg.as_string())
finally:
    server.quit()

Обратите внимание, что хотя я использую "server" в качестве имени объекта smtplib , вы можете продолжать использовать "s" (или что-то еще) в своем собственном скрипте. Аналогично, использование модулей email.util и email.mime не является строго обязательным, но они помогают при создании окончательного сообщения.

Я новичок в SMTP, и все, что я получаю, это много ошибок.

Я не могу сказать, чем могут быть вызваны ваши другие ошибки, но вывод, который вы перечислили, указывает на то, что не удалось установить соединение с sigsmileyface.ddns.net через порт 25. Ключевые строки:

  • s = smtplib.SMTP('sigsmileyface.ddns.net') , по умолчанию используется порт 25.

  • Последняя строка ConnectionRefusedError: [...] the target machine actively refused it , что может указывать на проблему конфигурации брандмауэра или почтового сервера.

Поиск проблемы

Проверьте почтовый сервер и порт

Убедитесь, что сервер, к которому вы подключаетесь, имеет активный почтовый сервер и на каком порту он работает (обычно это порт 25 для входящей почты).

В вашем случае, если у вас есть контроль над sigsmileyface.ddns.net и вы пытаетесь отправлять на него электронные письма, вам следует проверить, правильно ли настроен ваш почтовый сервер для приема почты через порт 25. Я считаю, что sendmail - это стандартный почтовый сервер на Pi. Вы также должны подтвердить, что порт не заблокирован брандмауэром и что все необходимые переадресации портов правильно настроены на вашем маршрутизаторе.

На аналогичном замечании, хотя это и не должно иметь большого значения для прямого подключения к вашему почтовому серверу, вы можете настроить MX-записи, если вы собираетесь отправлять почту на / получать почту на sigsmileyface.ddns.net.

Проверьте ваше соединение

Вы должны дважды проверить, что ваш скрипт имеет правильные значения соединения, независимо от того, указали ли вы их в объекте smptlib или через .connect() . Обратите внимание, что имя хоста, которое вы укажете, всегда будет либо прямым соединением с сервером, на который вы хотите отправлять почту, либо с промежуточным почтовым сервером (локальным или иным), на который вы собираетесь передавать сообщения от вашего имени.

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

Проверьте, нужно ли вам использовать реле

Убедитесь, что вам не нужно использовать какое-то реле. Короче говоря, некоторые интернет-провайдеры делают определенные вещи для предотвращения спама, что может потребовать использования специальных почтовых серверов для первоначальной передачи или получения сообщений через порт 25.

Например, локальный провайдер для моей домашней службы фильтрует порт 25. Это заставляет обычную исходящую почту, предназначенную для этого порта, отправляться через почтовый ретранслятор SSL ISP. Одновременно он блокирует входящие сообщения на этот порт для домашних пользователей.

Это означает, что для отправки и получения электронной почты через порт 25 мне нужно передать обычную исходящую почту (что пытается сделать ваш скрипт) на smtp.isp.com, чтобы переслать ее получателю через порт 25 при использовании второго (стороннего) Служба для маршрутизации входящей почты от порта 25 к порту XXX (где мой почтовый сервер фактически слушает).

Обратите внимание, что на самом деле почта не препятствует отправке или получению почты на другие открытые порты (что может подойти для тестирования или для личного использования), но поскольку большинство почтовых серверов используют порт 25 для согласованности, использование ретранслятора может быть необходимостью в долгосрочной перспективе ,


В случае, если это было недостаточно ясно, вы можете выполнить тестирование на портах, отличных от 25, при условии, что вы ввели правильные значения в свой скрипт и имеете контроль над принимающим почтовым сервером.


Всё ещё ищете ответ? Посмотрите другие вопросы с метками .