C发送邮件和附件.docx

上传人:b****7 文档编号:9825695 上传时间:2023-02-06 格式:DOCX 页数:19 大小:18.11KB
下载 相关 举报
C发送邮件和附件.docx_第1页
第1页 / 共19页
C发送邮件和附件.docx_第2页
第2页 / 共19页
C发送邮件和附件.docx_第3页
第3页 / 共19页
C发送邮件和附件.docx_第4页
第4页 / 共19页
C发送邮件和附件.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

C发送邮件和附件.docx

《C发送邮件和附件.docx》由会员分享,可在线阅读,更多相关《C发送邮件和附件.docx(19页珍藏版)》请在冰豆网上搜索。

C发送邮件和附件.docx

C发送邮件和附件

C++发送邮件和附件

C++发送邮件和附件

头文件

/************************************************************************发送邮件模块头文件*可以发送文本和附件(支持多个附件一起发送)*************************************************************************/#pragmaoncestructsMailInfo//邮件信息{char*m_pcUserName;//用户登录邮箱的名称char*m_pcUserPassWord;//用户登录邮箱的密码

char*m_pcSenderName;//用户发送时显示的名称

char*m_pcSender;//发送者的邮箱地址

char*m_pcReceiver;//接收者的邮箱地址

char*m_pcTitle;//邮箱标题

char*m_pcBody;//邮件文本正文

char*m_pcIPAddr;//服务器的IP

char*m_pcIPName;//服务器的名称(IP与名称二选一,优先取名称)sMailInfo(){memset(this,0,sizeof(sMailInfo));}

};

classCSendMail

{

public:

CSendMail(void);

~CSendMail(void);

public:

boolSendMail(sMailInfo&smailInfo);//发送邮件,需要在发送的时候初始化邮件信息

voidAddFilePath(char*pcFilePath);//添加附件的决定路径到附件列表中voidDeleteFilePath(char*pcFilePath);//删除附件路径,如果有的话voidDeleteAllPath(void);//删除全部附件的路径

protected:

voidGetFileName(char*fileName,char*filePath);//从附件的路径中获取文件名称voidChar2Base64(char*pBuff64,char*pSrcBuff,intiLen);//把char类型转换成Base64类型

boolCReateSocket(SOCKET&sock);//建立socket连接

boolLogon(SOCKET&sock);//登录邮箱,主要进行发邮件前的准备工作

intGetFileData(char*FilePath);//由文件路径获取附件内容

boolSendHead(SOCKET&sock);//发送邮件头

boolSendTextBody(SOCKET&sock);//发送邮件文本正文

boolSendFileBody(SOCKET&sock);//发送邮件附件

boolSendEnd(SOCKET&sock);//发送邮件结尾

protected:

CListm_pcFilePathList;//记录附件路径

charm_cSendBuff[4096];//发送缓冲区

charm_cReceiveBuff[1024];

char*m_pcFileBuff;//指向附件内容

sMailInfom_sMailInfo;

};

模块实现文件

/*************************************************************************发送邮件模块

*可以发送文本和附件(支持多个附件一起发送)

*Date:

2019-12-01

************************************************************************/#include

#include

#include

#pragmacomment(lib,

CSendMail:

:

CSendMail(void)

{

m_pcFileBuff=NULL;

memset(m_cSendBuff,0,sizeof(m_cSendBuff));

memset(m_cReceiveBuff,0,sizeof(m_cReceiveBuff));

}

CSendMail:

:

~CSendMail(void)

{

DeleteAllPath();

}

voidCSendMail:

:

Char2Base64(char*pBuff64,char*pSrcBuff,intiLen)

