使用本地 Python SMTP 服务器从 Python 发送电子邮件

Jos*_*son 5 linux email python smtp

我有一台运行 Raspbian Jessie 的服务器,我想使用 Python 从中发送电子邮件。我见过两个可能有效的模块,包括smtpdsmtplib

我见过很多例子,其中一些包括smtp.gmail.comlocalhost。我想发送一封带有特定域名的电子邮件,例如: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
Run Code Online (Sandbox Code Playgroud)

Ana*_*man 4

免责声明

\n\n

我预计下面的信息至少有一些对您来说是多余的。请多多包涵。=)

\n\n

smtplib 与 smptd

\n\n

Python 附带了两个用于处理电子邮件 \xe2\x80\x94 smtplibsmtpd的模块。两者的区别在于,smtplib用于发送电子邮件,而smptd用于接收电子邮件。在这种情况下,要发送电子邮件,您只需要使用smtplib.

\n\n

使用 Python 3.6 smtplib 发送电子邮件

\n\n
\n

我想通过我的域名(例如 myname@mydomain.name)发送电子邮件。

\n
\n\n

由于您尚未提供源脚本,我在下面列出了一个可用的 Python 3.6 邮件脚本以供参考:

\n\n
# Python mail script with smtplib, email.utils and email.mime.text.\n\n# --- imports ---\n\nimport smtplib\nimport email.utils\nfrom email.mime.text import MIMEText\n\n# --- create our message ---\n\n# Create our message. \nmsg = MIMEText(\'The body of your message.\')\nmsg[\'To\'] = email.utils.formataddr((\'Recipient Name\', \'recipient@example.com\'))\nmsg[\'From\'] = email.utils.formataddr((\'Your Name\', \'yourname@yourdomain.com\'))\nmsg[\'Subject\'] = \'Your Subject\'\n\n# --- send the email ---\n\n# SMTP() is used with normal, unencrypted (non-SSL) email.\n# To send email via an SSL connection, use SMTP_SSL().\nserver = smtplib.SMTP()\n\n# Specifying an empty server.connect() statement defaults to (\'localhost\', 25).\n# Therefore, we specify which mail server we wish to connect to.\nserver.connect (\'mail.example.com\', 25)\n\n# Optional login for the receiving mail_server.\n# server.login (\'login@example.com\', \'Password\')\n\n# Dump communication with the receiving server straight to to the console.\n# server.set_debuglevel(True)  \n\n# \'yourname@yourdomain.com\' is our envelope address and specifies the return\n# path for bounced emails.\ntry:\n    server.sendmail(\'yourname@yourdomain.com\', [\'recipient@example.com\'], msg.as_string())\nfinally:\n    server.quit()\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,虽然我使用“server”作为smtplib对象名称,但您可以在自己的脚本中继续使用“s”(或其他名称)。同样,使用email.utilemail.mime模块并不是绝对必要的,但它们有助于构建最终消息。

\n\n
\n

我是 SMTP 新手,遇到的只是很多错误。

\n
\n\n

我无法说出您的其他错误可能是由什么引起的,但您列出的输出表明无法在端口 25 上建立与sigsmileyface.ddns.net的连接。关键行是:

\n\n
    \n
  • s = smtplib.SMTP(\'sigsmileyface.ddns.net\'),默认为端口 25。

  • \n
  • 最后一行ConnectionRefusedError: [...] the target machine actively refused it,可能表示防火墙或邮件服务器配置问题。

  • \n
\n\n

故障排除

\n\n

检查邮件服务器和端口

\n\n

确定您要连接的服务器具有活动的邮件服务器以及其运行的端口(通常为传入邮件的端口 25)。

\n\n

就您而言,如果您可以控制sigsmileyface.ddns.net并尝试向其发送电子邮件,您应该检查您的邮件服务器是否已正确设置以在端口 25 上接收邮件。我相信这sendmail是 上的标准邮件服务器圆周率。您还应该确认该端口未被防火墙阻止,并且在路由器中正确设置了所有必要的端口转发。

\n\n

同样,虽然直接连接到邮件服务器并不会产生什么影响,但如果您要在sigsmileyface.ddns.net发送邮件/接收电子邮件,您可能需要设置 MX 记录。

\n\n

检查您的连接

\n\n

您应该仔细检查您的脚本是否具有正确的连接值,无论您是在smptlib对象中还是通过.connect(). 请注意,您指定的主机名始终是与您希望向其发送邮件的服务器的直接连接,或者是您希望代表您传递消息的中间邮件服务器(本地或其他)。

\n\n

虽然在您的情况下似乎不太可能,但您还应该了解连接到接收服务器所需的任何用户名或密码。当使用另一台服务器中继邮件时,这是最常见的,但值得记住。

\n\n

检查是否需要使用继电器

\n\n

确保您不需要使用某种继电器。简而言之,一些 ISP 会采取某些措施来防止垃圾邮件,这可能需要使用特殊的邮件服务器来最初在端口 25 上传输或接收邮件。

\n\n

例如,我的家庭服务的本地 ISP 会过滤端口 25。它强制发往该端口的正常外发邮件通过 ISP SSL 邮件中继发送。同时,它会阻止家庭用户在此端口上传入的消息。

\n\n

这意味着要在端口 25 上发送和接收电子邮件,我必须将正常的外发邮件(您的脚本正在尝试的内容)传递到smtp.isp.com,以便在使用第二个(第三方)时将其转发给端口 25 上的收件人服务将传入邮件从端口 25 路由到端口 XXX(我的邮件服务器实际侦听的端口)。

\n\n

请注意,这实际上并不会阻止在其他开放端口上发送或接收邮件(这对于测试或个人用途来说可能很好),但由于大多数邮件服务器使用端口 25 来保持一致性,因此从长远来看,使用中继可能是必要的跑步。

\n\n
\n\n

如果还不够清楚,您可以在 25 以外的端口上进行测试,假设您在脚本中输入了正确的值并且可以控制接收邮件服务器。

\n\n
\n