使用stmp协议发送一封邮件

  • 需求
    由于我工作中需要编写很多运行在linux下的脚本,然而这些脚本出现异常时往往不能及时通知我。因此我希望能通过某种方式让我快速发现稳定性环境的异常,这时脚本发送邮件功能就显得很方便。
  • 几种方案
    1.我考虑过很多发送邮件的方式,当然高级语言也许包含一个库就可以完成这项任务,例如安装例如Ruby、Python这些语言和邮件库。但那也是一件麻烦事情,发送邮件的脚本当然可以从一台服务器Copy到另外一台服务器,but每台服务器必须先安装环境,有时候遇到限制访问外网的linux后就等着哭吧。
    2.另外就是自己写一个可执行程序,要求就是不依赖其他语言和库。也同样可以在不同服务器上Copy且运行。这样极大的方便了我的工作。(这时肯定有人会疑惑,为毛不apt-get install找一个可以发送邮件的软件。我肯定找过,依赖太多,配置复杂,换台服务器照样要安装)
  • 具体实施
    1.我果断选择第二种方案,可能需要自己重复造轮子,but这个轮子造的值得,一旦这代码完成,以后就不用那么麻烦的去考虑如果实现发邮件这功能了。PS:工作时会遇到各种不通语言,例如Shell、Python、Ruby、Go等等编程语言,索性的是都可以执行系统的可执行程序。
    2.我查询了一下发送邮件的协议,最常用和简单的就是stmp了,关于介绍和描述自行百度。下面我贴一下最简单的交互过程:
C: telent SMTP.163.com 25  //以telenet方式连接163邮件服务器
S: 220 163.com Anti-spam GT for Coremail System //220为响应数字,其后的为欢迎信息
C: HELO SMTP.163.com //除了HELO所具有的功能外,EHLO主要用来查询服务器支持的扩充功能 
S: 250-mail
S: 250-AUTH LOGIN PLAIN
S: 250-AUTH=LOGIN PLAIN
S: 250 8BITMIME //最后一个响应数字应答码之后跟的是一个空格,而不是'-' 
C: AUTH LOGIN   //请求认证
S: 334 dxNlcm5hbWU6  //服务器的响应——经过base64编码了的“Username”=
C: Y29zdGFAYW1heGl0Lm5ldA==  //发送经过BASE64编码了的用户名
S: 334 UGFzc3dvcmQ6  //经过BASE64编码了的"Password:"=
C: MTk4MjIxNA==  //客户端发送的经过BASE64编码了的密码
S: 235 auth successfully  //认证成功 
C: MAIL FROM: bripengandre@163.com  //发送者邮箱
S: 250 … .  //“…”代表省略了一些可读信息
C: RCPT TO: bripengandre@smail.hust.edu.cn //接收者邮箱
S: 250 … .    // “…”代表省略了一些可读信息
C: DATA //请求发送数据
S: 354 Enter mail, end with "." on a line by itself
C: Enjoy Protocol Studing
C: .
S: 250 Message sent
C: QUIT //退出连接 
S: 221 Bye

3.当然我写的代码肯定不会这么简单咯,代码内包含了各种注释.

  • (注意执行命令方式:./sendmail config.ini asd a.txt,b.txt)给点效果图收邮件.jpg
  • 当然Windows下也可以按照同样原理搞一个额

captcha