{

//11111111

//分配给pBuff64↑分配给pBuff64+1

//point所在的位置

staticcharBase64Encode[]=

intpoint;//每一个源字符拆分的位置,可取2,4,6;初始为2

point=2;

inti;

intiIndex;//base64字符的索引

charn=0;//上一个源字符的残留值

for(i=0;i

{

if(point==2)

{

iIndex=((*pSrcBuff)>>point)&0x3f;//取得pSrcBuff的高point位}

elseif(point==4)

{

iIndex=((*pSrcBuff)>>point)&0xf;//取得pSrcBuff的高point位}

elseif(point==6)

{

iIndex=((*pSrcBuff)>>point)&0x3;//取得pSrcBuff的高point位}

iIndex+=n;//与pSrcBuff-1的低point结合组成Base64的索引

*pBuff64++=Base64Encode[iIndex];//由索引表得到pBuff64

n=((*pSrcBuff)

n=n&0x3f;//确保n的最高两位为0

point+=2;//源字符的拆分位置上升2

if(point==8)//如果拆分位置为8说明pSrcBuff有6位残留,可以组成一个完整的Base64字符,所以直接再组合一次

{

iIndex=(*pSrcBuff)&0x3f;//提取低6位,这就是索引了

*pBuff64++=Base64Encode[iIndex];//

n=0;//残留值为0

point=2;//拆分位置设为2

}

pSrcBuff++;

}

if(n!

=0)

{

*pBuff64++=Base64Encode[n];

}

if(iLen%3==2)//如果源字符串长度不是3的倍数要用'='补全

{

*pBuff64='=';

}

elseif(iLen%3==1)

{

*pBuff64++='=';

*pBuff64='=';

}

}

voidCSendMail:

:

AddFilePath(char*pcFilePath)//添加附件路径

{

if(pcFilePath==NULL)

{

return;

}

inti;

char*temp;

for(i=0;i

{

temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));if(strcmp(pcFilePath,temp)==0)//如果已经存在就不用再添加了

{

return;

}

}

m_pcFilePathList.AddTail(pcFilePath);

}

voidCSendMail:

:

DeleteFilePath(char*pcFilePath)//删除附件路径

{

inti;

char*temp;

for(i=0;i

{

temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));if(strcmp(temp,pcFilePath)==0)//找到并删除它,如果没找到就算了{

m_pcFilePathList.RemoveAt(m_pcFilePathList.FindIndex(i));delete[]temp;

return;

}

}

}

voidCSendMail:

:

DeleteAllPath(void)

{

m_pcFilePathList.RemoveAll();

}

intCSendMail:

:

GetFileData(char*FilePath)

{

m_pcFileBuff=NULL;

if(FilePath==NULL)

{

return0;

}

CFilef;

intlen;

USES_CONVERSION;

if(!

f.Open(A2W(FilePath),CFile:

:

modeRead|CFile:

:

modeNoTruncate|CFile:

:

typeBinary))

{

return0;

}

len=(int)f.GetLength();

m_pcFileBuff=newchar[len+1];

memset(m_pcFileBuff,0,len+1);

f.Read(m_pcFileBuff,len);

f.Close();

returnlen;

}

voidCSendMail:

:

GetFileName(char*fileName,char*filePath)

{

if(filePath==NULL||fileName==NULL)

{

return;

}

inti;

for(i=0;i

{

if(filePath[strlen(filePath)-1-i]=='\\')

{

memcpy(fileName,&filePath[strlen(filePath)-i],i);

return;

}

}

}

boolCSendMail:

:

CReateSocket(SOCKET&sock)

{

WORDwVersionRequested;

WSADATAwsaData;

interr;

wVersionRequested=MAKEWORD(2,2);

err=WSAStartup(wVersionRequested,&wsaData);

if(err!

=0)

{

returnfalse;

}

if(LOBYTE(wsaData.wVersion)!

=2||

HIBYTE(wsaData.wVersion)!

=2)

{

WSACleanup();

returnfalse;

}

sock=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);

if(sock==INVALID_SOCKET)

{

returnfalse;

}

sockaddr_inservaddr;

memset(&servaddr,0,sizeof(sockaddr_in));

servaddr.sin_family=AF_INET;

servaddr.sin_port=htons(25);//发邮件一般都是25端口

if(m_sMailInfo.m_pcIPName==

{

servaddr.sin_addr.s_addr=inet_addr(m_sMailInfo.m_pcIPAddr);//直接使用IP地址

}

else

{

structhostent*hp=gethostbyname(m_sMailInfo.m_pcIPName);//使用名称servaddr.sin_addr.s_addr=*(int*)(*hp->h_addr_list);

}

intret=connect(sock,(sockaddr*)&servaddr,sizeof(servaddr));//建立连接if(ret==SOCKET_ERROR)

{

returnfalse;

}

returntrue;

}

boolCSendMail:

:

Logon(SOCKET&sock)

{

recv(sock,m_cReceiveBuff,1024,0);

memset(m_cSendBuff,0,sizeof(m_cSendBuff));

sprintf_s(m_cSendBuff,

send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//开始会话

recv(sock,m_cReceiveBuff,1024,0);

if(m_cReceiveBuff[0]!

='2'||m_cReceiveBuff[1]!

='5'||

m_cReceiveBuff[2]!

='0')

{

returnfalse;

}

memset(m_cSendBuff,0,sizeof(m_cSendBuff));

sprintf_s(m_cSendBuff,

send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//请求登录

recv(sock,m_cReceiveBuff,1024,0);

if(m_cReceiveBuff[0]!

='3'||m_cReceiveBuff[1]!

='3'||

m_cReceiveBuff[2]!

='4')

{

returnfalse;

}

memset(m_cSendBuff,0,sizeof(m_cSendBuff));

Char2Base64(m_cSendBuff,m_sMailInfo.m_pcUserName,strlen(m_sMailInfo.m_pcUserName));

m_cSendBuff[strlen(m_cSendBuff)]='\r';

m_cSendBuff[strlen(m_cSendBuff)]='\n';

send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//发送用户名

recv(sock,m_cReceiveBuff,1024,0);

if(m_cReceiveBuff[0]!

='3'||m_cReceiveBuff[1]!

='3'||

m_cReceiveBuff[2]!

='4')

{

returnfalse;

}

memset(m_cSendBuff,0,sizeof(m_cSendBuff));

Char2Base64(m_cSendBuff,m_sMailInfo.m_pcUserPassWord,strlen(m_sMailInfo.m_pcUserPassWord));

m_cSendBuff[strlen(m_cSendBuff)]='\r';

m_cSendBuff[strlen(m_cSendBuff)]='\n';

send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//发送用户密码

recv(sock,m_cReceiveBuff,1024,0);

if(m_cReceiveBuff[0]!

='2'||m_cReceiveBuff[1]!

='3'||

m_cReceiveBuff[2]!

='5')

{

returnfalse;

}

returntrue;//登录成功

}

boolCSendMail:

:

SendHead(SOCKET&sock)

{

intrt;

memset(m_cSendBuff,0,sizeof(m_cSendBuff));

sprintf_s(m_cSendBuff,

if(rt!

=strlen(m_cSendBuff))

{

returnfalse;

}

recv(sock,m_cReceiveBuff,1024,0);

memset(m_cSendBuff,0,sizeof(m_cSendBuff));

sprintf_s(m_cSendBuff,

if(rt!

=strlen(m_cSendBuff))

{

returnfalse;

}

recv(sock,m_cReceiveBuff,1024,0);

memset(m_cSendBuff,0,sizeof(m_cSendBuff));

memcpy(m_cSendBuff,

rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0);

if(rt!

=strlen(m_cSendBuff))

{

returnfalse;

}

recv(sock,m_cReceiveBuff,1024,0);

memset(m_cSendBuff,0,sizeof(m_cSendBuff));

sprintf_s(m_cSendBuff,

sprintf_s(&m_cSendBuff[strlen(m_cSendBuff)],150,

sprintf_s(&m_cSendBuff[strlen(m_cSendBuff)],150,

boundary=\

rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0);

if(rt!

=strlen(m_cSendBuff))

{

returnfalse;

}

returntrue;

}

boolCSendMail:

:

SendTextBody(SOCKET&sock)

{

intrt;

memset(m_cSendBuff,0,sizeof(m_cSendBuff));

sprintf_s(m_cSendBuff,

rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0);

if(rt!

=strlen(m_cSendBuff))

{

returnfalse;

}

else

{

returntrue;

}

}

boolCSendMail:

:

SendFileBody(SOCKET&sock)

{

inti;

char*filePath;

intrt;

intlen;

intpt=0;

charfileName[128];

for(i=0;i

{

pt=0;

memset(fileName,0,128);

filePath=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));len=GetFileData(filePath);

GetFileName(fileName,filePath);

sprintf_s(m_cSendBuff,

application/octet-stream;\r\nname=\

filename=\

send(sock,m_cSendBuff,strlen(m_cSendBuff),0);

while(pt

{

memset(m_cSendBuff,0,sizeof(m_cSendBuff));

Char2Base64(m_cSendBuff,&m_pcFileBuff[pt],min(len-pt,3000));m_cSendBuff[strlen(m_cSendBuff)]='\r';

m_cSendBuff[strlen(m_cSendBuff)]='\n';

rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0);

pt+=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1