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

时间:2016-09-16 13:28:14

标签: python email ssl

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

>>> 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)发送电子邮件的任何想法?

2 个答案:

答案 0 :(得分:1)

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

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

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

除此之外:

  

...你需要一个hack或smtp类的包装器才能只使用CA证书文件而不是密钥文件(我没有)。

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

  • CA证书:它包含验证服务器证书所需的受信任根。您没有此证书的密钥而且您不需要密钥。
  • 本地证书,本地密钥:如果服务器要求使用客户端证书进行身份验证,则使用这些密钥。在这种情况下,需要证书和密钥

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

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

答案 1 :(得分:0)

您需要先使用 -

删除密钥密码
openssl rsa -in key.pem -out tempkey.pem

然后再次输入密码短语 -

openssl rsa -in mycert.pem -out tempkey.pem
openssl x509 -in mycert.pem >>tempkey.pem

有关详细信息,请参阅this