//ZBase64为base64编码的实现类,参考我前面的文章

bool CreateSocket() {
 if(WSAStartup(MAKEWORD(2,2),&wsadata_) == SOCKET_ERROR)
 {
        errornum_=WSA_STARTUP_ERROR;
  ReleaseSocket();
  return false;
 }
 
 if((socket_ = socket(AF_INET,SOCK_STREAM,0)) == SOCKET_ERROR)
 {
        errornum_=WSA_SOCKET_ERROR;
        ReleaseSocket();
        return false;
    }

int time = 5000;
    if(setsockopt(socket_,SOL_SOCKET,SO_RCVTIMEO,(char *)&time,sizeof(time)) == SOCKET_ERROR)
    {
        errornum_=WSA_SETSOCKAPT_ERROR;
        ReleaseSocket();
        return false;
    }
    if(setsockopt(socket_,SOL_SOCKET,SO_SNDTIMEO,(char *)&time,sizeof(time)) == SOCKET_ERROR)
    {
        errornum_=WSA_SETSOCKAPT_ERROR;
        ReleaseSocket();
        return false;
    }

errornum_=ZSMTP_NO_ERROR;
    return true;
}

bool CheckResponse(const char* RecvCode) {
  char Buf[1024]={0};
  if(recv(socket_,Buf,1024,0) == SOCKET_ERROR)
        {
            errornum_=WSA_RECV_ERROR;
            return false;
        }
  return RecvCode[0] == Buf[0] && \
      RecvCode[1] == Buf[1] && \
      RecvCode[2] == Buf[2] ? true : false; 
 
}

/**    @fn Connect
 *    @brief connect to smtp server
 *    @param
 *    @return true if success
 */
bool Connect() {
    if (smtpaddr_.empty())
    {
        errornum_=UNDEF_SERVERADDR;
        return false;
    }
    if (port_==0)
    {
        errornum_=UNDEF_SERVERPORT;
        return false;
    }
 if(!CreateSocket())
  return false;

if((hostent_=gethostbyname(smtpaddr_.c_str()))==NULL)
 {
        errornum_=WSA_GETHOSTBYNAME_ERROR;
  ReleaseSocket();
  return false; 
 }

if(hostent_->h_addr_list[0] == NULL)
 {
        errornum_=WSA_GETHOSTBYNAME_ERROR;
  ReleaseSocket();
  return false;
 }

memset(&sockaddr_in_,0,sizeof(sockaddr_in_));
 sockaddr_in_.sin_family = AF_INET;
 sockaddr_in_.sin_port   = htons(port_);
 sockaddr_in_.sin_addr.S_un.S_addr = *(ULONG *)hostent_->h_addr_list[0];

//连接服务器
 if(connect(socket_,(sockaddr *)&sockaddr_in_,sizeof(sockaddr_in_)) == SOCKET_ERROR)
 {
        errornum_=WSA_CONNECT_ERROR;
  ReleaseSocket();
  return false;
 }
 if(!CheckResponse("220")) return false;

//向服务器发送"HELO "+服务器名
 string strTmp="HELO "+smtpaddr_+"\r\n";
 if(send(socket_,strTmp.c_str(),strTmp.length(),0) == SOCKET_ERROR) 
 {
        errornum_=COMMAND_HELO;
  ReleaseSocket();
  return false;
 }
 if(!CheckResponse("250"))
    {
        errornum_=SERVER_NOT_READY;
        return false;
    }

return true;
}

/**    @fn Validate
 *    @brief validate username_ and password_
 *    @param
 *    @return true if username_ and password_ are correct
 */
