Chinaunix
标题:
linux socket发送电子邮件
[打印本页]
作者:
ckanhw
时间:
2009-09-19 18:39
标题:
linux socket发送电子邮件
网上搜了一搜,只有php版,java版,c#版,就是没有c/c++版,这是我拿php版翻译过来的代码:
///////////////////////
//base64.h
//base64编码与解码
#include
#include
static char basis_64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
#define CHAR64(c) (((c) 127) ? -1 : index_64[(c)])
static signed char index_64[128] = {
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
-1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
} ;
char *base64_encode(const char *value, int vlen) {
unsigned char oval = 0 ;
char *result = (char *)malloc((vlen * 4) / 3 + 5) ;
char *out = result;
while (vlen >= 3) {
*out++ = basis_64[value[0] >> 2];
*out++ = basis_64[((value[0] > 4)];
*out++ = basis_64[((value[1] > 6)];
*out++ = basis_64[value[2] & 0x3F];
value += 3;
vlen -= 3;
}
if (vlen > 0) {
*out++ = basis_64[value[0] >> 2];
oval = (value[0] 1) oval |= value[1] >> 4;
*out++ = basis_64[oval];
*out++ = (vlen > 4);
*rlen += 1;
if (c3 != '=') {
*out++ = ((CHAR64(c2) > 2);
*rlen += 1;
if (c4 != '=') {
*out++ = ((CHAR64(c3)
#include
#include
#include
#include
#include
#include
#include
/* 判断str开始的字符串是不是start*/
int mail::start_str(char *str,const char *start)
{
if(strstr(str,start)==str)
return true;
else
return false;
}
mail::mail(char *smtp,char *welcome)
{
if(strlen(smtp)smtp,smtp);
if(strlen(welcome)welcome,"localhost");
}
else
strcpy(this->welcome,welcome);
strcpy(this->lastmessage,"");
strcpy(this->lastact,"");
this->port=25;
}
/*将命令command发送到SMTP服务器,如果收到响应号为code,则返回true */
int mail::do_command(char *command,const char *code)
{
strcpy(this->lastact,command);
if(write(this->fp,this->lastact,strlen(this->lastact))fp,this->lastmessage ,512 )lastmessage,code))
return true;
else
return false;
}
int mail::send(char *to,char *from,char *subject,char *message)
{
char head[255];
sockaddr_in sa;
struct hostent *he;
sa.sin_family=AF_INET;
sa.sin_port=htons(25);
if((he=gethostbyname(this->smtp))!=NULL)
bcopy(he->h_addr,&sa.sin_addr,he->h_length);
else
{
perror("gethostbyname");
exit(1);
}
strcpy(this->lastact,"connect");
this->fp=socket(AF_INET,SOCK_STREAM,0);
if ( this->fp )
{
if(connect(fp,(sockaddr*)&sa,sizeof(sockaddr))fp,this->lastmessage,512);
if ( !start_str(this->lastmessage,"220"))
{
return false;
}
else
{
strcpy(this->lastact,"HELO ");
strcat(this->lastact,this->welcome);
strcat(this->lastact,"\r\n");
fflush(stdout);
if(!this->do_command(this->lastact, "250"))
{
printf("HELO\n");
close(this->fp);
return false;
}
strcpy(this->lastact,"AUTH LOGIN\r\n");
if(!this->do_command(this->lastact, "334"))
{
printf("AUTH LOGIN\n");
close(this->fp);
return false;
}
char *code64=NULL;
char s1[] = "username";
code64=base64_encode(s1,strlen(s1));
strcpy(this->lastact,code64);
strcat(this->lastact,"\r\n");
if(!this->do_command(this->lastact, "334"))
{
printf("user name\n");
close(this->fp);
return false;
}
code64=NULL;
char s2[]="password";
code64=base64_encode(s2,strlen(s2));
strcpy(this->lastact,code64);
strcat(this->lastact,"\r\n");
if(!this->do_command(this->lastact, "235"))
{
printf("passwd\n");
close(this->fp);
return false;
}
strcpy(this->lastact,"MAIL FROM: ");
strcat(this->lastact,from);
strcat(this->lastact,"\r\n");
if(!this->do_command(this->lastact, "250"))
{
printf("MAIL FROM");
close(this->fp);
return false;
}
strcpy(this->lastact,"RCPT TO: ");
strcat(this->lastact,to);
strcat(this->lastact,"\r\n");
if(!this->do_command(this->lastact, "250"))
{
close(this->fp);
return false;
}
strcpy(this->lastact,"DATA\r\n");
if(!this->do_command(this->lastact, "354"))
{
close(this->fp);
return false;
}
strcpy(head,"Subject: ");
strcat(head,subject);
strcat(head,"\r\n");
if(strlen(subject)>0)
{
write(this->fp,head,strlen(head));
}
strcpy(head,"From: ");
strcat(head,from);
strcat(head,"\r\n");
if(strlen(from)>0)
{
write(this->fp,head,strlen(head));
}
strcpy(head,"To: ");
strcat(head,to);
strcat(head,"\r\n");
if(strlen(to)>0)
{
write(this->fp,head,strlen(head));
}
strcpy(head,"Content-Type: text/plain; charset=gbk\r\n");
if(strlen(head)>0)
{
write(this->fp,head,strlen(head));
}
strcpy(head,"Content-Transfer-Encoding: base64\r\n");
if(strlen(head)>0)
{
write(this->fp,head,strlen(head));
}
code64=NULL;
strcat(head,message);
strcat(head,"\r\n");
code64=base64_encode(head,strlen(head));
strcpy(message,code64);
write(this->fp,message,strlen(message));
strcpy(message,"\r\n.\r\n");
write(this->fp, message,strlen(message));
strcpy(this->lastact,"QUIT\r\n");
if(!this->do_command(this->lastact, "250"))
{
close(this->fp);
return false;
}
}
return true;
}
else
{
printf("Connect failed!");
return false;
}
}
int main()
{
char email[255]="Hello, this is a test letter!";
class mail *sendmail=new mail("smtp.163.com", "xyzxy");
if(sendmail->send("", "", "test", email))
{
printf("发送成功!\n");
}
else
{
printf("发送失败!\n");
}
return 0;
}
复制代码
本文来自ChinaUnix博客,如果查看原文请点:
http://blog.chinaunix.net/u3/104100/showart_2056012.html
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2