♣
一段SMTP发信的代码~~~
#ifdef _debug
#include <stdio.h>
#endif
#include "gqpsvr.h"
#include <winsock2.h>
#include <windows.h>
//---------------------------------------------------------------------
void base64(unsigned char chasc[3],unsigned char chuue[4]);
int talk(socket sockid, const char *okcode, char *psend);
//---------------------------------------------------------------------
int sendmail(const smtpinfo *psmtpinfo)
{
//准备网络连接
wsadata wsadata;
if (wsastartup(makeword(2,2),&wsadata) != 0){
#ifdef _debug
printf("wsastartup() error : %d\n", getlasterror());
#endif
return 1;
}
//创建套接字
socket sockid;
if ((sockid = socket(af_inet,sock_stream,0)) == invalid_socket){
#ifdef _debug
printf("socket() error : %d\n", getlasterror());
#endif
wsacleanup();
return 1;
}
//得到smtp服务器ip
struct hostent *phostent = gethostbyname(psmtpinfo->smtpsrvname);
struct sockaddr_in addr;
copymemory(&addr.sin_addr.s_un.s_addr,
phostent->h_addr_list[0],
sizeof(addr.sin_addr.s_un.s_addr));
#ifdef _debug
struct in_addr srvaddr;
copymemory(&srvaddr, &addr.sin_addr.s_un.s_addr, sizeof(struct in_addr));
printf("smtp server name is %s\n", psmtpinfo->smtpsrvname);
printf("smtp server ip is %s\n", inet_ntoa(srvaddr));
#endif
addr.sin_family = af_inet;
addr.sin_port = htons(atoi(psmtpinfo->port));
zeromemory(&addr.sin_zero, 8);
//连接服务器
if (connect(sockid, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == socket_error){
#ifdef _debug
printf("connect() error : %d\n", getlasterror());
#endif
goto stop;
}
if (talk(sockid, "220", "ehlo sjdf")){
goto stop;
}
if (talk(sockid, "250", "auth login")){
goto stop;
}
//将用户名和密码转换为base64编码
const int buflen = 256;
char buf[buflen];
int i,userlen,passlen;
zeromemory(buf, buflen);
userlen = lstrlen(psmtpinfo->username);
passlen = lstrlen(psmtpinfo->password);
for(i = 0; i < (userlen%3?userlen/3+1:userlen/3); i++){
base64(psmtpinfo->username + i * 3, buf + i * 4);
}
if (talk(sockid, "334", buf)){
goto stop;
}
zeromemory(buf, buflen);
for(i = 0; i < (passlen%3?passlen/3+1:passlen/3); i++){
base64(psmtpinfo->password + i * 3, buf + i * 4);
}
if (talk(sockid, "334", buf)){
goto stop;
}
zeromemory(buf, buflen);
wsprintf(buf, "mail from:<%s>", psmtpinfo->from);
if (talk(sockid, "235", buf)){
goto stop;
}
zeromemory(buf, buflen);
wsprintf(buf, "rcpt to:<%s>", psmtpinfo->to);
if (talk(sockid, "250", buf)){
goto stop;
}
if (talk(sockid, "250", "data")){
goto stop;
}
zeromemory(buf, buflen);
wsprintf(buf, "to: %s\r\nfrom: %s\r\nsubject: %s\r\n%s\r\n\r\n.",
psmtpinfo->to,psmtpinfo->from,psmtpinfo->subject,psmtpinfo->msg);
if (talk(sockid, "354", buf)){
goto stop;
}
if (talk(sockid, "250", "quit")){
goto stop;
}
if (talk(sockid, "221", "")){
goto stop;
}
else{
closesocket(sockid);
wsacleanup();
return 0;
}
stop:
closesocket(sockid);
wsacleanup();
return 1;
}
//---------------------------------------------------------------------
int talk(socket sockid, const char *okcode, char *psend)
{
const int buflen = 256;
char buf[buflen];
zeromemory(buf, buflen);
//接收返回信息
if (recv(sockid, buf, buflen, 0) == socket_error){
#ifdef _debug
printf("recv() error : %d\n", getlasterror());
#endif
return 1;
}
#ifdef _debug
printf("%s\n", buf);
#endif
if (strstr(buf, okcode) == null){
#ifdef _debug
printf("error: recv code != %s\n", okcode);
#endif
return 1;
}
//发送命令
if (lstrlen(psend)){
zeromemory(buf, buflen);
wsprintf(buf, "%s\r\n", psend);
#ifdef _debug
printf("%s\n", buf);
#endif
if (send(sockid, buf, lstrlen(buf), 0) == socket_error){
#ifdef _debug
printf("send() error : %d\n", getlasterror());
#endif
return 1;
}
}
return 0;
}
//---------------------------------------------------------------------
//base64编码,chasc:未编码的二进制代码,chuue:编码过的base64代码
void base64(unsigned char chasc[3],unsigned char chuue[4])
{
int i,k=2;
unsigned char t = 0;
for(i=0;i<3;i++){
*(chuue+i)=*(chasc+i)>>k;
*(chuue+i)|=t;
t=*(chasc+i)<<(8-k);
t>>=2;
k+=2;
}
*(chuue+3)=*(chasc+2)&63;
for(i=0;i<4;i++)
if((*(chuue+i)>=0)&&(*(chuue+i)<=25)) *(chuue+i)+=65;
else if((*(chuue+i)>=26)&&(*(chuue+i)<=51)) *(chuue+i)+=71;
else if((*(chuue+i)>=52)&&(*(chuue+i)<=61)) *(chuue+i)-=4;
else if(*(chuue+i)==62) *(chuue+i)=43;
else if(*(chuue+i)==63) *(chuue+i)=47;
}
编译的时候总是提示base64(psmtpinfo->username + i * 3, buf + i * 4)传入的参数不对,请问应该如何修改~
· 网友精彩回答:
- 更多问题:
- · 成为新饼,给大家散点分,先500吧。不够再来。
- · Eclipse 连接 CVS 问题!
- · 如何把驱动程序文件打包成方便使用的安装文件呢?!
- · 求助:阿拉伯数字转成中国小写
- · 客户端程序用到服务器的Sql Server,请问客户端也需要安装Sql Server软件吗?
- · 成为新饼,给大家散点分,先500吧。不够再来。
- · 数据库的写入问题
- · 使用DirectMusic编写midi音乐播放,为何会在有的机器上运行出错?
- · 成为新饼,给大家散点分,先500吧。不够再来。
- · 我想问问这段代码是什么意思啊,学习中!~
- · 欢迎PP
- · 谁有C++ Primer的实例,请送一套.
- · 请达人指点如何拆分类似于“04 30”这样的字符串?
- · 成为新饼,给大家散点分,先500吧。不够再来。
- · 问个小问题:如何使用父页面上的复选框来控制其子框架中页面的刷新?里面说,在线等,,,,
- · asp+sql动态网页怎样转换成静态网页?