bool Validate() {
    if (username_.empty())
    {
        errornum_=UNDEF_USER_NAME;
        return false;
    }
    if (password_.empty())
    {
        errornum_=UNDEF_PASSWORD;
        return false;
    }
 ZBase64 base64;

//发送"AUTH LOGIN"
 if(send(socket_,"AUTH LOGIN\r\n",strlen("AUTH LOGIN\r\n"),0) == SOCKET_ERROR)
 {
        errornum_=COMMAND_AUTH_LOGIN;
  ReleaseSocket();
  return false;
 }
 if(!CheckResponse("334"))
    {
        errornum_=COMMAND_AUTH_LOGIN;
        return false;
    }

//发送经base64编码的用户名
 string strUserName=base64.Encode((unsigned char *)username_.c_str(),username_.length())+"\r\n";
 if(send(socket_,strUserName.c_str(),strUserName.length(),0) == SOCKET_ERROR)
 {
        errornum_=WSA_SEND_ERROR;
  ReleaseSocket();
  return false;
 }
 if(!CheckResponse("334")) return false;

//发送经base64编码的密码
 string strPassword=base64.Encode((unsigned char *)password_.c_str(),password_.length())+"\r\n";
 if(send(socket_,strPassword.c_str(),strPassword.length(),0) == SOCKET_ERROR)
 {
        errornum_=WSA_SEND_ERROR;
  ReleaseSocket();
  return false;
 }
 if(!CheckResponse("235"))
    {
        errornum_=BAD_LOGIN_PASS;
        return false;
    }

return true;
}

/**    @fn Send
 *    @brief send an email
 *    @param
 *    @return true if success
 */
