重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
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!" << endl; return -1;// } mail.setTitle("test mail"); mail.setContent("this is content."); mail.addfile("test1.png"); //添加附件 mail.addfile("test2.png"); //添加附件 mail.SendMail(); //类主函数 return 0; }
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 < numOrig24BitValues; ++i) { result[4 * i + 0] = base64Char[(orig[3 * 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··· " << endl; string path=*iter; ifstream ifs(path, ios::in | ios::binary); //'或链接2个属性,以输入、二进制打开' if (false == ifs.is_open()) { cout<<"无法打开文件!"< 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: "<
容易理解的简化版可以点击->这里
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持创新互联。