如何用c语言编写发邮件程序,用C语言编写发送邮件程序

每次都得登录网站,打开邮箱才能发送邮件,就想到如何使用程序来自动地发送,而且把这个功能集成到其它的程序中,就可以使功能更加强大。如在程序运行中遇到的错误或事件,就可以通过电子邮件来得到信息。具体代码见资源http://download.csdn.net/user/sophisticated,不过最近好像不能上传资源了,老提示验证码错误,我会在开通后的第一时间上传的。

发送邮件需要使用SMTP协议,具体可以参考《RFC821 简单邮件传输协议》,感兴趣自己找来看看,这里仅以向邮箱里发送本地IP地址为例,说说其具体操作过程。

SMTP协议的每一条指令都以"/r/n"作为结束标志,所以必须在每一条要发送的指令后加上"/r/n"。

首先是获得本地的IP地址,我在这里也具体说说。要获得本地地址信息,要用到两个函数,【gethostname】和【gethostbyname】,前者获得本机的名称,是个字符串,后者根据其获得本机的地址信息,返回值是一个指向hostent结构的指针,这个结构体具体定义如下(见MSDN):

struct hostent

{

char FAR *       h_name;

char FAR * FAR * h_aliases;

short            h_addrtype;

short            h_length;

char FAR * FAR * h_addr_list;

};

我们要获得的IP信息就在h_addr_list中,但一台机器可能有很多IP地址,我们都要将其记录下来,使用一个循环,并且调用【inet_ntoa】将其转化成我们习惯的点分字符串格式的IP地址,如192.168.1.1。这样就获得了地址信息。

下来根据SMTP协议的规定,发送邮件,我使用新浪的邮箱作为发送邮箱,目标可以是其他邮件服务器,不过hotmail好像是webMail,不支持SMTP方式,新浪的SMTP服务器地址为smtp.sina.com。

首先我们必须和服务器建立连接,那就得得到服务器的地址,调用【gethostbyname】,将smtp.sina.com作为参数传入,保存返回的hostent结构的地址,用它的h_addr_list[0]来初始化sockaddr_in结构的sin_addr.S_un.S_addr成员,端口写成25,这是邮件服务标准端口,然后进行连接【connect】,连接上后就使用SMTP来通信了。注意要遵守一发一收的规则,连接上后先接收服务器的反馈信息,新浪的服务器一般为“220 mail5-203.sinamail.sina.com.cn ESMTP”,然后发送“HELO [信息]/r/n”表明身份,命令HELO和后面的信息要有空格,不过此处经实验可以什么信息都不加,接收后继续发送“AUTH LOGIN/r/n”,接收后发送用户名(即邮箱地址中@前边的部分),再发送密码,此时服务器返回是否验证成功的信息,若成功则返回代码为235的信息,否则返回535,注意有可能由于服务器的繁忙而导致验证失败,并不是用户名和密码的问题,所以失败后要继续从头开始,连接-发送-接收-验证,还有一个要注意,用户名和密码采用base64编码,我们在新浪邮箱登录时填写的用户名和密码是不能直接在程序中以字符串的方式发送的,而是要经过编码,这一点在网上很多文章中都未说明,造成无法验证成功,编码也不用自己去研究了,这里说个网站,大家可以去编码,输入明文,可得到编码后的信息,网址:http://www.motobit.com/util/base64-decoder-encoder.asp。将编码后的用户名和密码发送给服务器就可以验证成功,这个在新浪服务器实测通过。

验证后就可以发送具体的邮件信息了。首先发送发件人,“MAIL FROM: /r/n”,不过这个”似乎与你发送给服务器验证的用户名没有必然联系,你改成别的邮箱名,甚至不写任何东东,也可以照常发送信件,很奇怪,大概对SMTP还不是很了解。其次发送收件人,这个可是要起作用的,发送“RCPT TO: ”,要发送给几个人,就发送几个“RCPT TO: ”,然后发送“DATA/r/n”表示要发送具体数据了,数据格式为:邮件头+邮件体

邮件头:

From: "想要显示的发件人"/r/n

To: 想要显示的收件人地址/r/n

Subject: 主题名/r/n/r/n  此处的两个/r/n表示邮件头结束

邮件体:

写你想发的信息,这里为IP地址数据

结束标志为/r/n./r/n

将这些信息组成一个字符串发送出去就可以了,最后发送“QUIT /r/n”断开连接。

至此,邮件发送程序便编写完成了。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sophisticated/archive/2009/02/15/3893297.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值