bool Send() {
    if (!Connect())
    {
        return false;
    }
    if (!Validate())
    {
        return false;
    }
 if(sendfrom_.empty())
    {
        errornum_=UNDEF_SEND_FROM;
        return false;
    }
 if(recipient_.size()<=0)
    {
        errornum_=UNDEF_RECIPIENTS;
        return false;
    }

if (sendername_.empty())
    {
        errornum_=UNDEF_SENDER_NAME;
        return false;
    }
    if (receivername_.empty())
    {
        errornum_=UNDEF_RECEVER_NAME;
        return false;
    }
    if (subject_.empty())
    {
        errornum_=UNDEF_SUBJECT;
        return false;
    }

string strTmp;
 ZBase64 base64;

//发送MAIL FROM:<abc@xyz.com>
 strTmp="MAIL FROM:<"+sendfrom_+">\r\n";
 if(send(socket_,strTmp.c_str(),strTmp.length(),0) == SOCKET_ERROR)
 {
        errornum_=WSA_SEND_ERROR;
  ReleaseSocket();
  return false;
 }
 if(!CheckResponse("250"))
    {
        errornum_=COMMAND_MAIL_FROM;
        return false;
    }

//发送RCPT To:<abc@xyz.com>
 for(unsigned int i=0;i<recipient_.size();++i)
 {
  strTmp="RCPT To:<"+recipient_[i]+">\r\n";
  if(send(socket_,strTmp.c_str(),strTmp.length(),0) == SOCKET_ERROR)
  {
            errornum_=WSA_SEND_ERROR;
   ReleaseSocket();
   return false;
  }
  if(!CheckResponse("250"))
        {
            errornum_=COMMAND_RCPT_TO;
            return false;
        }
 }

//发送"DATA\r\n"
 if(send(socket_,"DATA\r\n",strlen("DATA\r\n"),0) == SOCKET_ERROR)
 {
        errornum_=WSA_SEND_ERROR;
  ReleaseSocket();
  return false;
 }
 if(!CheckResponse("354"))
    {
        errornum_=COMMAND_DATA;
        return false;
    }

//"Mail From:sendername_<xxx@mail.com>\r\n"
 strTmp="From:"+sendername_+"<"+sendfrom_+">\r\n";

//"subject_: 邮件主题\r\n"
 strTmp+="Subject:"+subject_+"\r\n";

//"MIME_Version:1.0\r\n"
 strTmp+="MIME_Version:1.0\r\n";

//"X-Mailer:Smtp Client By xxx"//版权信息
 strTmp+="X-Mailer:"; strTmp+=COPYRIGHT; strTmp+="\r\n";

//"MIME_Version:1.0\r\n"
 strTmp+="MIME_Version:1.0\r\n";

//"content_-type:multipart/mixed;Boundary=xxx\r\n\r\n";
 strTmp+="Content-type:multipart/mixed;Boundary=";
 strTmp+=BOUNDARY;
 strTmp+="\r\n\r\n";

//先将HEADER部分发送过去
 if(send(socket_,strTmp.c_str(),strTmp.length(),0) == SOCKET_ERROR)
 {
        errornum_=WSA_SEND_ERROR;
  ReleaseSocket();
  return false; 
 }

//邮件主体
 strTmp="--";
 strTmp+=BOUNDARY;
 strTmp+="\r\n";
 strTmp+=ishtml_ ? "Content-type:text/html;Charset=gb2312\r\n" : "Content-type:text/plain;Charset=gb2312\r\n";
 strTmp+="Content-Transfer-Encoding:8bit\r\n\r\n";

//邮件内容
 strTmp+=content_+"\r\n\r\n";

//将邮件内容发送出去
 if(send(socket_,strTmp.c_str(),strTmp.length(),0) == SOCKET_ERROR)
 {
        errornum_=WSA_SEND_ERROR;
  ReleaseSocket();
  return false; 
 }

/*
 附件处理
 对文件内容分段进行base64编码,编码一小段,传送一小段
 */

for(unsigned int i=0;i<files_.size();++i)
 {
  strTmp="--";
  strTmp+=BOUNDARY;
  strTmp+="\r\n";

strTmp+="Content-Type:application/octet-stream;Name=";
  strTmp+=files_[i].substr(files_[i].find_last_of("\\")+1).c_str();
  strTmp+="\r\n";
  strTmp+="Content-Disposition:attachment;FileName=";
  strTmp+=files_[i].substr(files_[i].find_last_of("\\")+1).c_str();
  strTmp+="\r\n";
  strTmp+="Content-Transfer-Encoding:Base64\r\n\r\n";

if(send(socket_,strTmp.c_str(),strTmp.length(),0) == SOCKET_ERROR)
  {
            errornum_=WSA_SEND_ERROR;
   ReleaseSocket();
   return false; 
  }
  errno_t err;
  FILE* fin;
  err=fopen_s(&fin,files_[i].c_str(),"rb");
        if (err!=0)
        {
            errornum_=OPEN_FILE_ERROR;
        }
        char* Buf=new(std::nothrow) char[BUFFER_READ+1];
        if (Buf==NULL)
        {
            errornum_=LACK_OF_MEMORY;
            return false;
        }
  memset(Buf,0,BUFFER_READ+1);
  size_t ReadSize=fread(Buf,sizeof(char),BUFFER_READ,fin);
  while((ReadSize>0))
  {
         
   strTmp=base64.Encode((unsigned char*)Buf,ReadSize);
   if(send(socket_,strTmp.c_str(),strTmp.length(),0) == SOCKET_ERROR)
   {
                errornum_=WSA_SEND_ERROR;
    ReleaseSocket();
    return false; 
   }
   memset(Buf,0,BUFFER_READ+1);
   ReadSize=fread(Buf,1,BUFFER_READ,fin);
  }
  delete[] Buf;
  fclose(fin);
 } // end for

//界尾
 strTmp="--";
 strTmp+=BOUNDARY;
 strTmp+="--\r\n.\r\n";

if(send(socket_,strTmp.c_str(),strTmp.length(),0) == SOCKET_ERROR)
 {
        errornum_=WSA_SEND_ERROR;
  ReleaseSocket();
  return false;
 }
 if(!CheckResponse("250"))
    {
        errornum_=SERVER_NOT_READY;
        return false;
    }

//退出
 if(send(socket_,"QUIT\r\n",strlen("QUIT\r\n"),0) == SOCKET_ERROR)
 {
        errornum_=WSA_SEND_ERROR;
  ReleaseSocket();
  return false;
 }
 if(!CheckResponse("221"))
    {
        errornum_=COMMAND_QUIT;
        return false;
    }
 ReleaseSocket();
 return true;
}

