背景

项目中只有一台服务器 A 能访问互联网, 服务器 B 只能访问内网。 先发送qq邮件程序部署在服务器 B。 A 上部署nginx。

步骤

1、 重新编译 nginx

nginx 需要支持 strean。 原来的nginx 需要重新编译替换。

查看原nginx 支持那些 module: ./nginx -V
结果: configure arguments: --with-http_ssl_module --with-mail --with-stream --with-mail_ssl_module --with-stream_ssl_module

下载nginx 源码,编译

./configure   --with-http_ssl_module --with-mail --with-stream --with-mail_ssl_module --with-stream_ssl_module

然后

make

请勿 make install

编译后的 nginx 在 objs 目录中。 将该 nginx 替换 旧的 nginx。

重新启动nginx (一定要操作)

kill -15 nginx master pid 也可以停止nginx

./sbin/nginx -s quit
./sbin/nginx

2、 更改nginx 配置

nginx中,stream配置跟http的配置在同一级 !!!

# send mail
stream{
    server {
        listen       2250;
        proxy_pass  smtp.qq.com:25 ;
   }
}

然后

./sbin/nginx -s reload

3、 python发送程序

send_mail.py

# coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import time
from email.utils import formataddr

def send_mail(receivers, title, content ):
    mail_host = "服务器A的内网ip"
    sender_mail = "******@qq.com"
    sender_pw = "QQ邮箱授权码"

    message = MIMEText(content,'html','utf-8')
    message['Subject'] = title
    #message['From'] = Header("邮件来自", 'utf-8')
    message['From'] = formataddr(["邮件来自", sender_mail])
    message['To'] = Header("收件人", 'utf-8')

    try:
        smtpObj = smtplib.SMTP()
        smtpObj.connect(mail_host, 2250)
        smtpObj.ehlo()
        smtpObj.login(sender_mail, sender_pw)
        smtpObj.sendmail(sender_mail, receivers, message.as_string())
        smtpObj.quit()
        print('success')
    except smtplib.SMTPException as e:
        print('error',e) #打印错误

if __name__ == "__main__":
    receivers = ["736*******@qq.com"] 
    title = "自动发送邮件-" + time.strftime("%F %T")
    content = "测试 903 <br /> 测试2 904 <br />"
    send_mail(receivers, title, content)

执行发送邮件:

python send_mail.py

更多推荐