C++實現郵件發送功能

一、C++郵件發送功能

C++實現郵件發送功能需要藉助第三方庫,比如Poco、OpenSSL等。使用這些庫,可以通過SMTP協議在C++代碼中嵌入發送郵件的功能,也可以在代碼中直接調用郵件發送接口。以下是基於Poco庫實現的C++郵件發送示例:

#include <Poco/Net/MailMessage.h>
#include <Poco/Net/SMTPClientSession.h>
#include <Poco/Net/StringPartSource.h>

using namespace Poco::Net;

int main(int argc, char** argv)
{
    // 從控制台參數中讀取郵件發送參數
    std::string smtpServer = argv[1];
    std::string sender = argv[2];
    std::string recipient = argv[3];
    std::string subject = argv[4];
    std::string content = argv[5];
    
    // 構造郵件消息對象
    MailMessage message;
    message.setSender(sender);
    message.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, recipient));
    message.setSubject(subject);
    message.setContentType("text/plain; charset=UTF-8");
    message.setContent(content, MailMessage::ENCODING_8BIT);
    
    // 構造SMTP客戶端會話對象
    SMTPClientSession smtpSession(smtpServer);
    smtpSession.login();
    smtpSession.sendMessage(message);
    smtpSession.close();
    
    return 0;
}

二、郵件發送功能流程圖

郵件發送功能流程圖如下:

三、Excel郵件發送功能

將Excel表格轉換成郵件並發送也是常見的郵件發送需求。可以使用LibXL等第三方Excel操作庫實現這一功能。以下是基於LibXL實現的Excel郵件發送示例:

#include <xl.h>
#include <Poco/Net/MailMessage.h>
#include <Poco/Net/SMTPClientSession.h>

using namespace Poco::Net;

int main(int argc, char** argv)
{
    // 從控制台參數中讀取郵件發送參數
    std::string smtpServer = argv[1];
    std::string sender = argv[2];
    std::string recipient = argv[3];
    std::string subject = argv[4];
    std::string fileName = argv[5];
    
    // 打開Excel表格
    BookHandle book = xlCreateBook();
    if (book)
    {
        if (xlBookLoad(book, fileName.c_str()))
        {
            SheetHandle sheet = xlBookGetSheet(book, 0);
            if (sheet)
            {
                int numRows = xlSheetLastRow(sheet);
                int numCols = xlSheetLastCol(sheet);
                std::string content;
                for (int r = 0; r < numRows; ++r)
                {
                    for (int c = 0; c < numCols; ++c)
                    {
                        content += xlSheetReadStr(sheet, r, c, NULL) + "\t";
                    }
                    content += "\n";
                }
                
                // 構造郵件消息對象並發送
                MailMessage message;
                message.setSender(sender);
                message.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, recipient));
                message.setSubject(subject);
                message.setContentType("text/plain; charset=UTF-8");
                message.setContent(content, MailMessage::ENCODING_8BIT);
                
                SMTPClientSession smtpSession(smtpServer);
                smtpSession.login();
                smtpSession.sendMessage(message);
                smtpSession.close();
            }
        }
        xlBookRelease(book);
    }
    
    return 0;
}

四、Word郵件發送功能

將Word文檔轉換成郵件並發送也是常見的郵件發送需求。可以使用Aspose Words等第三方Word操作庫實現這一功能。以下是基於Aspose Words實現的Word郵件發送示例:

#include <Aspose.Words.Cpp/Model/Document/Document.h>
#include <Poco/Net/MailMessage.h>
#include <Poco/Net/SMTPClientSession.h>
#include <Poco/Net/StringPartSource.h>

using namespace Aspose::Words;
using namespace Poco::Net;

