📄 mailsend.c
字号:
#include "mailsend.h"
int sockfd;
int ret;
char *send_data;
char *recv_data;
char buffer[1024];
char CharSet[65]=
{
'A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X',
'Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/',
'='
};
/*function name:base64encode
this function is used for encoding the username passwd and mail context!
arguments:
src, the string to encode
base64code, the src string's base64code format
nstrlen, length of the src string
return value: -1 error or 0 successful
*/
int base64encode(const char *src, char * b64code ,int nstrlen)
{
int index=0;
int i=0;
int pad=0;
char base64chsrc[1024]={'\0'};
pad=base64char(src,base64chsrc,nstrlen);
for (i=0;i<strlen(base64chsrc);i++)
{
index = (int) *(base64chsrc+i);
*b64code++ = CharSet[index];
}
while(pad--)
{
*b64code++ = CharSet[64];
}
*b64code = '\0';
return 0;
}
int base64char(const char *src, char * base64ch,int nstrlen)
{
int i=0;
int pad=0;
char ch1=0,ch2=0;
for (i=0;i<nstrlen;i++)
{
switch (i%3)
{
case 0:
*base64ch++ = *(src+i)>>2;
ch1 = *(src+i) & 0x03;
break;
case 1:
ch2 = *(src+i) & 0x0f;
*base64ch++ = *(src+i) >>4 | ch1 << 4;
break;
case 2:
*base64ch++ = *(src+i) >> 6 | ch2 << 2 ;
*base64ch++ = *(src+i) & 0x3f;
break;
default:
break;
}
}
if(nstrlen % 3 == 2)
{
*base64ch++ = ch2 <<2;
pad++;
}
else if(nstrlen % 3 == 1)
{
*base64ch++ = ch1 <<4;
pad +=2;
}
*base64ch = '\0';
return pad;
}
/* Function name :connectHost
This function is used for connect the remote SMTP server
with socket.
arguments:smtp server addr as the string format.
return value : the socket fd.
*/
int connectHost(const char *smtpaddr)
{
struct sockaddr_in servaddr;
struct hostent *pHostent;
struct in_addr ** pptr;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if (sockfd<0)
{
fprintf(stderr,"Create socket error!\n");
return -1;
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(25);
pHostent = gethostbyname(smtpaddr); //Get the Mail Server
if(pHostent == NULL)
{
fprintf(stderr,"The Host Name is Invalid... \n");
return -1;
}
pptr =(struct in_addr **)pHostent->h_addr_list;
memcpy(&servaddr.sin_addr,*pptr,sizeof(struct in_addr));
//connect the Mail server
if (connect(sockfd,(struct sockaddr *)& servaddr,sizeof(servaddr)) < 0)
{
fprintf(stderr,"Connect failed... \n");
return -1;
}
if(getResponse() < 0)
return -1;
return sockfd;
}
/* Function name :getResponse
This function is used for geting the Respone of the remote SMTP server
arguments:void
return value : if get right respone -1 else 0;
*/
int getResponse()
{
memset(buffer,0,sizeof(buffer));
ret = recv(sockfd,buffer,1024,0);
if(ret == SOCKET_ERROR)
{
fprintf(stderr,"receive nothing\n");
return -1;
}
buffer[ret]='\0';
if(*buffer == '5')
{
printf("the order is not support smtp host\n ");
return -1;
}
//printf("%s\n",buffer);
return 0;
}
/* Function name :login
This function is used for logining the remote SMTP server
with your Email userID and password
arguments:username,password with base64encode
return value : if right respone -1 else 0;
*/
int login(char *username,char *password)
{
//printf("sockfd in login() %dusername %s\npassword %s\n",sockfd,username,password);
char ch[100];
if(username == "" || password == "")
return -1;
send_data = "HELO server\r\n";
//printf("%s\n",send_data);
ret = send(sockfd,send_data,strlen(send_data),0);
if(ret == SOCKET_ERROR)
{
return -1;
}
if(getResponse() < 0)
return -1;
send_data = "AUTH LOGIN\r\n";
//printf("%s\n",send_data);
ret = send(sockfd,send_data,strlen(send_data),0);
if(ret == SOCKET_ERROR)
{
return -1;
}
if(getResponse() < 0)
return -1;
sprintf(ch,"%s\r\n",username);
//printf("%s\n",ch);
ret = send(sockfd,(char *)ch,strlen(ch),0);
if(ret == SOCKET_ERROR)
{
return -1;
}
if(getResponse() < 0)
return -1;
sprintf(ch,"%s\r\n",password);
//printf("%s\n",ch);
ret = send(sockfd,(char *)ch,strlen(ch),0);
if(ret == SOCKET_ERROR)
{
return -1;
}
if(getResponse() < 0)
return -1;
return 0;
}
/* Function name :sendmail
This function is used for sending mail to the remote SMTP server
arguments:
from, mail form where?
to, mail destination address
cc, cc address
subject,the mail subject
context,the context of your mail
return value : if right respone -1 else 0;
*/
int sendmail(const char* from,const char * to,
const char * cc,const char * subject,
const char * context)
{
char From[128];
char To[128];
char Cc[128];
char Subject[512];
char Context[6000]={0};
if(from =="" ||to == ""||cc == ""||subject == ""||context == "")
{
fprintf(stderr,"arguments error!\n");
return -1;
}
printf("Ready to send email ,Please standby!\n");
/*MAIL FROM*/
sprintf(From,"MAIL FROM: <%s>\r\n",from);
if((ret= send(sockfd,From,strlen(From),0))== SOCKET_ERROR)
{
return -1;
}
if(getResponse() < 0)
return -1;
/*RCPT TO*/
sprintf(To,"RCPT TO: <%s>\r\n",to);
if((ret= send(sockfd,To,strlen(To),0))== SOCKET_ERROR)
{
return -1;
}
if(getResponse() < 0)
return -1;
/*DATA*/
send_data = "DATA\r\n";
if((ret= send(sockfd,send_data,strlen(send_data),0))== SOCKET_ERROR)
{
return -1;
}
if(getResponse() < 0)
return -1;
/*From :*/
memset(From,0,sizeof(From));
sprintf(From,"From: %s\r\n",from);
strcat(Context,From);
/*To :*/
memset(To,0,sizeof(To));
sprintf(To,"To: %s\r\n",to);
strcat(Context,To);
/*Cc :*/
memset(Cc,0,sizeof(Cc));
sprintf(Cc,"Cc: %s\r\n",cc);
strcat(Context,Cc);
/*Subject :*/
memset(Subject,0,sizeof(Subject));
sprintf(Subject,"Subject: %s\r\n",subject);
strcat(Context,Subject);
/*"\r\n\r\n"*/
strcat(Context,"\r\n\r\n");
strcat(Context,context);
/* . */
strcat(Context,"\r\n.\r\n");
if((ret= send(sockfd,Context,strlen(Context),0))== SOCKET_ERROR)
{
return -1;
}
if(getResponse() < 0)
return -1;
/*QUIT*/
if((ret= send(sockfd,"QUIT\r\n",strlen("QUIT\r\n"),0))== SOCKET_ERROR)
{
return -1;
}
if(getResponse() < 0)
return -1;
return 0;
}
int mailinit(const char* server,const char * name,const char * passwd)
{
char name64[180]={0};
char passwd64[180]={0};
base64encode(name,name64,strlen(name));
base64encode(passwd,passwd64,strlen(passwd));
if (connectHost(server)<0)
{
fprintf(stderr,"Can Not LOGIN !\n");
return -1;
}
if(login(name64,passwd64) < 0)
{
fprintf(stderr,"Can Not LOGIN !\n");
return -1;
}
return 0;
}
int send_email(const char* server, const char * name, const char * passwd,
const char* from, const char * to, const char * cc,
const char * subject, const char * context)
{
if((mailinit(server,name,passwd))<0 )
{
fprintf(stderr,"Mail init failed!\n");
close(sockfd);
return -1;
}
if((sendmail(from,to,cc,subject,context))<0 )
{
fprintf(stderr,"Mail send failed!\n");
close(sockfd);
return -1;
}
printf("Mail Send Complete!\n");
savelog("/var/local/mail_warning.log",to,context);
close(sockfd);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -