关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
(本文是讲有关WebFaction服务器中,Django发送邮件的配置。不想看过程,就直接跳到后面看具体配置吧。)
在前面有一篇博文《我的网站搭建(第12天) 关闭调试》里面提到设置邮箱可以自动发送错误报告邮件。我在本地测试是没问题的,就部署到了WebFaction服务器。一般部署到服务器是不会产生500错误的,也就是没有机会发送错误报告邮件。
近期,在添加用户认证功能(登录、注册等)。其中,在注册的环节需要发送一个激活连接邮件到用户的邮箱中。在本地测试也是没问题。更新到服务器之后,测试了一下,并没有发送邮件,还报错了,而且也没有发送错误报告到我设置的邮箱中。
打开错误日志,发现报错的内容很奇怪:socket.error: [Errno 111] Connection refused
大致意思是发送邮件的时候,用socket创建连接被拒绝。
settings.py文件里面的邮箱设置是没问题的,本地windows系统是可以正常发送邮件。查阅了大量资料,各种尝试之后,终于通过有效途径发现问题,并解决问题。
用ssh方式登录WebFaction后台,执行命令 python2.7,进入python。执行以下命令:
>>>import socket >>>s=socket.create_connection(('smtp.qq.com',25),1000) Traceback (most recent call last): File "", line 1, inFile "/usr/lib64/python2.7/socket.py", line 571, in create_connection raise err socket.error: [Errno 111] Connection refused
用socket.create_connection方法指定host和port端口,就报错了。退出python,执行以下命令,查看linux的sendmail服务是否启动(25端口对应这个服务):
$ service sendmail status Redirecting to /bin/systemctl status sendmail.service ● sendmail.service - Sendmail Mail Transport Agent Loaded: loaded (/usr/lib/systemd/system/sendmail.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since Fri 2015-12-04 14:32:58 UTC; 2 months 16 days ago
大致意思是这个服务可用,但是供应商预设不可用。(太坑了)尝试打开这个服务:
$ service sendmail start Redirecting to /bin/systemctl start sendmail.service Failed to start sendmail.service: Interactive authentication required.
果然,是我想多了,没权限打开。。。明明这个服务是打开的,却被拒绝。难道只有自己的服务器的邮箱可以使用?进入python尝试一下:
>>>import socket >>> s=socket.create_connection(('smtp.webfaction.com',25),1000)
执行第二句之后,竟然没报错!(果然是个坑)
反复测试,最后找到问题所在。只需要把settings.py文件中的email相关设置改成WebFaction服务器的邮箱。WebFaction有赠送邮箱,需要登录后台,自己创建一个。(后台的EMAIL菜单,先创建一个Mailbox,再创建一个邮箱地址绑定到这个Mailbox。)
WebFaction的SMTP设置不太一样。settings.py文件的邮箱具体设置如下:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST= 'smtp.webfaction.com' EMAIL_PORT= 25 EMAIL_HOST_USER = '*********' #Mailbox的名称 EMAIL_HOST_PASSWORD = '*************' #Mailbox的密码 默认有SMTP服务 EMAIL_SUBJECT_PREFIX = '[yshblog.com]' #邮件标题前缀,默认是'[django]' EMAIL_USE_TLS = True DEFAULT_FROM_EMAIL = SERVER_EMAIL = '*****@yshblog.com' #发件人的邮箱地址
测试一下,在服务器可以正常发送邮件。(在本地就不行了,本地测试再换成其他的邮箱即可)