ORF反垃圾邮件系统

邮件服务器-邮件系统-邮件技术论坛(BBS)

 找回密码
 会员注册
查看: 10807|回复: 1
打印 上一主题 下一主题

[经验] 基于SMTP协议的发送邮件WINSOCK编程

[复制链接]
跳转到指定楼层
顶楼
发表于 2008-5-27 14:08:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Winsock编程发送邮件的代码,大部分都是匿名发送的那种。很容易因为邮件服务器策略导致发送失败。现在的Smtp都需要身份验证(ESmtp),下面的代码将实现带用户名验证的winsock发送程序。

具体smtp协议的一些命令参考:http://bbs.5dmail.net/thread-175855-1-1.html

1 设置Winsock控件的通信协议(TCP),远程主机ip,远程连接端口(通常为25)。然后连接远程主机。
例如: Wskemail.Protocol = sckTCPProtocol
     Wskemail.RemoteHost = "smtp.163.com"
     Wskemail.RemotePort = 25
     Wskemail.Connect

2 如果winsock接受到的服务器的回应码为220,表明服务器端接受了客护端的连接请求。这样可以进行下一步的通信:客户端发送EHLO消息,该消息表示客户希望基于ESMTP协议的电子邮件传递。

例如:  Wskemail.senddata("EHLO test"+VBcrlf)

3 如果winsock接受到服务器的回应码为250,表明服务器接受了客户端的通过ESMTP发送邮件的请求。
  这样可以进行下一步的通信:客户端发送AUTH LOGIN消息。
  例如:Wskemail.senddata("AUTH LOGIN"+VBcrlf)

4 如果winsock接收到服务器的回应码为334,表明服务器启动了一个认证过程。下一步期待用户输入用户名 。
  例如:Wskemail.senddata(Encode64("username")+VBcrlf)

5 如果winsock接收到服务器的回应码为334,表明服务器已经接受了用户名,下一步期待用户输入密码。
例如:Wskemail.senddata(Encode64("password")+VBcrlf)

6 如果winsock接收到服务器的回应码为235,表明认证成功完成。接着客户就可以发邮件了。
  发邮件具体过程如下:

  (1)客户端发送"mail from:"消息,该消息包含了发送人的email
        例如:Wskemail.sendata("mail from:"+chr(32)+"test@163.com"+VBcrlf)

  (2)当客户端接收到250,则继续发送"rcpt to:"消息,它包含了收件人的邮件地址。
        例如:Wskemail.senddata("rcpt to:"+chr(32)+"test@163.com"+VBcrlf)

  (3)当客户端接收到250,则继续发送“data”消息,它通知邮件服务器随后客户断将发送电子邮件数据。
        例如:Wskemail.senddata("data"+VBcrlf)

  (4)客户端如果接收到354的消息,客户端将发送电子邮件数据。电子邮件的数据包括以下字段:
        Date,From,To,X-Mailer以及邮件正文。电子邮件以"."结束。

        eg,Wskemail.senddata("Date:"+chr(32)+format(Date,"Ddd")&","&format(Date,"dd Mmm YYYY")&""&format(Time,"hh:mm:ss")&""&"-0600"+VBcrlf)
           Wskemail.senddata("From:"+chr(32)+"test"+VBcrlf)
           Wskemail.senddata("X-Mailer: vbemailsender"+VBcrlf)
           Wskemail.senddata("To:"+chr(32)+"test1"+VBcrlf)
           Wskemail.senddata("Subject:"+chr(32)+"how are you"+VBcrlf)
           Wskemail.sendtada("How are you, this is a test email"+VBcrlf)
           Wskemail.senddata("."+VBcrlf)

   (5)如果客户端接收到250的消息,表明电子邮件数据被成功发送。此时客户端如果希望与服务器断开连接,发送"quit"消息即可。如果客户端接收到221的消息,表明服务器已经终止了基于ESMTP协议的连接。
         例如: Wskemail.senddata("quit"+VBcrlf)
沙发
发表于 2008-6-26 12:52:56 | 只看该作者
谢谢分享,学习下了~~
您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

小黑屋|手机版|Archiver|邮件技术资讯网

GMT+8, 2024-5-4 05:21

Powered by Discuz! X3.2

© 2001-2016 Comsenz Inc.

本论坛为非盈利中立机构,所有言论属发表者个人意见,不代表本论坛立场。内容所涉及版权和法律相关事宜请参考各自所有者的条款。
如认定侵犯了您权利,请联系我们。本论坛原创内容请联系后再行转载并务必保留我站信息。此声明修改不另行通知,保留最终解释权。
*本论坛会员专属QQ群:邮件技术资讯网会员QQ群
*本论坛会员备用QQ群:邮件技术资讯网备用群

快速回复 返回顶部 返回列表