#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>
#include "smtp.h"
/* ¨Ï¥Î¯ÂC»P¨¥¹ê²{ */
char *_m_strcpy(char **dest, const char *src)
{
*dest = (char *)malloc( strlen(src)+1 ) ;
strcpy(*dest,src);
return *dest ;
}
int readsocket(int sockfd,const char *stop)
{
int iResult =0 ;
const int bsize =256 ;
char buf[ bsize +1] ;
while (( iResult = recv(sockfd, buf, bsize,0 )) > 0) {
buf[iResult] = '\0';
/* printf(buf) ; */
if ((stop) && (strstr(buf,stop)!=NULL)) break ;
}
return iResult ;
}
int sendsmtpmail(int sockfd, Mail *mail)
{
char sendbuff[256];
char Date[36];
time_t td;
char *src ,*mTo;
char *ptr ;
int len ,mlen;
char *pdata=NULL;
readsocket(sockfd,"220") ;
hostsend(sockfd,"HELO \r\n") ;
readsocket(sockfd,"250") ;
hostsend(sockfd,"EHLO\r\n") ;
readsocket(sockfd,"250") ;
/* user password */
if (NULL != mail->header->userName) {
hostsend(sockfd,"AUTH LOGIN \r\n") ;
readsocket(sockfd,"334") ;
Base64Enc(sendbuff, mail->header->userName) ;
hostsend(sockfd,"%s\r\n",sendbuff);
Base64Enc(sendbuff, mail->header->passWord) ;
hostsend(sockfd,"%s\r\n",sendbuff);
readsocket(sockfd,"235") ;
}
hostsend(sockfd,"RSET\r\n",sendbuff);
hostsend(sockfd,"MAIL FROM: <%s> \r\n", mail->header->mailFrom) ;
readsocket(sockfd,"250") ;
src=mail->header->mailTo ;
mTo=(char *)malloc(60) ;
memset(mTo,0,sizeof(mTo)) ;
ptr=mTo ;
while ((*ptr++ = *src ++)){
if ((*src == ',') ||(*src =='\0' )) {
*ptr='\0' ;
hostsend(sockfd,"RCPT TO: <%s> \r\n",mTo) ;
readsocket(sockfd,"250") ;
ptr = mTo ;
src++ ;
}
}
free(mTo);
/*
hostsend(sockfd,"RCPT TO: <%s> \r\n", mail->header->mailTo) ;
readsocket(sockfd,"250") ;
*/
time(&td);
len=(int)strftime(Date,sizeof(Date), "%A %b %d %H:%M:%S %Y",localtime(&td));
Date[len]=0;
mlen = strlen(mail->mailBody) ;
/* len : length of encodequoted
*/
len = EncodeQuoted((unsigned char *) mail->mailBody , pdata ,mlen ,80 ,0) ;
pdata=(char *)malloc(len+1) ;
memset(pdata,0, len + 1) ;
EncodeQuoted((unsigned char *) mail->mailBody , pdata ,mlen ,80 ,1) ;
/* pdata= EncodeQuotednew((unsigned char *) mail->mailBody ,len ,80 ) ; */
hostsend(sockfd,"DATA\r\n") ;
readsocket(sockfd,"354") ;
hostsend(sockfd, "From:%s\r\nTo: %s \r\n",
mail->header->mailFrom,
mail->header->mailTo);
/*mime head */
hostsend(sockfd,"Subject: %s \r\n\
Date:%s\r\n\
Mime-Version: 1.0 \r\n\
Content-Type:%s \r\n\r\n", mail->subject,
Date,
mail->contentType);
/*mine content data */
hostsend(sockfd,"--quinoa\r\n\
Content-Type: text/plain;\r\n \
charset=\"%s\" \r\n\
Content-Transfer-Encoding: quoted-printable \r\n\r\n\
%s\r\n",mail->charSet , pdata) ;
free((void *)pdata) ;
hostsend(sockfd,"\r\n.\r\n") ; /*end data */
readsocket(sockfd,"250") ;
hostsend(sockfd,"QUIT\r\n") ;
readsocket(sockfd,"221") ;
return 0 ;
}
/*encoding base64
*/
int Base64Enc(char *buf,char *text)
{
static char *base64_encoding="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int buflen=0;
int size=strlen(text);
while(size>0)
{
*buf++=base64_encoding[(text[0]>>2)&0x3f];
if(size>2)
{
*buf++=base64_encoding[((text[0]&3)<<4)|(text[1]>>4)] ;
*buf++=base64_encoding[((text[1]&0xF)<<2)|(text[2]>>6)];
*buf++=base64_encoding[text[2]&0x3f];
}
else
{
switch(size)
{
case 1:
*buf++=base64_encoding[(text[0]&3)<<4];
*buf++='=';
*buf++='=';
break;
case 2:
*buf++=base64_encoding[((text[0]&3)<<
4)|(text[1]>>4)];
*buf++=base64_encoding[((text[1]&0x0F
)<<2)|(text[2]>>6)];
*buf++='=';
break;
}
}
text+=3;
size-=3;
buflen+=4;
}
*buf=0;
return buflen;
}
char GetBase64Value(char ch)
{
if ((ch >= 'A') && (ch <= 'Z'))
return ch - 'A';
if ((ch >= 'a') && (ch <= 'z'))
return ch - 'a' + 26;
if ((ch >= '0') && (ch <= '9'))
return ch - '0' + 52;
switch (ch)
{
case '+':
return 62;
case '/':
return 63;
case '=': /* base64 padding */
return 0;
default:
return 0;
}
}
int Base64Dec(char *buf,char*text,int size)
{
unsigned char chunk[4];
int parsenum=0;
if(size%4)
return -1;
while(size>0)
{
chunk[0] = GetBase64Value(text[0]);
chunk[1] = GetBase64Value(text[1]);
chunk[2] = GetBase64Value(text[2]);
chunk[3] = GetBase64Value(text[3]);
*buf++ = (chunk[0] << 2) | (chunk[1] >> 4);
*buf++ = (chunk[1] << 4) | (chunk[2] >> 2);
*buf++ = (chunk[2] << 6) | (chunk[3]);
text+=4;
size-=4;
parsenum+=3;
}
return parsenum;
}
int hostsend(int sock, char *format, ...)
{
char BUFFER[1024] ;
va_list argptr ;
va_start(argptr, format) ;
vsnprintf(BUFFER, sizeof(BUFFER), format, argptr) ;
va_end(argptr) ;
/* printf("%s",BUFFER) ; */
return send(sock, BUFFER, strlen(BUFFER), 0) ;
}
int hostconnect(const char *hostname, uint16_t port)
{
int sockfd ;
struct hostent *host ;
struct sockaddr_in client_addr;
if((host=c( hostname ))==NULL) {
perror("gethostbyname");
return (-1) ;
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("sockfd ");
return (-2);
}
client_addr.sin_family=AF_INET;
client_addr.sin_port=htons( port );
client_addr.sin_addr = *((struct in_addr *)host->h_addr);
memset(&(client_addr.sin_zero),0,8) ;
if (connect(sockfd, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) == -1) {
perror("Connec Error");
return -3 ;
}
return (sockfd );
}
void die(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
exit(EXIT_FAILURE);
}
/*Content-Transfer-Encoding:
没有合适的资源?快使用搜索试试~ 我知道了~
smtp.tar.gz_quoted-printable
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 191 浏览量
2022-09-24
19:40:28
上传
评论
收藏 4KB GZ 举报
温馨提示
共2个文件
h:1个
c:1个
smtp 发送邮件,包括实现简单的encode (base64 quoted-printable)
资源推荐
资源详情
资源评论
收起资源包目录
smtp.tar.gz (2个子文件)
smtp
smtp.c 12KB
smtp.h 3KB
共 2 条
- 1
资源评论
APei
- 粉丝: 63
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功