C ++使用带有curl的Google电子邮件发送zip文件

问题描述

我正在使用c ++和curl发送带有附件的电子邮件,在此示例中为zip存档。我收到了有关gmail的电子邮件,但是当我尝试使用WinRar提取内容时,下载.zip时出现错误

The archive is either in unkNown format or damaged

zip没问题,我可以在发送前将其提取

这是发送文件功能

int sendFile()
{
    CURL *curl;
    CURLcode res = CURLE_OK;

    curl = curl_easy_init();
    if(curl) {
        struct curl_slist *headers = NULL;
        struct curl_slist *recipients = NULL;
        struct curl_slist *slist = NULL;
        curl_mime *mime;
        curl_mime *alt;
        curl_mimepart *part;
        const char **cpp;

        /* This is the URL for your mailserver */
        curl_easy_setopt(curl,CURLOPT_URL,"smtps://smtp.gmail.com:465");


        curl_easy_setopt(curl,CURLOPT_USERNAME,"email");
        curl_easy_setopt(curl,CURLOPT_PASSWORD,"password");
        curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,0L);
        curl_easy_setopt(curl,CURLOPT_SSL_VERIFYHOST,0L);

      
        curl_easy_setopt(curl,CURLOPT_MAIL_FROM,FROM_ADDR);

      
        recipients = curl_slist_append(recipients,TO_ADDR);
        recipients = curl_slist_append(recipients,CC_ADDR);
        curl_easy_setopt(curl,CURLOPT_MAIL_RCPT,recipients);

        for(cpp = headers_text; *cpp; cpp++)
            headers = curl_slist_append(headers,*cpp);
        curl_easy_setopt(curl,CURLOPT_HTTPHEADER,headers);

        mime = curl_mime_init(curl);

        alt = curl_mime_init(curl);

        /* Text message. */
        part = curl_mime_addpart(alt);
        curl_mime_data(part,inline_text,CURL_ZERO_TERMINATED);
        part = curl_mime_addpart(mime);
        curl_mime_subparts(part,alt);
        curl_mime_type(part,"multipart/alternative");
        slist = curl_slist_append(NULL,"Content-disposition: inline");
        curl_mime_headers(part,slist,1);
        
        /* File */
        std::string attachment = "D:/report.zip";
        part = curl_mime_addpart(mime);
        curl_mime_type(part,"application/zip");
        curl_mime_filedata(part,attachment.c_str());
        curl_easy_setopt(curl,CURLOPT_MIMEPOST,mime);

        res = curl_easy_perform(curl);

        if(res != CURLE_OK)
            fprintf(stderr,"curl_easy_perform() Failed: %s\n",curl_easy_strerror(res));

        curl_slist_free_all(recipients);
        curl_slist_free_all(headers);

        curl_easy_cleanup(curl);

        curl_mime_free(mime);
    }

    return (int)res;
}

您能帮助我了解问题在哪里吗?邮编已包含在电子邮件中,但下载后由于损坏已无法打开。

谢谢!

解决方法

我在发送 jpeg 文件时遇到了类似的问题,并且能够通过使用 curl_mime_encoder 对数据进行编码来解决该问题。

curl_mime_filedata(part,attachment.c_str());
curl_mime_encoder(part,"base64");

也许这也适用于您的情况。