热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

C++实现含附件的邮件发送功能

这篇文章主要为大家详细介绍了C++实现含附件的邮件发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C++实现邮件发送程序在vs2013测试通过,一共3个文件,发邮件的程序封装为Csmtp 类。

1.测试用的主函数

//
#include "Csmtp.h"
#pragma comment(lib, "Kernel32.lib") 

int main()
{ 

 Csmtp mail(
  25,
  "smtp.126.com",
  "username@126.com",// 来源邮箱
  "pwd",
  "username@126.com" //目标邮箱
  );

 if (!mail.CReateSocket())
 {
  cout <<"ReateSocket failed!" <

2.Csmtp类定义

#include  
#include  
#include 
#include  

#include  //适用平台 Windows

#pragma comment(lib, "ws2_32.lib") /*链接ws2_32.lib动态链接库*/ 
 // POP3服务器(端口:110) Csmtp服务器(端口:25) 
using namespace std;
class Csmtp 
{ 

 int port; 
 string domain; 
 string user; 
 string pass; 
 string target; 
 string title; //邮件标题
 string content; //邮件内容


 HOSTENT* pHostent;
 SOCKET sockClient; //客户端的套接字
 vector  filename; //存储附件名的向量

public: 

 Csmtp( 
  int _port, //端口25
  string _domain,  //域名
  string _user,  //发送者的邮箱
  string _pass,  //密码
  string _target)  //目标邮箱
 :port(_port),domain(_domain),user(_user),pass(_pass), target(_target){};//内容 
 bool CReateSocket();
 void setTitle(string tem){title = tem;}
 void setContent(string tem){cOntent= tem;}

 int SendAttachment(SOCKET &sockClient);
 int SendMail();
 void addfile(string str){filename.push_back(str);}

}; 

3. Csmtp 类的实现

#include "Csmtp.h"
//#include //异常类
static const char base64Char[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
char* base64Encode(char const* origSigned, unsigned origLength) 
{ 
 unsigned char const* orig = (unsigned char const*)origSigned; // in case any input bytes have the MSB set 
 if (orig == NULL) return NULL; 

 unsigned const numOrig24BitValues = origLength / 3; 
 bool havePadding = origLength > numOrig24BitValues * 3; 
 bool havePadding2 = origLength == numOrig24BitValues * 3 + 2; 
 unsigned const numResultBytes = 4 * (numOrig24BitValues + havePadding); 
 char* result = new char[numResultBytes + 3]; // allow for trailing '/0' 

 // Map each full group of 3 input bytes into 4 output base-64 characters: 
 unsigned i; 
 for (i = 0; i > 2) & 0x3F]; 
  result[4 * i + 1] = base64Char[(((orig[3 * i] & 0x3) <<4) | (orig[3 * i + 1] >> 4)) & 0x3F]; 
  result[4 * i + 2] = base64Char[((orig[3 * i + 1] <<2) | (orig[3 * i + 2] >> 6)) & 0x3F]; 
  result[4 * i + 3] = base64Char[orig[3 * i + 2] & 0x3F]; 
 } 

 // Now, take padding into account. (Note: i == numOrig24BitValues) 
 if (havePadding) 
 { 
  result[4 * i + 0] = base64Char[(orig[3 * i] >> 2) & 0x3F]; 
  if (havePadding2) 
  { 
   result[4 * i + 1] = base64Char[(((orig[3 * i] & 0x3) <<4) | (orig[3 * i + 1] >> 4)) & 0x3F]; 
   result[4 * i + 2] = base64Char[(orig[3 * i + 1] <<2) & 0x3F]; 
  } 
  else 
  { 
   result[4 * i + 1] = base64Char[((orig[3 * i] & 0x3) <<4) & 0x3F]; 
   result[4 * i + 2] = '='; 
  } 
  result[4 * i + 3] = '='; 
 } 

 result[numResultBytes] = '\0'; 
 return result; 
} 


int Csmtp::SendAttachment(SOCKET &sockClient) /*发送附件*/ 
{ 
 for (std::vector::iterator iter = filename.begin();iter != filename.end(); iter++) 
 { 
  cout <<"Attachment is sending··· " <h_addr_list[i]!=NULL;i++) 
  {
   string tem = inet_ntoa(*(struct in_addr *)pHost->h_addr_list[i]);
   ip_list += tem;
   ip_list += "\n";
  } 
 } 
 else 
 { 
  cout<<"获取主机信息失败..."<h_addr_list[0]); //得到smtp服务器的网络字节序的ip地址  



 addrServer.sin_family = AF_INET; 
 addrServer.sin_port = htons(port); //连接端口25 
 //int connect (SOCKET s , const struct sockaddr FAR *name , int namelen );
 err = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); //向服务器发送请求 
 cout<<"connect:"<\r\nrcpt to:<"+target+">\r\n";
 send(sockClient, message.c_str(), message.length(), 0); 
 buff[recv(sockClient, buff, 500, 0)]='\0';
 //cout<<"mail from: "<

容易理解的简化版可以点击->这里

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
author-avatar
dfadsgafg4
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有