【发布时间】:2017-05-16 07:56:11
【问题描述】:
我已经使用 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,编码。我记得邮件和 NNTP 消息使用略有不同的约定。
-
@Alf 在自己编写任何代码之前,请研究是否有人已经为您完成了这项工作。尤其是对于已建立的 RFC,有很多现有的实现。
-
从技术上讲,这些空格不符合编码词的规范,但是,任何真正的库都应该处理它们。
-
The issue has been fixed. 于 2017 年 11 月。您现在应该更新到 1.9.0 并简化您的代码。
标签: c++ email decoding pop3 poco-libraries