當前位置:編程學習大全網 - 編程語言 - C語言郵件程序 如何發送附件

C語言郵件程序 如何發送附件

C語言發送郵件 完整代碼:

#include?<windows.h>

#include?<stdio.h>

#include?<WinSock.h>

#include?<iostream>

using?namespace?std;

#pragma?comment(lib,?"ws2_32.lib")

struct?Base64Date6

{

unsigned?int?d4:6;

unsigned?int?d3:6;

unsigned?int?d2:6;

unsigned?int?d1:6;

};

//?協議中加密部分使用的是base64方法

char?ConvertToBase64?(charc6);

void?EncodeBase64?(char*dbuf,?char?*buf128,?int?len);

void?SendMail?(char*email,char?*body);

int?OpenSocket(struct?sockaddr?*addr);

int?main()

{

char?EmailTo[]?=?"xushiladeng@qq.com";

char?EmailContents[]=?"From:?\"lucy\"<xushiladeng@qq.com>\r\n"

"To:?\"dasiy\"<xushiladeng@qq.com>\r\n"

"Subject:?Hello\r\n\r\n"

"Hello?World,?Hello?Email!"

//"DATA\r\n"?//告訴服務器下面是郵件

//下面是郵件頭

"TO:?xushiladeng@qq.com\r\n"

"FROM:?xushiladeng@qq.com\r\n"

"SUBJECT:?SMTP協議測試\r\n"

"Date:2015-04-20\r\n"

"X-Mailer:fice's?mailer\r\n"

"MIMI-Version:1.0\r\n"

"Content-Type:multipart/mixed;boundary=\"#BOUNDARY#\"\r\n\r\n"//設置邊界值,區分郵件內容的?兩個回車換行

"Content-Transfer-Encoding:7bit\r\n\r\n"

"This?is?a?multi-part?message?in?MIME?format\r\n\r\n"

//發送郵件內容頭部信息

"--#BOUNDARY#\r\n"

"Content-Type:?text/plain;charset=gb2312\r\n"

"Content-Transfer-Encoding:printable\r\n\r\n"

//發送郵件的內容部分

"SMTP協議測試:發送附件/n----by?fice?2015.04.20\r\n"

//發送附件頭部信息

"--#BOUNDARY#\r\n"

"Content-Type:text/plain;name=student.txt\r\n"

"Content-Transfer-Encoding:base64\r\n"

"Content-Disposition:attachment;filename=\"test.txt\"\r\n\r\n";

SendMail(EmailTo,?EmailContents);

return?0;

}

char?ConvertToBase64(char?uc)

{

if(uc?<?26)

{

return?'A'?+?uc;

}

if(uc?<?52)

{

return?'a'?+?(uc?-?26);

}

if(uc?<?62)

{

return?'0'?+?(uc?-?52);

}

if(uc?==?62)

{

return?'+';

}

return?'/';

}

//?base64的實現

void?EncodeBase64(char?*dbuf,?char?*buf128,?int?len)

