热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[C++]使用SMTP发送邮件

说明1:邮箱所使用的密码必须是第三方登录密码,而不是邮箱的初始密码,否则登录不了SMTP服务器说明2:使用Telnet的方

说明1:邮箱所使用的密码必须是第三方登录密码,而不是邮箱的初始密码,否则登录不了SMTP服务器

说明2:使用Telnet的方式登录,具体可以了解一下Telnet登录smtp服务器的方式

说明3:win10也有Telnet登录方式,只不过默认是关闭的,具体如何开启网上很多教程

SendMail.h

#ifndef CSENDMAIL_H
#define CSENDMAIL_H#include
#include
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
using namespace std;#define SLEEPTIME 500class CSendMail
{
public:CSendMail();~CSendMail();bool SetSMTP(string address, int port);//登录bool LoginSMTP(string Email,string Password);//设置发送目标,邮箱,标题,内容,是否有附件bool SetTargetEmail(string Email, string title, string body, bool enclosure=false);设置附件路径bool SetEnclPath(vectorfilename);//发送bool Send();
protected:int GetError(int flags=0);bool SendEnclosure();
private:string m_UserEMail;string m_PassWord;string m_STMPAddress;int m_STMPPort;bool m_Login;vector m_Filename;/*---------------Socket------------*/WSADATA m_Wsadata;sockaddr_in m_STMPAddr;SOCKET m_SMTPSocket;
};#endif /* CSENDMAIL_H */

SendMail.cpp

#include "stdafx.h"
#include "SendMail.h"static const char base64Char[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";CSendMail::CSendMail()
{//测试使用126,如有需要后面再更改m_STMPAddress = "smtp.126.com";//很多邮箱的默认端口都是25m_STMPPort = 25;m_Login = false;}
CSendMail::~CSendMail()
{}
//base64加密
char* base64Encode(char const* origSigned, unsigned origLength)
{unsigned char const* orig &#61; (unsigned char const*)origSigned; // in case any input bytes have the MSB set if (orig &#61;&#61; NULL) return NULL;unsigned const numOrig24BitValues &#61; origLength / 3;bool havePadding &#61; origLength > numOrig24BitValues * 3;bool havePadding2 &#61; origLength &#61;&#61; numOrig24BitValues * 3 &#43; 2;unsigned const numResultBytes &#61; 4 * (numOrig24BitValues &#43; havePadding);char* result &#61; new char[numResultBytes &#43; 3]; // allow for trailing &#39;/0&#39; // Map each full group of 3 input bytes into 4 output base-64 characters: unsigned i;for (i &#61; 0; i > 2) & 0x3F];result[4 * i &#43; 1] &#61; base64Char[(((orig[3 * i] & 0x3) <<4) | (orig[3 * i &#43; 1] >> 4)) & 0x3F];result[4 * i &#43; 2] &#61; base64Char[((orig[3 * i &#43; 1] <<2) | (orig[3 * i &#43; 2] >> 6)) & 0x3F];result[4 * i &#43; 3] &#61; base64Char[orig[3 * i &#43; 2] & 0x3F];}// Now, take padding into account. (Note: i &#61;&#61; numOrig24BitValues) if (havePadding){result[4 * i &#43; 0] &#61; base64Char[(orig[3 * i] >> 2) & 0x3F];if (havePadding2){result[4 * i &#43; 1] &#61; base64Char[(((orig[3 * i] & 0x3) <<4) | (orig[3 * i &#43; 1] >> 4)) & 0x3F];result[4 * i &#43; 2] &#61; base64Char[(orig[3 * i &#43; 1] <<2) & 0x3F];}else{result[4 * i &#43; 1] &#61; base64Char[((orig[3 * i] & 0x3) <<4) & 0x3F];result[4 * i &#43; 2] &#61; &#39;&#61;&#39;;}result[4 * i &#43; 3] &#61; &#39;&#61;&#39;;}result[numResultBytes] &#61; &#39;\0&#39;;return result;
}
bool CSendMail::SetSMTP(string address, int port)
{return true;
}
int CSendMail::GetError(int flags)
{Sleep(SLEEPTIME);char buff[10240];//有时候错误返回比较长&#xff0c;多留点空间int len &#61; recv(m_SMTPSocket, buff, 10240, 0);if (len <0)return len;buff[len] &#61; 0;string data &#61; buff;printf("%s\n", buff);int iRe &#61; atoi(data.substr(0, 3).c_str());return iRe;
}
bool CSendMail::LoginSMTP(string Email, string Password)
{if (Email.empty() || Password.empty())return false;m_UserEMail &#61; Email;m_PassWord &#61; Password;if (WSAStartup(MAKEWORD(2, 0), &m_Wsadata) !&#61; 0){//cout <<"StartUp WSA Failed" <h_addr_list[0], hptr->h_length);//printf("IP of smpt.126.com is : %d:%d:%d:%d", m_STMPAddr.sin_addr.S_un.S_un_b.s_b1, m_STMPAddr.sin_addr.S_un.S_un_b.s_b2, m_STMPAddr.sin_addr.S_un.S_un_b.s_b3, m_STMPAddr.sin_addr.S_un.S_un_b.s_b4);//链接if (connect(m_SMTPSocket, (sockaddr*)&m_STMPAddr, sizeof(m_STMPAddr))&#61;&#61;SOCKET_ERROR ){//cout <<"connect failed!" <}
bool CSendMail::SetEnclPath(vectorfilename)
{m_Filename.clear();for (int i &#61; 0; i }
bool CSendMail::SetTargetEmail(string Email, string title, string body, bool enclosure)
{if (!m_Login)return false;string bufferMailFrom&#61; "mail from:<" &#43; m_UserEMail &#43; ">\r\n";send(m_SMTPSocket, bufferMailFrom.c_str(), strlen(bufferMailFrom.c_str()), 0);if (GetError() !&#61; 250){cout <<"SetTargetEmail failed!" <\r\n";send(m_SMTPSocket, bufferRcptTo.c_str(), strlen(bufferRcptTo.c_str()), 0);if (GetError() !&#61; 250){cout <<"SetTargetEmail failed!" <}
bool CSendMail::SendEnclosure()
{if (!m_Login)return false;for (int i &#61; 0; i}
bool CSendMail::Send()
{if (!m_Login)return false;char bufferPoint[] &#61; "--&#64;boundary&#64;--End--\r\n.\r\n";send(m_SMTPSocket, bufferPoint, strlen(bufferPoint), 0);//if (GetError(1) !&#61; 250)//{// cout <<"Send failed!" <}

 


推荐阅读
  • 题目要求维护一个数列,并支持两种操作:一是查询操作,语法为QL,用于查询数列末尾L个数中的最大值;二是更新操作,用于修改数列中的某个元素。本文通过ST表(Sparse Table)优化查询效率,确保在O(1)时间内完成查询,同时保持较低的预处理时间复杂度。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 本文深入解析了 Kuangbin 数学训练营中的经典问题——Ekka Dokka,并通过详细的代码示例和数学推导,探讨了该问题的多种解法及其应用场景。通过对算法的优化和扩展,本文旨在为读者提供全面的理解和实用的参考。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • Objective-C 中的委托模式详解与应用 ... [详细]
author-avatar
桑语敬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有