int main(int argc, char** argv)
{
    // 從控制台參數中讀取郵件發送參數
    std::string smtpServer = argv[1];
    std::string sender = argv[2];
    std::string recipient = argv[3];
    std::string subject = argv[4];
    std::string fileName = argv[5];
    
    // 打開Word文檔並讀取內容
    std::unique_ptr doc(new Document(fileName));
    std::string content = doc->get_OriginalFileName();
    
    // 構造郵件消息對象並發送
    MailMessage message;
    message.setSender(sender);
    message.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, recipient));
    message.setSubject(subject);
    message.setContentType("text/plain; charset=UTF-8");
    message.setContent(content, MailMessage::ENCODING_8BIT);
    
    SMTPClientSession smtpSession(smtpServer);
    smtpSession.login();
    smtpSession.sendMessage(message);
    smtpSession.close();
    
    return 0;
}

五、Spring Boot郵件發送功能

與C++不同,Java有自帶的郵件發送功能,可以直接使用JavaMail API實現郵件發送。在Spring Boot項目中,可以使用Spring Framework郵件發送模塊簡化郵件發送功能的實現。以下是基於Spring郵件發送模塊實現的郵件發送示例:

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import java.util.Properties;

public class DemoApplication
{
    public static void main(String[] args)
    {
        // 讀取郵件發送參數
        String smtpServer = args[0];
        String sender = args[1];
        String recipient = args[2];
        String subject = args[3];
        String content = args[4];
        
        // 構造郵件發送客戶端對象
        JavaMailSender mailSender = new JavaMailSenderImpl();
        Properties properties = new Properties();
        properties.setProperty("mail.smtp.host", smtpServer);
        mailSender.setJavaMailProperties(properties);
        
        // 構造郵件消息對象並發送
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(sender);
        message.setTo(recipient);
        message.setSubject(subject);
        message.setText(content);
        mailSender.send(message);
    }
}

六、代碼完整示例

以下是C++實現郵件發送功能的完整示例代碼,其中包括了C++、Excel、Word三個功能的實現:

#include <xl.h>
#include <Aspose.Words.Cpp/Model/Document/Document.h>
#include <Poco/Net/MailMessage.h>
#include <Poco/Net/SMTPClientSession.h>
#include <Poco/Net/StringPartSource.h>

using namespace Poco::Net;

void sendMail(const std::string& smtpServer, const std::string& sender, const std::string& recipient, const std::string& subject, const std::string& content)
{
    MailMessage message;
    message.setSender(sender);
    message.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, recipient));
    message.setSubject(subject);
    message.setContentType("text/plain; charset=UTF-8");
    message.setContent(content, MailMessage::ENCODING_8BIT);
    
    SMTPClientSession smtpSession(smtpServer);
    smtpSession.login();
    smtpSession.sendMessage(message);
    smtpSession.close();
}

void sendExcel(const std::string& smtpServer, const std::string& sender, const std::string& recipient, const std::string& subject, const std::string& fileName)
{
    BookHandle book = xlCreateBook();
    if (book)
    {
        if (xlBookLoad(book, fileName.c_str()))
        {
            SheetHandle sheet = xlBookGetSheet(book, 0);
            if (sheet)
            {
                int numRows = xlSheetLastRow(sheet);
                int numCols = xlSheetLastCol(sheet);
                std::string content;
                for (int r = 0; r < numRows; ++r)
                {
                    for (int c = 0; c < numCols; ++c)
                    {
                        content += xlSheetReadStr(sheet, r, c, NULL) + "\t";
                    }
                    content += "\n";
                }
                
                sendMail(smtpServer, sender, recipient, subject, content);
            }
        }
        xlBookRelease(book);
    }
}

void sendWord(const std::string& smtpServer, const std::string& sender, const std::string& recipient, const std::string& subject, const std::string& fileName)
{
    std::unique_ptr<Aspose::Words::Document> doc(new Aspose::Words::Document(fileName));
    std::string content = doc->get_OriginalFileName();
    sendMail(smtpServer, sender, recipient, subject, content);
}

