问题描述
我正在使用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");
也许这也适用于您的情况。