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

问题描述:

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

>>> 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) 

除了:

...你要么需要一个黑客或周围的SMTP类的包装只使用CA证书文件,而不是密钥文件(我没有)。

我想你混淆了一些概念:

  • CA证书:这包含这是需要验证服务器证书的受信任的根。你没有这个证书的钥匙,你不需要钥匙。
  • 本地证书,本地密钥:如果服务器要求使用客户端证书进行验证,则使用这些密钥。在这种情况下,需要证书和密钥

您可能想指定的是为了验证服务器证书而指定的CA证书。不幸的是,smtplib并没有给你一个指定这个CA证书的方法。您已经尝试过certfile,但是这用于指定客户端证书身份验证的本地证书,并且它需要一个密钥文件。

好消息是:它的工作原理没有指定CA证书,因为smtplib根本不验证服务器证书。坏消息是:因为没有验证服务器证书一名男子在加密连接的中间攻击很容易

+0

感谢您的理解! SMTP_SSL像一个魅力工作 – Sanjay

您需要先拔下钥匙密码短语使用 -

openssl rsa -in key.pem -out tempkey.pem 

,然后输入密码一次 -

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

参考this获取更多信息。

+0

我没有钥匙(或者如果我这样做,它嵌入在我的证书中)。 – Sanjay