smtp服务器是postfix, 如果我们只是简单的配置main.cf,如下

smtpd_tls_security_level = encrypt
smtpd_tls_key_file = /etc/pki/tls/private/localhost.key
smtpd_tls_cert_file = /etc/pki/tls/certs/localhost.crt
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_session_cache_database = btree:/var/spool/postfix/smtpd_tls_cache
tls_random_source = dev:/dev/urandom
smtpd_tls_auth_only = yes

这样在会出现以下exception

SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

解决的办法是再增加一句

smtpd_tls_wrappermode = yes

但加上这一句以后,其他的邮件客户端好像就连不上了。鱼和熊掌不可兼得。

经过一番调查,其实是我python代码写的方式有问题, 原来的代码如下

smtp = smtplib.SMTP_SSL()

参考http://hi.baidu.com/rails7/item/f7dcfee08c66203a4cdcafac 这篇文章, 原来我的postfix是用在标准的25端口的smtp上增加一个starttls的命令来支持tls, 所以python代码改为如下就可以

smtp = smtplib.SMTP()
smtp.starttls()