C++解码电子邮件的主题

标签 c++ email decoding pop3 poco-libraries

我用 Poco/Net/POP3ClientSession 下载邮件,我想将电子邮件主题转换为人类可读的,所以我尝试使用 neagoegab's来自这里的解决方案: https://stackoverflow.com/a/8104496/1350091 不幸的是它不起作用:

#include <Poco/Net/POP3ClientSession.h>
#include <Poco/Net/MailMessage.h>
#include <iostream>
#include <string>
using namespace std;
using namespace Poco::Net;


#include <iconv.h>

const size_t BUF_SIZE=1024;


class IConv {
    iconv_t ic_;
public:
    IConv(const char* to, const char* from)
        : ic_(iconv_open(to,from))    { }
    ~IConv() { iconv_close(ic_); }

     bool convert(char* input, char* output, size_t& out_size) {
        size_t inbufsize = strlen(input)+1;
        return iconv(ic_, &input, &inbufsize, &output, &out_size);
     }
};


int main()
{
    POP3ClientSession session("poczta.o2.pl");
    session.login("my mail", "my password");

    POP3ClientSession::MessageInfoVec messages;
    session.listMessages(messages);
    cout << "id: " << messages[0].id << " size: " << messages[0].size << endl;

    MailMessage message;
    session.retrieveMessage(messages[0].id, message);
    const string subject = message.getSubject();


    cout << "Original subject: " << subject << endl;

    IConv iconv_("UTF8","ISO-8859-2");


    char from[BUF_SIZE];// "=?ISO-8859-2?Q?Re: M=F3j sen o JP II?=";
    subject.copy(from, sizeof(from));
    char to[BUF_SIZE] = "bye";
    size_t outsize = BUF_SIZE;//you will need it

    iconv_.convert(from, to, outsize);
    cout << "converted: " << to << endl;
}

输出是:

id: 1 size: 2792
Original subject: =?ISO-8859-2?Q?Re: M=F3j sen o JP II?=
converted: =?ISO-8859-2?Q?Re: M=F3j sen o JP II?=

有趣的是,当我尝试使用 POCO 转换主题时,它失败了:

cout << "Encoded with POCO: " << MailMessage::encodeWord("Re: Mój sen o JP II", "ISO-8859-2") << endl; // output: Encoded with POCO: =?ISO-8859-2?q?Re=3A_M=C3=B3j_sen_o_JP_II?=

但是我要接收的主题是: “回复:Mój sen o JP II” 我发现转换主题的唯一成功方法是: https://docs.python.org/2/library/email.header.html#email.header.decode_header

所以我的问题是 - 如何将 C++ 中的电子邮件主题转换为 UTF-8 等格式?

最佳答案

与您的情况相关的 RFC 是 RFC 2047 .该 RFC 指定了非 ASCII 数据应如何在邮件消息中编码。基本要点是除了可打印的 ASCII 字符之外的所有字节都被转义为“=”字符后跟两个十六进制数字。由于“ó”在 ISO-8859-2 中由字节 0xF3 表示,而 0xF3 不是可打印的 ASCII 字符,因此它被编码为“=F3”。您需要对邮件中的所有编码字符进行解码。

关于C++解码电子邮件的主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41422934/

相关文章:

c++ - 自定义内存分配器示例(需要一些说明)

c++ - 字符串大小保持为零

php - Symfony6如何正确配置sendmail从本地主机发送电子邮件

PHP imap_search 收件箱/已发送项目

c++ - DirectShow 通用媒体解码器

iphone - FFmpeg 解码 H264 视频太慢

encoding - 维特比解码器

c++ - 将文件中的行输入到 char 数组中

c++ - (x+1) > x 如何评估为 0 和 1?

python - 通过邮件发送创建的绘图