{

struct?Base64Date6?*ddd?=?NULL;

inti=?0;

char?buf[256]?=?{0};

char?*tmp?=?NULL;

char?cc=?'\0';

memset(buf,?0,?256);

strcpy_s(buf,?256,?buf128);

for(i?=?1;?i?<=?len/3;?i++)

{

tmp?=?buf?+?(i-1)*3;

cc?=?tmp[2];

tmp[2]?=?tmp[0];

tmp[0]?=?cc;

ddd?=?(struct?Base64Date6?*)tmp;

dbuf[(i-1)*4+0]?=?ConvertToBase64((unsigned?int)ddd->d1);

dbuf[(i-1)*4+1]?=?ConvertToBase64((unsigned?int)ddd->d2);

dbuf[(i-1)*4+2]?=?ConvertToBase64((unsigned?int)ddd->d3);

dbuf[(i-1)*4+3]?=?ConvertToBase64((unsigned?int)ddd->d4);

}

if(len?%?3?==?1)

{

tmp?=?buf?+?(i-1)*3;

cc?=?tmp[2];

tmp[2]?=?tmp[0];

tmp[0]?=?cc;

ddd?=?(struct?Base64Date6?*)tmp;

dbuf[(i-1)*4+0]?=?ConvertToBase64((unsigned?int)ddd->d1);

dbuf[(i-1)*4+1]?=?ConvertToBase64((unsigned?int)ddd->d2);

dbuf[(i-1)*4+2]?=?'=';

dbuf[(i-1)*4+3]?=?'=';

}

if(len%3?==?2)

{

tmp?=?buf+(i-1)*3;

cc?=?tmp[2];

tmp[2]?=?tmp[0];

tmp[0]?=?cc;

ddd?=?(struct?Base64Date6?*)tmp;

dbuf[(i-1)*4+0]?=?ConvertToBase64((unsigned?int)ddd->d1);

dbuf[(i-1)*4+1]?=?ConvertToBase64((unsigned?int)ddd->d2);

dbuf[(i-1)*4+2]?=?ConvertToBase64((unsigned?int)ddd->d3);

dbuf[(i-1)*4+3]?=?'=';

}

return;

}

//?發送郵件

void?SendMail(char?*email,?char?*body)

