python - 使用 python 通过 TLS 发送电子邮件

标签 python email ssl

我正在尝试通过 python 脚本自动发送电子邮件。我目前正在使用 expect 脚本来使用 openssl s_client 连接到服务器。目前我们只使用证书文件和用户名密码,它允许我发送电子邮件。我发现了另一个问题,其中提到在 python 中,您需要破解或围绕 smtp 类进行包装,以仅使用 CA 证书文件而不使用 key 文件(我没有)。

>>> smtpobj = smtplib.SMTP("mymailserver.com",465)
Traceback (innermost last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files (x86)\Python35-32\lib\smtplib.py", line 251, in __init__
(code, msg) = self.connect(host, port)
  File "C:\Program Files (x86)\Python35-32\lib\smtplib.py", line 337, in connect
(code, msg) = self.getreply()
  File "C:\Program Files (x86)\Python35-32\lib\smtplib.py", line 390, in getreply
+ str(e))
smtplib.SMTPServerDisconnected: Connection unexpectedly closed: [WinError 10054] An existing connection was forcibly closed by the remote host

我现在面临的问题是无法通过python连接到服务器。

如果我使用证书文件连接通过

smtplib.SMTP_SSL(myserver, port, certfile="mycert.cert") 

然后它抛出以下错误。

ssl.SSLError: [Errno 336265225] _ssl.c:339: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib

请注意,我可以使用 thunderbird 连接到服务器,无需证书文件。关于如何使用 python smtp(tls) 发送电子邮件的任何想法?

最佳答案

smtpobj = smtplib.SMTP("mymailserver.com",465)
smtplib.SMTPServerDisconnected: Connection unexpectedly closed: [WinError 10054] An existing connection was forcibly closed by the remote host

此错误与证书验证无关。只是您在需要隐式 TLS(从开始的 TLS)的端口上使用显式 TLS(即普通连接上的 STARTTLS 命令)。试试这个:

smtpobj = smtplib.SMTP_SSL("mymailserver.com",465)

除此之外:

... you either need a hack to or a wrapper around the smtp class to use only the CA cert file and not the key file(which i don't have).

我认为您混淆了一些概念:

  • CA 证书:这包含验证服务器证书所需的可信根。您没有此证书的 key ,也不需要。
  • 本地证书、本地 key :如果服务器需要使用客户端证书进行身份验证,则使用这些。在这种情况下,需要证书和 key

您可能想要指定的是 CA 证书,以便验证服务器证书。不幸的是,smtplib 没有为您提供指定此 CA 证书的方法。您已经尝试过 certfile,但这用于为客户端证书身份验证指定本地证书,它需要一个 key 文件。

好消息是:无需指定 CA 证书即可运行,因为 smtplib 根本不验证服务器证书。坏消息是:因为没有验证服务器证书中间人攻击加密连接很容易

关于python - 使用 python 通过 TLS 发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39532708/

相关文章:

python - scikit-learn 中 LogisticRegression 上的 GridSearchCV

python - [[在范围(10)中的_的0为](在范围(10)中的_的0]]和[在范围(10)为_的[0中]] * 10有什么区别? [复制]

angularjs - 将 Mailgun 与 Ionic 集成

mongodb - 解析 + mongodb + SSL : "no SSL certificate provided by peer"

python - NameError: 名称 'urlopen' 未定义

jquery - 如何在 jQuery 中验证纬度和经度以及电子邮件地址

c# - 使用正则表达式验证具有单个字符域名的电子邮件地址

security - Java keystore PrivateKeyEntry 与 trustedCertEntry

ssl - Openshift 上的齿轮间通信证书错误

python - 使用 list() 复制同一列表的字典键是否会产生彼此的引用?