email 邮件发送源代码(c++实现)相关推荐

  1. android javamail获取邮件太多太慢_java 实现 email 邮件发送最简单优雅的方式(网易 163 为例)

    如何使用IMAP服务? 首先介绍一些邮件发送的基础知识,如果你已经知道可以跳过. 直接到 Email 邮件发送实现的部分. IMAP是什么? IMAP,即Internet Message Access ...

  2. Bella Email邮件发送模板

    简介: Bella Email邮件发送模板是一款HTML5网站模板.aspku提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢. 下载地址: http://www.bytepan.com/X3 ...

  3. SpringBoot整合Email 邮件发送

    文章目录 一.准备 二.邮件发送需要的配置 获取163邮箱授权码 获取QQ邮箱授权码 YML配置 三.代码编写 普通邮件发送 HTML邮件发送 含静态资源邮件发送 带附件邮件发送 SpringBoot ...

  4. Email邮件发送设置 工具开发整理(网易邮箱、Mailgun为例) 下篇

    Email邮件设置(网易邮箱.Mailgun)  下篇 说明:STMP服务邮件发送工具类,其中包括文本发送.html发送.附件发送. 1.maven pom 配置 <dependency> ...

  5. Email邮件发送设置 工具开发整理(网易邮箱、Mailgun为例) 上篇

    Email邮件设置   工具开发整理(网易邮箱.Mailgun为例) 上篇 说明:Email邮件 国内国外设置 以网易邮箱和Mailgun为例,并开发工具类. 一.国内 网易邮箱设置  1.设置STM ...

  6. 【Python 应用篇】Email 邮件发送

    一.简单邮件发送 '''程序描述: 该脚本程序,用于完成简单的邮件发送功能 从文本文件中,提取内容,并发送给指定邮箱 ''' '''作者 = xxxxx ''' '''日期 = 2022.05.10 ...

  7. C# Email邮件发送,功能是密码找回或者重置功能。

    最近根据公司需求,写个邮件发送.   这里面的传入的地址信息的参数都是经过加密的.  主要是保证用户信息的安全. 帮助类   1 using System; 2 using System.Collec ...

  8. java email邮件发送465

    为什么使用465端口呢: 因为阿里云服务器以安全为由将25端口给封了,无法使用25号端口发送邮件,所以只有使用465端口啦. 实现java发送邮件的过程大体有以下几步: 1. 准备一个properti ...

  9. SpringBoot发送Email邮件-发送多人HTML邮件

    1.创建项目 当然也可以直接在pom文件加入依赖 <dependency><groupId>org.springframework.boot</groupId>&l ...

  10. php发送邮件函数,php发送Email邮件的函数示例

    在php中,使用自带的mail()函数来发送邮件,会存在很多不安全因素. 我们实现了如下的ae_send_mail函数,适用于PHP4.0.2或更高版本. ae_send_mail调用时只用四个参数: ...

最新文章

  1. hibernateTemplate的load方法
  2. Java 多线程三大核心
  3. [云炬创业管理笔记]第二章测试6
  4. 【强化学习】Policy Gradient原理
  5. Ubuntu 16.04 安装第三方Apps Can’t Install Third-Party Apps on Ubuntu 16.04? You’re No
  6. stm32读操作失败_STM32学习笔记—通信容易出错的情况
  7. 计算某天是星期几数字或文本形式的JAVA工具方法
  8. Atitit 数据记录存储方式 索引组织表 堆组织表 储方式 InnoDB 引擎把数据放在主键索引上,其他索引上保存的是主键 id。这种方式,我们称之为索引组织表(Index Organizi
  9. CLR中的程序集加载
  10. C语言程序设计题库(精心准备,内容丰富)
  11. wps如何对比两列数据找出不同
  12. scrcpy---Android投屏神器(使用教程)
  13. 关于ESD的一些知识
  14. python实现 数值 转换为 万,亿单位,保留3位小数(例:18000转换为1.8万)
  15. python语料库是什么,Python 语料库的搭建
  16. 1034 有理数四则运算
  17. 轻快pdf阅读器如何使用
  18. 谨以此文纪念我的大学四年
  19. Ubuntu的ldconfig详解(解决*.so不是符号连接)
  20. 百度网盘不能绑定QQ

热门文章

  1. video.js播放视频
  2. 【机器学习原理】SVM支持向量机分类算法
  3. Matlab实现图像识别(八)
  4. uniapp横竖屏切换
  5. 第九章第四节 流体压强与流速的关系
  6. html隐藏图片白色部分,css去掉gif透明图片的白边
  7. Java核心基础30天
  8. 臭氧9母带处理工具:iZotope Ozone 9 Advanced for Mac
  9. Python爬虫进行Web数据挖掘总结和分析 这是我见过最牛逼的教程
  10. 植物大战僵尸修改存档用户名、关卡、金钱说明