V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
w20011025
V2EX  ›  C++

c++ gsoap ews exchange API sendmail getmail

  •  
  •   w20011025 · 2022-05-16 17:52:15 +08:00 via Android · 1331 次点击
    这是一个创建于 701 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    18 条回复    2022-05-25 19:36:28 +08:00
    cnbatch
        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 库相比,差得远了
    w20011025
        2
    w20011025  
    OP
       2022-05-17 07:07:01 +08:00 via Android
    我先测试下,谢谢!
    w20011025
        3
    w20011025  
    OP
       2022-05-17 17:43:47 +08:00 via Android
    @cnbatch 收邮件没看到示例里面有?示例里有收邮件示例吗?谢谢
    w20011025
        5
    w20011025  
    OP
       2022-05-19 10:44:49 +08:00 via Android
    留个联系信箱感谢下,谢谢 !
    @cnbatch
    w20011025
        6
    w20011025  
    OP
       2022-05-19 22:29:11 +08:00 via Android
    @cnbatch 邮件正文部分内容,还有图片如何接收解析?
    cnbatch
        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 里面对着各种函数都不妨试一试,只要不是写操作,都不会有什么影响。
    w20011025
        8
    w20011025  
    OP
       2022-05-20 10:34:17 +08:00 via Android
    我先继续测试下 ews 。

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

    先用纯英文字符的内容去试。
    cnbatch
        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
    cnbatch
        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");

    第二个参数可以按照注释的指引,在注册表里面找
    w20011025
        13
    w20011025  
    OP
       2022-05-25 09:57:00 +08:00 via Android
    @cnbatch ,直接收邮件,获取收件人信箱名字,都是自己的信箱名字???获取发件人信箱地址?如何获取发件人信箱地址?
    w20011025
        14
    w20011025  
    OP
       2022-05-25 12:10:26 +08:00 via Android
    获取收件箱,发件人信箱地址?
    @cnbatch
    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";
    }
    w20011025
        17
    w20011025  
    OP
       2022-05-25 19:35:32 +08:00 via Android
    目前,问题就是完整解析正文内容问题了。
    发送页面图片,接收解析页面图片问题了。
    w20011025
        18
    w20011025  
    OP
       2022-05-25 19:36:28 +08:00 via Android
    @cnbatch
    目前,问题就是完整解析正文内容问题了。
    发送页面图片,接收解析页面图片问题。谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   948 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 21:42 · PVG 05:42 · LAX 14:42 · JFK 17:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.