{

int?sockfd?=?{0};

charbuf[1500]?=?{0};

charrbuf[1500]?=?{0};

charlogin[128]?=?{0};

charpass[128]?=?{0};

WSADATA?WSAData;

struct?sockaddr_in?their_addr?=?{0};

WSAStartup(MAKEWORD(2,?2),?&WSAData);

memset(&their_addr,?0,?sizeof(their_addr));

their_addr.sin_family?=?AF_INET;

their_addr.sin_port=?htons(25);

hostent*?hptr?=?gethostbyname("smtp.126.com");?

memcpy(&their_addr.sin_addr.S_un.S_addr,?hptr->h_addr_list[0],?hptr->h_length);?

printf("IP?of?smpt.126.com?is?:?%d:%d:%d:%d\n",?

their_addr.sin_addr.S_un.S_un_b.s_b1,?

their_addr.sin_addr.S_un.S_un_b.s_b2,?

their_addr.sin_addr.S_un.S_un_b.s_b3,?

their_addr.sin_addr.S_un.S_un_b.s_b4);?

//?連接郵件服務器,如果連接後沒有響應,則2?秒後重新連接

sockfd?=?OpenSocket((struct?sockaddr?*)&their_addr);

memset(rbuf,?0,?1500);

while(recv(sockfd,?rbuf,?1500,?0)?==?0)

{

cout<<"reconnect..."<<endl;

Sleep(2);

sockfd?=?OpenSocket((struct?sockaddr?*)&their_addr);

memset(rbuf,?0,?1500);

}

cout<<rbuf<<endl;

//?EHLO

memset(buf,?0,?1500);

sprintf_s(buf,?1500,?"EHLO?HYL-PC\r\n");

send(sockfd,?buf,?strlen(buf),?0);

memset(rbuf,?0,?1500);

recv(sockfd,?rbuf,?1500,?0);

cout<<"EHLO?REceive:?"<<rbuf<<endl;

//?AUTH?LOGIN

memset(buf,?0,?1500);

sprintf_s(buf,?1500,?"AUTH?LOGIN\r\n");

send(sockfd,?buf,?strlen(buf),?0);

memset(rbuf,?0,?1500);

recv(sockfd,?rbuf,?1500,?0);

cout<<"Auth?Login?Receive:?"<<rbuf<<endl;

//?USER

memset(buf,?0,?1500);

sprintf_s(buf,?1500,?"xushiladeng@qq.com");//妳的郵箱賬號

memset(login,?0,?128);

EncodeBase64(login,?buf,?strlen(buf));

sprintf_s(buf,?1500,?"%s\r\n",?login);

send(sockfd,?buf,?strlen(buf),?0);

cout<<"Base64?UserName:?"<<buf<<endl;

memset(rbuf,?0,?1500);

recv(sockfd,?rbuf,?1500,?0);

cout<<"User?Login?Receive:?"<<rbuf<<endl;

//?PASSWORD

sprintf_s(buf,?1500,?"********");//妳的郵箱密碼

memset(pass,?0,?128);

EncodeBase64(pass,?buf,?strlen(buf));

sprintf_s(buf,?1500,?"%s\r\n",?pass);

send(sockfd,?buf,?strlen(buf),?0);

cout<<"Base64?Password:?"<<buf<<endl;

memset(rbuf,?0,?1500);

recv(sockfd,?rbuf,?1500,?0);

cout<<"Send?Password?Receive:?"<<rbuf<<endl;

//?MAIL?FROM

memset(buf,?0,?1500);

sprintf_s(buf,?1500,?"MAIL?FROM:?<xushiladeng@qq.com>\r\n");

send(sockfd,?buf,?strlen(buf),?0);

memset(rbuf,?0,?1500);

recv(sockfd,?rbuf,?1500,?0);

cout<<"set?Mail?From?Receive:?"<<rbuf<<endl;

//?RCPT?TO?第壹個收件人

sprintf_s(buf,?1500,?"RCPT?TO:<%s>\r\n",?email);

send(sockfd,?buf,?strlen(buf),?0);

memset(rbuf,?0,?1500);

recv(sockfd,?rbuf,?1500,?0);

cout<<"Tell?Sendto?Receive:?"<<rbuf<<endl;

//?DATA?準備開始發送郵件內容

sprintf_s(buf,?1500,?"DATA\r\n");

send(sockfd,?buf,?strlen(buf),?0);

memset(rbuf,?0,?1500);

recv(sockfd,?rbuf,?1500,?0);

cout<<"Send?Mail?Prepare?Receive:?"<<rbuf<<endl;

//?發送郵件內容,\r\n.\r\n內容結束標記

sprintf_s(buf,?1500,?"%s\r\n.\r\n",?body);

send(sockfd,?buf,?strlen(buf),?0);//發送郵件,不帶附件的內容

//用二進制方式讀取附件文件內容並轉為base64格式?

FILE*?pf?=?fopen("D:\\test.txt","rb");

fseek(pf,0,SEEK_END);

int?filelen?=?ftell(pf);

char*?filebuf?=?(char*)?malloc(filelen);

char*?filebase64?=?(char*)?malloc(filelen*2);

memset(filebase64,0,filelen*2);

fseek(pf,0,SEEK_SET);

fread(filebuf,1,filelen,pf);?

EncodeBase64(filebase64,filebuf,filelen);?

send(sockfd,?filebase64,?strlen(filebase64),?0);//發送郵件的內容

memset(rbuf,?0,?1500);

recv(sockfd,?rbuf,?1500,?0);

cout<<"Send?Mail?Receive:?"<<rbuf<<endl;

//?QUIT

sprintf_s(buf,?1500,?"QUIT\r\n");

send(sockfd,?buf,?strlen(buf),?0);

memset(rbuf,?0,?1500);

recv(sockfd,?rbuf,?1500,?0);

cout<<"Quit?Receive:?"<<rbuf<<endl;

//清理工作

closesocket(sockfd);

WSACleanup();

return;

}

//?打開TCP?Socket連接

int?OpenSocket(struct?sockaddr?*addr)

{

int?sockfd?=?0;

sockfd=socket(PF_INET,?SOCK_STREAM,?0);

if(sockfd?<?0)

{

cout<<"Open?sockfd(TCP)?error!"<<endl;

exit(-1);

}

if(connect(sockfd,?addr,?sizeof(struct?sockaddr))?<?0)

{

cout<<"Connect?sockfd(TCP)?error!"<<endl;

exit(-1);

}

return?sockfd;

}

  • 上一篇:漢字比英文優秀嗎?在信息爆炸的今天,二者誰更適應社會的發展?
  • 下一篇:北白犀的幹細胞
  • copyright 2024編程學習大全網