C语言发送邮件
基本框架就是这,需要其他功能自己添加吧
C语言实现简单的SMTP发送邮件
#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 (char c6);
void EncodeBase64 (char *dbuf, char *buf128, int len);
void SendMail (char *email,char *body);
int OpenSocket (struct sockaddr *addr);
int main()
{
char EmailTo[] = “hanyinlong@126.com”;
char EmailContents[] = “From: \”lucy\”hanyinlong@126.com\r\n”
“To: \”dasiy\”hanyinlong@126.com\r\n”
“Subject: Hello\r\n\r\n”
“Hello World, Hello Email!”;
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;
int i = 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};
char buf[1500] = {0};
char rbuf[1500] = {0};
char login[128] = {0};
char pass[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);
}
coutrbufendl;
// 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: “rbufendl;
// 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: “rbufendl;
// USER
memset(buf, 0, 1500);
sprintf_s(buf, 1500, “hanyinlong@126.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: “bufendl;
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout”User Login Receive: “rbufendl;
// PASSWORD
sprintf_s(buf, 1500, “XXXXXXXXXXXX”);//你的邮箱密码
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: “bufendl;
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout”Send Password Receive: “rbufendl;
// MAIL FROM
memset(buf, 0, 1500);
sprintf_s(buf, 1500, “MAIL FROM: hanyinlong@126.com\r\n”);
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout”set Mail From Receive: “rbufendl;
// 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: “rbufendl;
// 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: “rbufendl;
// 发送邮件内容,\r\n.\r\n内容结束标记
sprintf_s(buf, 1500, “%s\r\n.\r\n”, body);
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout”Send Mail Receive: “rbufendl;
// 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: “rbufendl;
//清理工作
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;
}
C++怎么发邮件
1、C++的关键字没有发邮件的功能。C++只是一种编程语言。 c++本身没有发邮件的功能。想让他发邮件,还要用别人写好的C++的一些库函数,框架之类的。
2、例程:
/***********************************************************************
*发送邮件模块头文件
*可以发送文本和附件(支持多个附件一起发送)
*************************************************************************/
#pragma once
struct sMailInfo //邮件信息
{
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));}
};
class CSendMail
{
public:
CSendMail(void);
~CSendMail(void);
public:
bool SendMail(sMailInfo smailInfo);//发送邮件,需要在发送的时候初始化邮件信息
void AddFilePath(char * pcFilePath);//添加附件的决定路径到附件列表中
void DeleteFilePath(char* pcFilePath);//删除附件路径,如果有的话
void DeleteAllPath(void);//删除全部附件的路径
protected:
void GetFileName(char* fileName,char* filePath);//从附件的路径中获取文件名称
void Char2Base64(char* pBuff64,char* pSrcBuff,int iLen);//把char类型转换成Base64类型
bool CReateSocket(SOCKET sock);//建立socket连接
bool Logon(SOCKET sock);//登录邮箱,主要进行发邮件前的准备工作
int GetFileData(char* FilePath);//由文件路径获取附件内容
bool SendHead(SOCKET sock);//发送邮件头
bool SendTextBody(SOCKET sock);//发送邮件文本正文
bool SendFileBody(SOCKET sock);//发送邮件附件
bool SendEnd(SOCKET sock);//发送邮件结尾
protected:
CListchar*,char* m_pcFilePathList;//记录附件路径
char m_cSendBuff[4096];//发送缓冲区
char m_cReceiveBuff[1024];
char* m_pcFileBuff;//指向附件内容
sMailInfo m_sMailInfo;
};
/************************************************************************
* 发送邮件模块
*可以发送文本和附件(支持多个附件一起发送)
*Date:2011-12-01
************************************************************************/
#include “StdAfx.h”
#include “SendMail.h”
#include “winsock2.h”
#pragma comment(lib,”WSOCK32″)
CSendMail::CSendMail(void)
{
m_pcFileBuff=NULL;
memset(m_cSendBuff,0,sizeof(m_cSendBuff));
memset(m_cReceiveBuff,0,sizeof(m_cReceiveBuff));
}
CSendMail::~CSendMail(void)
{
DeleteAllPath();
}
void CSendMail::Char2Base64(char* pBuff64,char* pSrcBuff,int iLen)
{
//1 1 1 1 1 1 1 1
// 分配给pBuff64 ↑ 分配给pBuff64+1
// point所在的位置
static char Base64Encode[] = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;//base64所映射的字符表
int point;//每一个源字符拆分的位置,可取2,4,6;初始为2
point=2;
int i;
int iIndex;//base64字符的索引
char n=0;//上一个源字符的残留值
for(i=0;iiLen;i++)
{
if(point==2)
{
iIndex=((*pSrcBuff)point)0x3f;//取得pSrcBuff的高point位
}
else if (point==4)
{
iIndex=((*pSrcBuff)point)0xf;//取得pSrcBuff的高point位
}
else if(point==6)
{
iIndex=((*pSrcBuff)point)0x3;//取得pSrcBuff的高point位
}
iIndex+=n;//与pSrcBuff-1的低point结合组成Base64的索引
*pBuff64++=Base64Encode[iIndex];//由索引表得到pBuff64
n=((*pSrcBuff)(6-point));//计算源字符中的残留值
n=n0x3f;//确保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=’=’;
}
else if(iLen%3==1)
{
*pBuff64++=’=’;
*pBuff64=’=’;
}
}
void CSendMail::AddFilePath(char * pcFilePath)//添加附件路径
{
if(pcFilePath==NULL)
{
return;
}
int i;
char* temp;
for(i=0;im_pcFilePathList.GetCount();i++)
{
temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));
if(strcmp(pcFilePath,temp)==0)//如果已经存在就不用再添加了
{
return;
}
}
m_pcFilePathList.AddTail(pcFilePath);
}
void CSendMail::DeleteFilePath(char* pcFilePath)//删除附件路径
{
int i;
char* temp;
for(i=0;im_pcFilePathList.GetCount();i++)
{
temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));
if(strcmp(temp,pcFilePath)==0)//找到并删除它,如果没找到就算了
{
m_pcFilePathList.RemoveAt(m_pcFilePathList.FindIndex(i));
delete[] temp;
return;
}
}
}
void CSendMail::DeleteAllPath(void)
{
m_pcFilePathList.RemoveAll();
}
int CSendMail::GetFileData(char* FilePath)
{
m_pcFileBuff=NULL;
if(FilePath==NULL)
{
return 0;
}
CFile f;
int len;
USES_CONVERSION;
if(!f.Open(A2W(FilePath),CFile::modeRead|CFile::modeNoTruncate|CFile::typeBinary))
{
return 0;
}
len=(int)f.GetLength();
m_pcFileBuff=new char[len+1];
memset(m_pcFileBuff,0,len+1);
f.Read(m_pcFileBuff,len);
f.Close();
return len;
}
void CSendMail::GetFileName(char* fileName,char* filePath)
{
if(filePath==NULL || fileName==NULL)
{
return;
}
int i;
for(i=0;i(int)strlen(filePath);i++)
{
if(filePath[strlen(filePath)-1-i]==’\\’)
{
memcpy(fileName,filePath[strlen(filePath)-i],i);
return;
}
}
}
bool CSendMail::CReateSocket(SOCKET sock)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, wsaData );
if ( err != 0 )
{
return false;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return false;
}
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if (sock == INVALID_SOCKET)
{
return false;
}
sockaddr_in servaddr;
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
{
struct hostent *hp=gethostbyname(m_sMailInfo.m_pcIPName);//使用名称
servaddr.sin_addr.s_addr=*(int*)(*hp-h_addr_list);
}
int ret = connect(sock,(sockaddr*)servaddr,sizeof(servaddr));//建立连接
if (ret == SOCKET_ERROR)
{
return false;
}
return true;
}
bool CSendMail::Logon(SOCKET sock)
{
recv(sock,m_cReceiveBuff,1024,0);
memset(m_cSendBuff,0,sizeof(m_cSendBuff));
sprintf_s(m_cSendBuff,”HELO []\r\n”);
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′)
{
return false;
}
memset(m_cSendBuff,0,sizeof(m_cSendBuff));
sprintf_s(m_cSendBuff,”AUTH LOGIN\r\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′)
{
return false;
}
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′)
{
return false;
}
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′)
{
return false;
}
return true;//登录成功
}
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 (char c6);
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;
int i = 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};
char buf[1500] = {0};
char rbuf[1500] = {0};
char login[128] = {0};
char pass[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);
}
coutrbufendl;
// 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: “rbufendl;
// 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: “rbufendl;
// 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: “bufendl;
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout”User Login Receive: “rbufendl;
// 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: “bufendl;
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout”Send Password Receive: “rbufendl;
// 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: “rbufendl;
// 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: “rbufendl;
// 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: “rbufendl;
// 发送邮件内容,\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: “rbufendl;
// 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: “rbufendl;
//清理工作
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;
}