静态处理Gmail原始数据

时间:2018-01-12 19:22:45

标签: c++ parsing winapi gmail mime

问题

任何Gmail邮件都可以封装为single raw file。我的假设是,这样的原始文件将包含正确显示电子邮件及其所有特定所需的任何内容。

我一直在寻找一种以编程方式处理此类文件的方法。处理Gmail邮件有两种方法:

  1. 通过Gmail API与Gmail服务器连接。这样做需要身份验证,然后进行HTTP / HTTPS互动,如Gmail API documentation中所述。

  2. 静态解析原始数据,从中提取所有元素,这些元素总计为整个电子邮件消息。这些可能包括:

    • 电子邮件的属性(发件人的姓名,发件人的电子邮件,日期,主题等)
    • 正文(通常是HTML版本,可能包含嵌入的图像和其他文件,这些都是HTML文件正确显示所必需的)。
    • 附件。
  3. 我的问题:

    如何静态解析此类Gmail邮件原始数据,而无需与Gmail服务器/ API进行交互,只需使用this one之类的MIME解析,并在其上添加任意内容查找和提取上面列出的任何特定Gmail所需的代码。

    到目前为止我写的内容:

    我已经开始解析原始数据(存储在szMailBody中):(使用this parser)。

        LPCSTR szMailId, LPCSTR szMailBody;
    
        MIMELIB::CONTENT c;
    
        while ((*szMailBody == ' ') || (*szMailBody == '\r') || (*szMailBody == '\n'))
        {
            szMailBody++;
        }
        char deli[] = "<pre class=\"raw_message_text\" id=\"raw_message_text\">";
        szMailBody = strstr(szMailBody, deli);
        szMailBody += strlen(deli);
    
    
        if (c.Parse(szMailBody) != MIMELIB::MIMEERR::OK)
            return;  
    
        // Get some headers
        auto senderHdr = c.hval("From");
        auto dateHdr = c.hval("Date");
        auto subjectHdr = c.hval("Subject");
    
        auto a1 = c.hval("Content-Type", "boundary");
        // Not a multi-part mail if empty
        // Then use c.Decode() to get and decode the single part body
        if (a1.empty())
            return;
        auto a2 = c.hval("_NextPart_000_0046_01D38959.20888970");
        if (a2.empty())
            return;
    
    // _NextPart_000_0046_01D38959.20888970
        vector<MIMELIB::CONTENT> Contents;
        MIMELIB::ParseMultipleContent2(szMailBody,strlen(szMailBody), a2.c_str(), Contents);
    

    我的问题与this one不同,因为Gmail原始数据非常复杂,需要采取进一步措施,即使用户熟悉MIME解析也是如此。将附件提取到单独的文件(例如)或将电子邮件正文还原为HTML文件以及其依赖性(例如嵌入图像)的复杂性更加复杂。处理Gmail原始数据的技术需要在MIME解析之上提供一层指令。

0 个答案:

没有答案