有偿服务。 c++ 获取 ews 邮件
1
cnbatch 2022-05-16 19:51:17 +08:00 1
有现成的库可以用:
https://github.com/otris/ews-cpp 仅仅用于发邮件、收邮件的话,基本够用。 如果是想用在内网环境,例如企业内网 EWS 服务器的话,有可能必须加上预处理宏 EWS_DISABLE_TLS_CERT_VERIFICATION 当然了,这个库跟微软自己的 C# 版的 EWS 库相比,差得远了 |
2
w20011025 OP 我先测试下,谢谢!
|
4
cnbatch 2022-05-18 16:12:50 +08:00 1
|
7
cnbatch 2022-05-20 01:38:26 +08:00 1
ge_message(id)之后可以获得每个 message ,而每个 message 可以用 get_body()获取 HTML 内容,或者用 to_xml()获取原始 XML 内容。至于获取后怎么解析,那得自己找 HTML 解析工具。
至于图片,其实每个内嵌图片都是内联附件,messge.get_attachments()可以获取完整附件列表,包括内联附件和普通附件。内联附件用 is_inline()可以判断出来。 只不过 ews-cpp 的兼容性有限,未必能正确读取附件内容。 微软自家 C# 版本 EWS 库兼容性好得多,功能也多得多,只不过它也不能干 HTML parse 的工作,拿到邮件内容后也只能把邮件各部分内容提取出来,步骤也是类似的,顶多提取成功率比 ews-cpp 高得多,API 也多一些。 在 IDE 里面对着各种函数都不妨试一试,只要不是写操作,都不会有什么影响。 |
8
w20011025 OP 我先继续测试下 ews 。
c++ gsoap xml ,直接读取 ews ?这个实现是不是功能都齐全了? |
10
cnbatch 2022-05-25 02:24:18 +08:00 1
gsoap XML 操控 ews 实在太弯弯绕绕了,而且由于许可证原因( GPLv2+商业授权),我没法在我所在的公司环境内测试。
我用以下代码在公司环境里发送图片附件,试过了没问题。用的是 ews 自己的测试代码+小修改: //const auto env = ews::test::environment(); //由于我会指定内部 ews 服务器,所以注释掉 env auto service = ews::service("https:// *********", "", "",""); // 我所在的公司启用了 SSO ,所以不用输入用户名和密码 auto message = ews::message(); auto mail_subject = "Test mail from application"; message.set_subject(mail_subject); std::vector<ews::mailbox> recipients; recipients.push_back(ews::mailbox("[email protected]")); message.set_to_recipients(recipients); auto text = ews::body("Welcome!\n\nThis is a test.\n"); message.set_body(text); auto mail_attachment = ews::attachment::from_file(R"(D:\picture.png))"); // 自己指定文件路径 auto mail_id = service.create_item(message, ews::message_disposition::save_only); service.create_attachment(mail_id, mail_attachment); auto search_expression = ews::is_equal_to(ews::item_property_path::has_attachments, true); ews::distinguished_folder_id drafts = ews::standard_folder::drafts; auto ids = service.find_item(drafts, search_expression); for (auto &ids : ids) { auto msg = service.get_message(ids); for (auto &reciver : msg.get_to_recipients()) { std::cout << reciver.value() << "\n"; // 收件人邮箱逐个显示出来 } if (msg.get_subject() == mail_subject) { service.send_item(id); break; } } 先用纯英文字符的内容去试。 |
11
cnbatch 2022-05-25 02:29:10 +08:00 1
如果要发送中文电邮,假设用的是 Visual Studio 做开发环境,那么需要以下更改:
1 、cpp 源代码文件的编码需要设置成 UTF-8 (文件->另存为->“保存”按钮旁边的三角形->编码保存->UTF-8 ) 2 、打开项目属性,按照这个说明改设置: https://docs.microsoft.com/zh-cn/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8 |
12
cnbatch 2022-05-25 02:37:41 +08:00 1
啊,不好意思,mail_attachment 我忘了补全进来。
auto mail_attachment = ews::attachment::from_file(R"(D:\picture.png))", "image/png", "picture.png"); 第二个参数可以按照注释的指引,在注册表里面找 |
13
w20011025 OP @cnbatch ,直接收邮件,获取收件人信箱名字,都是自己的信箱名字???获取发件人信箱地址?如何获取发件人信箱地址?
|
15
cnbatch 2022-05-25 18:06:05 +08:00 1
不清楚你的环境是怎么样,我在公司内部试过是可以获取发件人,唯一例外的情况是发件人以共享邮箱的身份发邮件
如果是普通的发送方式,是可以正确获取的,就以 find_unread_messages.cpp 为例修改: 原文件的 for (const auto& id : item_ids) 里面的内容,改为 for (const auto& id : item_ids) { auto msg = service.get_message(id); auto mail_address = msg.get_from(); std::cout << mail_address.value() << "\n"; } |
16
cnbatch 2022-05-25 18:06:39 +08:00 1
|
17
w20011025 OP 目前,问题就是完整解析正文内容问题了。
发送页面图片,接收解析页面图片问题了。 |
18
w20011025 OP |