int main(int argc, char** argv)
{
    std::string smtpServer = argv[1];
    std::string sender = argv[2];
    std::string recipient = argv[3];
    std::string subject = argv[4];
    std::string fileName = argv[5];
    
    std::string extension = fileName.substr(fileName.find_last_of(".") + 1);
    if (extension == "xls" || extension == "xlsx")
    {
        sendExcel(smtpServer, sender, recipient, subject, fileName);
    }
    else if (extension == "doc" || extension == "docx")
    {
        sendWord(smtpServer, sender, recipient, subject, fileName);
    }
    else
    {
        std::ifstream ifs(fileName);
        std::string content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
        sendMail(smtpServer, sender, recipient, subject, content);
    }
    
    return 0;
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/295859.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-27 12:57
下一篇 2024-12-27 12:57

相關推薦

  • Java和Python哪個功能更好

    對於Java和Python這兩種編程語言,究竟哪一種更好?這個問題並沒有一個簡單的答案。下面我將從多個方面來對Java和Python進行比較,幫助讀者了解它們的優勢和劣勢,以便選擇…

    編程 2025-04-29
  • Python每次運行變量加一:實現計數器功能

    Python編程語言中,每次執行程序都需要定義變量,而在實際開發中常常需要對變量進行計數或者累加操作,這時就需要了解如何在Python中實現計數器功能。本文將從以下幾個方面詳細講解…

    編程 2025-04-28
  • Python strip()函數的功能和用法用法介紹

    Python的strip()函數用於刪除字符串開頭和結尾的空格,包括\n、\t等字符。本篇文章將從用法、功能以及與其他函數的比較等多個方面對strip()函數進行詳細講解。 一、基…

    編程 2025-04-28
  • 全能的wpitl實現各種功能的代碼示例

    wpitl是一款強大、靈活、易於使用的編程工具,可以實現各種功能。下面將從多個方面對wpitl進行詳細的闡述,每個方面都會列舉2~3個代碼示例。 一、文件操作 1、讀取文件 fil…

    編程 2025-04-27
  • SOXER: 提供全面的音頻處理功能的命令行工具

    SOXER是一個命令行工具,提供了強大、靈活、全面的音頻處理功能。同時,SOXER也是一個跨平台的工具,支持在多個操作系統下使用。在本文中,我們將深入了解SOXER這個工具,並探討…

    編程 2025-04-27
  • nobranchesreadyforupload功能詳解

    nobranchesreadyforupload是一個Git自動化工具,能夠在本地Git存儲庫中查找未提交的更改並提交到指定的分支。 一、檢查新建文件是否被提交 Git存儲庫中可能…

    編程 2025-04-25
  • Win FTP:一個功能全面的FTP客戶端

    一、Win FTP的介紹 Win FTP是一款基於Windows系統的FTP客戶端,它具有簡單易用、功能齊全、易於配置等特點。Win FTP的使用範圍非常廣泛,可以用於在本地計算機…

    編程 2025-04-24
  • 全能FTP開發工程師分享:FTP功能介紹與實現

    一、FTP基礎知識 FTP(File Transfer Protocol)是一種傳輸文件的協議,基於客戶機/服務器模式,通過可靠的TCP連接進行數據傳輸。FTP包括兩個部分:FTP…

    編程 2025-04-24
  • Chrome同步功能詳解

    Chrome是一款非常受歡迎的瀏覽器,不僅擁有快速穩定的瀏覽速度,還有很多實用的功能,其中同步功能就是它的一大特色之一。Chrome同步可以讓用戶將自己的瀏覽器設置、書籤等信息在不…

    編程 2025-04-24
  • Java中的休眠功能

    一、為什麼需要使用休眠 休眠可以讓線程暫停執行一段時間,以處理一些需要延時的操作。在需要等待某些任務完成後繼續執行、控制資源訪問頻率、節省系統資源等方面都很有用。 二、Java中的…

    編程 2025-04-24

發表回復

登錄後才能評論