写在前面:
1、写这个主要是想练习一下socket编程。
2、就本次完成的目标是发送一个邮件,邮件中包含一条消息,不带附件。
3、只是针对smtp.qq.com邮件服务器。
4、我新手,代码写的不好,协议也不熟悉,有错误的地方欢迎大家指正。
接下来就是了解一下smtp协议的流程。针对的是qq邮件服务器。
第一句是问候之后的回复,其实这里我不是很清楚,因为这里需要发送两次EHLO,
> [S] 220 smtp.qq.com Esmtp QQ Mail Server
> //这里是客户端发送EHLO
[C] EHLO localhost
//这里是接受到回复内容,这些内容的最后一条的连字符是空格而不是 '-'
[S] 250-smtp.qq.com
[S] 250-PIPELINING
[S] 250-SIZE 73400320
[S] 250-AUTH LOGIN PLAIN
[S] 250-AUTH=LOGIN
[S] 250-MAILCOMPRESS
[S] 250 8BITMIME
//检查之后发现服务器支持LOGIN,所以用LOGIN方法认证。
Server does not support AUTH CRAM-MD5
Using AUTH LOGIN
//开始认证,这里要注意的是使用的用户名和密码都是经过base64编码的
[C] AUTH LOGIN
[S] 334 VXNlcm5hbWU6
[C] NzMxNjM0NTM5QHFxLmNvbQ==
[S] 334 UGFzc3dvcmQ6
[C] eWp3bGJjbXRod3RnYmVjZg==
[S] 235 Authentication successful
//认证成功之后发送FROM命令
[C] MAIL FROM: <xxxxxxxxx@qq.com>
[S] 250 Ok
//发送RCPT TO
[C] RCPT TO:<xxxxxxxxx@qq.com>
[S] 250 Ok
//发送DATA
[C] DATA
[S] 354 End data with <CR><LF>.<CR><LF>
//服务器做出如上提示的时候开始输入消息,消息的内容如下,对于我们本次的目的这些并不是都有用。
Subject: auto test
From: <xxxxxxxxx@qq.com>
Date: Thu, 20 Jul 2017 20:43:51 +0800
To: <xxxxxxxxx@qq.com>
X-Mailer: @(#) mailsend v1.19 (Unix)
X-Copyright: BSD. It is illegal to use this software for Spamming
Message: Your test resault!
Mime type: text/plain
Disposition: inline
Encoding type: none
--kWf+dmY0yK27AAvb--
//发送 . 停止发送
[C] .
[S] 250 Ok: queued as
//退出
[C] QUIT
[S] 221 Bye
//成功发送
Mail sent successfully
好了,流程分析完了,开始分析一下怎么写代码。
1、先写socket操作,把常用的socket操作封装成方便的函数,写到一个模块中。
2、开始针对smtp协议的每个命令,例如 FROM / TO /DATA等 封装函数。
3、前两步封装好的函数根据上面的流程调用,然后成功发送邮件。