阿里云境外服务器发邮件失败解决全过程
Django的发邮件程序在本机和以前买的境内阿里云ECS都可以以简单的配置,通过端口25发送邮件。因为本身用程序也不是发什么垃圾和绝密邮件,所以也不太在意,哪想新买的一个ECS死活发不出去。
1、先检查是不是因为是境外服务器的原因,换linode,在linode上没问题,排除之。
2、继续检查是不是邮件服务商拒绝来自境外服务器的请求,把coremail换到qq邮件(QQ邮件在这个博客上可以),还是发不了,排除之。
3、最后查半天发现是ECS把端口25封掉了。。。一个下午过去了,千万头草泥马从心头跑过。
4、既然找到问题所在,就换465端口吧,发现CentOS7不是用iptables来管理端口,是一个叫什么鬼firewalld的东西,折腾一会儿,启用了465端口,结果,还是不行,按https://bbs.aliyun.com/read/302371.html?spm=5176.bbsr302357.0.0.L8JNPj 的做法测试了下,卧槽,可以了,注:文章没说明,用CentOS的话,若报『Missing "nss-config-dir" variable. 』错误,要在/etc/mail.rc里增加另外一个配置set nss-config-dir=/etc/pki/nssdb
5、悲催的是,用Django的send_mail还是不行,但确定了肯定是Django这边的问题,跟端口没关系了,因为第4步的方法可以发送成功,重读文档:https://docs.djangoproject.com/en/1.11/topics/email/ 原来还要配置EMAIL_SSL_KEYFILE和EMAIL_SSL_CERTFILE,另外提醒一下,若是EMAIL_USE_TLS=True,一般默认端口不一定是465,要看你的邮件服务商的设置,比如我的是587,所以我们这里把EMAIL_USE_SSL配置成True
Google又时断时续,一直找不到怎么配置EMAIL_SSL_KEYFILE和EMAIL_SSL_CERTFILE,F**K GFW和方校长10的10次方遍.后来想了想,从字面意思上来看,应该就是openssl的pem证书,
openssl genrsa -out ca.key
openssl req -new -key ca.key -out ca.csr
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
再把文件配置进去
EMAIL_SSL_KEYFILE = /srv/www/ssl/ca.key
EMAIL_SSL_CERTFILE = /srv/www/ssl/ca.crt
搞定,
最后吐槽一下,相对Linode,阿里云的服务真是垃圾,每次给他们写工单就一肚子气。
---------------------------------------
补充,在Django3.0上,要求2048位的密钥, 也就是:
openssl genrsa -out ca.key 2048
2019.12.18