
1.只有在lwip1.4.1版本下实现的例子中有对smtp协议的实现。之前的版本没有实现smtp协议。 ( u6 @$ x( K- i8 Z. Z: E' o 2.smtp是基于tcp协议进行传输的,实质是对文本进行解析。 5 j! K, c) `! q4 S+ G3 b/ h# T* L" q 3.其发送邮件的过程可以通过windows下的telnet程序和邮件服务器交互实现。具体过程如下: 首先进入cmd界面,输入telnet smtp.sina.com 25(这里的smtp.sina.com和25分别是smtp服务器和端口号) 连接成功后,输入ehlo smtp.sina.com,返回服务器支持的操作,每项操作以"250"开始。 输入auth login。一般的服务器会返回334 VXNlcm5hbWU6,意思是要求输入用户名,即你的邮箱地址。 VXNlcm5hbWU6是对user的base64编码。这里需要输入你的邮箱地址,这个地址是需要经过base64编码后的地址。) `8 }! y, b$ U 服务器返回334 UGFzc3dvcmQ6。意思是需要你输入密码,UGFzc3dvcmQ6为password的base64编码。这里需要输入你经过base64编码后的密码。如果用户名密码正确,服务器将返回235,验证通过,已验证,验证成功等提示,不同的邮箱提示不同。这意味着你可以发邮件了。否则意味着验证失败。 验证通过之后,就可以不用base64编码了。- N4 K; i9 ? q" O 输入mail from: 回车,填写发件人地址。返回250 ok。 输入rcpt to: 回车,填写收件人地址。返回250 ok。+ @3 y" U$ u/ N, ] 输入data回车,返回提示,以CRLF . CRLF作为数据结束标志,这时可以输入邮件的标题,邮件等内容。返回250 ok queue id xxxxxx,表示邮件发送成功。 在smtp.c中实现的也是对这些命令的解析,smtp服务器对命令的响应是一个字符串。格式为一个数字+响应的说明。数字如果以2开头表示成功,4,5开头表示失败。 9 o4 N, G) |0 s& c4 ^ 4.使用smtp.c过程中,发现三个问题。其一,需要将SMTP_SUPPORT_AUTH_PLAIN置为0,即不支持明文身份验证,否则会返回错误或者链接超时。其二,如果发送中文字符需要关闭SMTP_CHECK_DATA数据检查宏,因为smtp.c的作者认为大于0x80的数据或者回车换行为非法字符,导致数据发送失败。其三,不同的邮箱user的base64编码不同,有的默认用user(VXNlcm5hbWU6),有的默认用User(dXNlcm5hbWU6),这个需要修改下smtp.c的源码,#define SMTP_RESP_LOGIN_UNAME "XNlcm5hbWU6",忽略第一个字符,因为'U'和'u'的高2bit都是01,只有低6bit不同。9 k. V2 ^' T7 l t * |+ i* w1 N6 X% u6 x 5.对邮箱的测试结果为:可以通过smtp.163.com,smtp.sina.com,smtp.139.com以及高校的邮箱发送数据。其中163邮箱服务器发现异常,会暂时停止该ip的身份验证,发邮件等操作。qq,gmail则使用安全连接发送邮件,在输入auth login之后便提示失败需要安全连接。所以无法使用smtp.c发送邮件。 / ^$ N7 C6 h! x t# {0 Y4 n 注:base64编码是,将一个bit流中的数据按照6bit一组作为索引,查找一个预先确定的字符数组中的字符作为编码后的第一个字符,再从原来的比特流中取6个bit,查表取的第二个编码后的字符。以此类推,将整个bit流转化成base64编码。6个bit一共可以表示64个字符。所以这个字符数组是一个长度为64的字符数组。在lwip的smtp.c文件中叫做base64_table。 / U; w0 A" ^$ n6 W4 D ^ |
RE:使用lwip发邮件的注意事项
RE:使用lwip发邮件的注意事项
RE:使用lwip发邮件的注意事项