c++ gsoap ews exchange API sendmail getmail

2022-05-16 17:52:15 +08:00
 w20011025

有偿服务。 c++ 获取 ews 邮件

1556 次点击
所在节点    C++
18 条回复
cnbatch
2022-05-16 19:51:17 +08:00
有现成的库可以用:
https://github.com/otris/ews-cpp

仅仅用于发邮件、收邮件的话,基本够用。

如果是想用在内网环境,例如企业内网 EWS 服务器的话,有可能必须加上预处理宏 EWS_DISABLE_TLS_CERT_VERIFICATION

当然了,这个库跟微软自己的 C# 版的 EWS 库相比,差得远了
w20011025
2022-05-17 07:07:01 +08:00
我先测试下,谢谢!
w20011025
2022-05-17 17:43:47 +08:00
@cnbatch 收邮件没看到示例里面有?示例里有收邮件示例吗?谢谢
cnbatch
2022-05-18 16:12:50 +08:00
w20011025
2022-05-19 10:44:49 +08:00
留个联系信箱感谢下,谢谢 !
@cnbatch
w20011025
2022-05-19 22:29:11 +08:00
@cnbatch 邮件正文部分内容,还有图片如何接收解析?
cnbatch
2022-05-20 01:38:26 +08:00
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 里面对着各种函数都不妨试一试,只要不是写操作,都不会有什么影响。
w20011025
2022-05-20 10:34:17 +08:00
我先继续测试下 ews 。

c++ gsoap xml ,直接读取 ews ?这个实现是不是功能都齐全了?
w20011025
2022-05-25 00:17:32 +08:00
@cnbatch ,发送图片附件一直失败?还有不能获取收件人邮箱??
cnbatch
2022-05-25 02:24:18 +08:00
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("president@example.com"));
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;
}
}

先用纯英文字符的内容去试。
cnbatch
2022-05-25 02:29:10 +08:00
如果要发送中文电邮,假设用的是 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
cnbatch
2022-05-25 02:37:41 +08:00
啊,不好意思,mail_attachment 我忘了补全进来。

auto mail_attachment = ews::attachment::from_file(R"(D:\picture.png))", "image/png", "picture.png");

第二个参数可以按照注释的指引,在注册表里面找
w20011025
2022-05-25 09:57:00 +08:00
@cnbatch ,直接收邮件,获取收件人信箱名字,都是自己的信箱名字???获取发件人信箱地址?如何获取发件人信箱地址?
w20011025
2022-05-25 12:10:26 +08:00
获取收件箱,发件人信箱地址?
@cnbatch
cnbatch
2022-05-25 18:06:05 +08:00
不清楚你的环境是怎么样,我在公司内部试过是可以获取发件人,唯一例外的情况是发件人以共享邮箱的身份发邮件

如果是普通的发送方式,是可以正确获取的,就以 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";
}
cnbatch
2022-05-25 18:06:39 +08:00
w20011025
2022-05-25 19:35:32 +08:00
目前,问题就是完整解析正文内容问题了。
发送页面图片,接收解析页面图片问题了。
w20011025
2022-05-25 19:36:28 +08:00
@cnbatch
目前,问题就是完整解析正文内容问题了。
发送页面图片,接收解析页面图片问题。谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/853241

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX