开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1176|回复: 19
收起左侧

[其它源码] SMTP通信 简单邮件发送源码

[复制链接]
结帖率:89% (79/89)
发表于 2024-6-22 09:27:09 | 显示全部楼层 |阅读模式   江苏省苏州市
分享源码
界面截图: -
是否带模块: -
备注说明: -
本帖最后由 z13228604287 于 2024-6-22 09:28 编辑

[C++] 纯文本查看 复制代码
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
typedef int socklen_t;
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
typedef int SOCKET;
#endif

class SMTPClient {
public:
    // 构造函数,初始化服务器地址和端口
    SMTPClient(const std::string& server, int port) : server(server), port(port) {
#ifdef _WIN32
        WSADATA wsaData;
        WSAStartup(MAKEWORD(2, 2), &wsaData); // 初始化Winsock
#endif
    }

    // 析构函数,清理Winsock
    ~SMTPClient() {
#ifdef _WIN32
        WSACleanup();
#endif
    }

    // 连接到SMTP服务器
    bool connectToServer() {
        struct addrinfo hints, * res;
        memset(&hints, 0, sizeof(hints));
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;

        int status = getaddrinfo(server.c_str(), std::to_string(port).c_str(), &hints, &res);
        if (status != 0) {
            std::cerr << "错误:无法解析主机名. " << gai_strerror(status) << std::endl;
            return false;
        }

        sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
        if (sock == INVALID_SOCKET) {
            std::cerr << "错误:无法创建套接字." << std::endl;
            freeaddrinfo(res);
            return false;
        }

        // 连接到服务器
        if (::connect(sock, res->ai_addr, res->ai_addrlen) == SOCKET_ERROR) {
            std::cerr << "错误:无法连接到服务器." << std::endl;
            freeaddrinfo(res);
            return false;
        }

        freeaddrinfo(res);
        return true;
    }

    //// 发送邮件
    //void sendMail(const std::string& from, const std::vector<std::string>& to, const std::string& subject, const std::string& body) {
    //    std::string msg = "EHLO localhost\r\n"; // 向服务器发送EHLO命令
    //    send(msg);
    //    recv();

    //    msg = "MAIL FROM:<" + from + ">\r\n"; // 发送MAIL FROM命令
    //    send(msg);
    //    recv();

    //    for (const auto& recipient : to) {
    //        msg = "RCPT TO:<" + recipient + ">\r\n"; // 发送RCPT TO命令
    //        send(msg);
    //        recv();
    //    }

    //    msg = "DATA\r\n"; // 发送DATA命令
    //    send(msg);
    //    recv();

    //    // 组装邮件内容
    //    msg = "Subject: " + subject + "\r\n";
    //    msg += "To: ";
    //    for (const auto& recipient : to) {
    //        msg += recipient + ";";
    //    }
    //    msg += "\r\n";
    //    msg += "\r\n" + body + "\r\n.\r\n";
    //    send(msg);
    //    recv();

    //    msg = "QUIT\r\n"; // 发送QUIT命令
    //    send(msg);
    //    recv();
    //}

    // 发送邮件
    void sendMail(const std::string& from, const std::vector<std::string>& to, const std::string& subject, const std::string& body) {
        std::string msg = "EHLO localhost\r\n";
        send(msg);
        recv();

        msg = "MAIL FROM:<" + from + ">\r\n";
        send(msg);
        recv();

        for (const auto& recipient : to) {
            msg = "RCPT TO:<" + recipient + ">\r\n";
            send(msg);
            recv();
        }

        msg = "DATA\r\n";
        send(msg);
        recv();

        msg = "Subject: " + subject + "\r\n";
        msg += "To: ";
        for (const auto& recipient : to) {
            msg += recipient + ";";
        }
        msg += "\r\n";
        msg += "Content-Type: text/html; charset=GB2312\r\n";
        msg += "\r\n" + body + "\r\n.\r\n";
        send(msg);
        recv();

        msg = "QUIT\r\n";
        send(msg);
        recv();
    }




private:
    std::string server;
    int port;
    SOCKET sock;

    // 发送数据
    void send(const std::string& data) {
        ::send(sock, data.c_str(), data.length(), 0);
    }

    // 接收服务器响应
    void recv() {
        char buffer[1024];
        int len = ::recv(sock, buffer, sizeof(buffer) - 1, 0);
        if (len > 0) {
            buffer[len] = '\0';
            std::cout << buffer; // 打印服务器响应
        }
    }
};

int main() {
    SMTPClient client("***.***.com", 25); // 初始化SMTP客户Duan
    if (client.connectToServer()) { // 连接到服务器

        // HTML格式的邮件内容
        std::string body = R"(
        <html>
        <head>
            <title>Test Email</title>
        </head>
        <body>
            <h1>This is a Test Email</h1>
            <p>演示 <strong>HTML</strong> content.</p>
            <p style="color: red;">This is a red paragraph.</p>
        </body>
        </html>
        )";


        client.sendMail("zhikongzhongxin@*******.com", { "Yong.Han@******.com" }, "Test Email", body); // 发送邮件
    }
    return 0;
}


评分

参与人数 3精币 +3 收起 理由
文西哥 + 1 支持开源~!感谢分享
財財 + 1 感谢分享,很给力!~
abc669 + 1 感谢分享,很给力!~

查看全部评分


发表于 2024-8-30 21:23:46 | 显示全部楼层   广西壮族自治区北海市
感谢分享。
回复 支持 反对

使用道具 举报

发表于 2024-8-22 09:48:43 | 显示全部楼层   湖北省武汉市
值得阅读学习
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 15 天

发表于 2024-6-25 13:04:15 | 显示全部楼层   广西壮族自治区柳州市
感谢分享源码
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 20 天

发表于 2024-6-25 11:11:55 | 显示全部楼层   江西省上饶市
值得试试
回复 支持 反对

使用道具 举报

结帖率:94% (295/314)

签到天数: 12 天

发表于 2024-6-25 09:39:19 | 显示全部楼层   内蒙古自治区乌海市
测试看看,感谢了
回复 支持 反对

使用道具 举报

结帖率:94% (295/314)

签到天数: 12 天

发表于 2024-6-24 10:35:48 | 显示全部楼层   内蒙古自治区乌海市
感谢分享。。。。
回复 支持 反对

使用道具 举报

签到天数: 20 天

发表于 2024-6-23 16:42:56 | 显示全部楼层   广东省揭阳市
新技能已get√
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 15 天

发表于 2024-6-23 11:02:29 | 显示全部楼层   山东省威海市
这个数用什么 ide 写的c++代码
回复 支持 反对

使用道具 举报

结帖率:50% (7/14)

签到天数: 11 天

发表于 2024-6-23 10:23:40 | 显示全部楼层   安徽省淮北市
感谢分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表