尽管是“二手知识”,可能还是“三手知识”,但也要亲自入一遍坑,才有体会。
背景:之前在某证券公司实习的时候,经常是定时执行完一些任务以后用SMTP自动发邮件。然而常常被QQ邮箱、网易邮箱制止,说我发的是垃圾邮件,或者说发送频率太高。
需求:需求无非如下几点,希望建立内部邮箱,不希望受到诸如网易、QQ邮箱等服务器的数量限制,或是单纯练手以了解计算机网络应用层SMTP及POP3协议(我感觉对于这种经典的协议,计算机网络的经典运用,还是有必要摸索一下的)。网上有很多关于这个主题的教程文章,但一步步照着做下来,总觉得好像少了点什么。
效果:
注意,这是一个假的域名(互联网上并没有,或者说只是在内网中使用)。另外,我在内网中可以收发邮件(用第三方邮件客户端),发外网的邮箱可能会被认为是垃圾邮件,而且从外网无法给这个邮箱发邮件。
环境:
邮件服务器的机器,一台2011年买的联想笔记本 Z475,Windows Server 2008,64位,数据中心版,测试邮件账户 qcy@qcy-z475.com。Server 2008和2012在设置SMTP服务器时大同小异。
另一台测试机器,一台2015年买的戴尔笔记本,Windows 10,64位,企业版,测试邮件账户 qcy2@qcy-z475.com。
步骤概述
1. 安装SMTP服务(支持发邮件)
2. 配置SMTP服务(配允许的IP,邮件服务器的各项设置),设置SMTP服务自动启动。
3. 安装POP3服务(支持收邮件。有人说Windows Server 2008及以后的版本的操作系统中已删除了POP3服务了,逼着大家用Exchange Server。不过可以下载一个第三方的免费软件,以支持POP3服务,邮件刷新时间大概3分钟一次,免费版支持10个用户,Visendo SmtpExtender Community v1.1.2.637 x64)
4. 配置POP3服务
5. 设置防火墙,测试两台机器是否能相互PING通。
6. 配置邮件客户端(如Outlook、FireFox等)
7. 测试(邮件客户端,或者干脆就是记事本也行)
详细步骤
1 & 3. 安装
装SMTP服务,自行百度。
装POP3服务,推荐第三方软件VisendoSMTPExtender。我用的是VisendoSMTPExtender_x64.msi社区版,约15MB。
2 & 4. 配置SMTP和POP3
SMTP在IIS 6.0管理器中配置,POP3用第三方软件配置。
SMTP默认端口25,POP3默认端口101?
配置SMTP
服务 - 简单邮件传输协议(SMTP)- 属性, 设置启动类型为“自动”。运行 - services.msc,即可快速打开服务。
配置域名。因为其实没有真正的域名,所以只能是一个假的域名,本机认识,及同一局域网下的计算机认识即可。
开始 - 管理工具 - Internet 信息服务 (IIS) 6.0 管理器 - SMTP Virtual Server #1 - 域,改名,改成想要的域名的样子(如 domainA.com, xxx.cn,我设置的是qcy-z475.com),尽管目前来讲这是假的。但在一个局域网内,你去PING这个域名(不要有最后的点及后面的东西),是可以PING通的。当然,如果Virtual Server 中的域是空的,要新建一个域名,选别名(另一个是远程,不要选)。
SMTP Virtual Server #1 - 右键属性
常规:IP地址,选内网IP,SMTP的TCP端口默认是25
访问:访问控制-身份验证(暂时选匿名),连接控制和中继限制,暂时开放所有IP(即不做限制)
邮件:一些参数,自己去配
传递:出站安全(暂时选匿名),高级,完全限定的域名(输入刚刚改的qcy-z475),检查DNS,要保证域名有效
上面身份验证其实推荐 集成Windows身份验证,这样邮箱的用户名和密码就是登录Windows时的用户名和密码。这里出现了第一个密码,等下POP3中还有一个密码。
现在要添加用户(相当于是给用户开邮箱)。(不要用控制面板中的添加用户)
计算机管理 - 系统工具 - 本地用户和组 - 用户,新建用户,用户的名称就是电子邮箱中的账户的一部分(需要用它),用户的全名是显示在Windows启动的时候登录界面时的名字。
配置POP3
启动VisendoSMTPExtender。
Settings - Accounts - New Accounts,输入用户名和密码,用户名是邮箱地址(刚刚新建的用户如果是qcy,那么加上前面改名的域qcy-z475.com,邮箱地址就是 qcy@qcy-z475.com),密码则希望和该用户的Windows登录密码一致。
Settings - Advanced - 配置好POP3服务器的地址(内网IP,它是下拉以后让你选的,这里还没有测试过若内网IP改变了,会怎样…所以说,要做服务器的机器,最好还是能有一个固定IP,固定的内网IP也好)
Email drop folder,是说,这个软件会一直监控这个文件夹中的*.eml文件。
我测试过,如果用Outlook发送一封邮件,会在服务器的这个路径的内生成一个eml文件,过几分钟,这个eml文件会被Visendo SmtpExtender扫描到,并移动到收信人的文件夹内。一旦移动到收信人所属的文件夹后,在Outlook中接收所有邮件,就可以收到新邮件了(估计是Outlook客户端是去读取服务器上的用户文件夹,然后把新邮件下载到本地)。Outlook默认是30分钟自动扫描一次。
至此,SMTP和POP3的基本配置已完成。
5. 设置防火墙,并测试是否能PING通。
简单起见,把所有防火墙关了。第一步是要把邮件服务器搭起来,所以先排除掉一切可能阻碍成功的原因。所以现在希望是,搭建成功,测试完成 以后,再加出入站规则 。
两台机器互发邮件,一定要求PING得通啊(客户端和邮件服务器之间PING)。
如果PING不通,第一检查网络是否断开,第二检查防火墙-入站规则-文件与打印机共享(回显请求 - ICMPv4-In)否被禁用(请自行百度)。
6. 配置邮件客户端
我用的是Outlook,和其他客户端大同小异。
添加账户 - 手动设置 - POP或IMAP
建议,因为是内网IP,说不定IP地址会变,所以建议把发送和接收服务器的地址都填成前面设置过的域名domainA。
我设置的是qcy-z475.com。当然,这里是不是应该确认,“整个内网中,叫qcy-z475的只有一台机器”?
注意,如果SMTP服务器选了集成Windows身份验证,而没有选匿名访问,则此时此刻测试账户设置,会报530错误。
其他设置 - 发送服务器 - …… 身份验证 ……
7. 测试
7.1 向126邮箱(外网)发一封邮件(可能会被网易认为是垃圾邮件给退信了)
7.2 向自己发送一封邮件,成功。
7.3 向内网的另一个账户发一封邮件,成功。
7.4 用记事本写一个txt,内容如下。
From: qcy2@qcy-z475.com
To: qcy@qcy-z475.com
Subject: Email test
这也是可以发送的。
保存到服务器的 inetpub/mailroot/Pickup/ 路径下,也会被SMTP服务器检测到,随即根据该txt生成一个eml文件,扔到收件人的邮箱里,对应收件人的outlook客户端去查收新的邮件,就可以收到了。这里就不截图演示了。
7.5 用Python调用函数发送邮件
注意1: 如果前面设置身份验证方式为:匿名登录,则Python代码里面可以不用login,但其实不安全。
那么,前面还需要设置为:基本验证。
否则,会出现报错:No suitable authentication method found.
# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 第三方 SMTP 服务
mail_host='qcy-z475' # 设置服务器
mail_user='qcy@qcy-z475.com' # 邮件上“显示”的发件人
login_user='qcy' # Windows用户的用户名
mail_pass='xxxx' # 口令
content = '用Python发送的邮件'
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = mail_user
message['To'] = ','.join(['qcy2@qcy-z475.com']) # 用逗号或句号分隔
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
smtp_obj = smtplib.SMTP()
smtp_obj.connect(mail_host) # 连接服务器
smtp_obj.login(login_user, mail_pass) # 登录操作
smtp_obj.sendmail(mail_user, ['qcy2@qcy-z475.com'], message.as_string())
print("success")
except Exception as e:
print(e)
# print("Error: failed")
finally:
smtp_obj.close()
注意2:邮箱名,登录用户名在此处是不一样的。
邮箱名是qcy@qcy-z475.com,登录名是windows的用户名,即qcy。务必输入正确,否则会验证失败。