c/c++ curl smtp 发送邮件太长导致段错误的问题
2017-07-10 12:03
1366 查看
在Linux下,使用
libcurl 库发送邮件,当邮件长度超过16000字节时(具体应该为 16000 ~ 17000之间),
执行到 curl_easy_perform(curl); 会发生段错误 Segmentation fault
下面看一下 curl 提供的 smtp 示例:
解决方法:把过长的邮件内容拆成多个字符串
深层原因:可能和 curl 实现有关系(需要深入研究)
libcurl 库发送邮件,当邮件长度超过16000字节时(具体应该为 16000 ~ 17000之间),
执行到 curl_easy_perform(curl); 会发生段错误 Segmentation fault
下面看一下 curl 提供的 smtp 示例:
#include <stdio.h> #include <string.h> #include <curl/curl.h> /* This is a simple example showing how to send mail using libcurl's SMTP * capabilities. For an example of using the multi interface please see * smtp-multi.c. * * Note that this example requires libcurl 7.20.0 or above. */ #define FROM "<sender@example.org>" #define TO "<addressee@example.net>" #define CC "<info@example.org>" static const char *payload_text[] = { "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n", "To: " TO "\r\n", "From: " FROM "(Example User)\r\n", "Cc: " CC "(Another example User)\r\n", "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@" "rfcpedant.example.org>\r\n", "Subject: SMTP example message\r\n", "\r\n", /* empty line to divide headers from body, see RFC5322 */ "The body of the message starts here.\r\n", "\r\n", "It could be a lot of lines, could be MIME encoded, whatever.\r\n", "Check RFC5322.\r\n", NULL }; struct upload_status { int lines_read; }; static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) { struct upload_status *upload_ctx = (struct upload_status *)userp; const char *data; if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) { return 0; } data = payload_text[upload_ctx->lines_read]; if(data) { size_t len = strlen(data); memcpy(ptr, data, len); upload_ctx->lines_read++; return len; } return 0; } int main(void) { CURL *curl; CURLcode res = CURLE_OK; struct curl_slist *recipients = NULL; struct upload_status upload_ctx; upload_ctx.lines_read = 0; curl = curl_easy_init(); if(curl) { /* This is the URL for your mailserver */ curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com"); /* Note that this option isn't strictly required, omitting it will result * in libcurl sending the MAIL FROM command with empty sender data. All * autoresponses should have an empty reverse-path, and should be directed * to the address in the reverse-path which triggered them. Otherwise, * they could cause an endless loop. See RFC 5321 Section 4.5.5 for more * details. */ curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); /* Add two recipients, in this particular case they correspond to the * To: and Cc: addressees in the header, but they could be any kind of * recipient. */ recipients = curl_slist_append(recipients, TO); recipients = curl_slist_append(recipients, CC); curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); /* We're using a callback function to specify the payload (the headers and * body of the message). You could just use the CURLOPT_READDATA option to * specify a FILE pointer to read from. */ curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); /* Send the message */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); /* Free the list of recipients */ curl_slist_free_all(recipients); /* curl won't send the QUIT command until you call cleanup, so you should * be able to re-use this connection for additional messages (setting * CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling * curl_easy_perform() again. It may not be a good idea to keep the * connection open for a very long time though (more than a few minutes * may result in the server timing out the connection), and you do want to * clean up in the end. */ curl_easy_cleanup(curl); } return (int)res; }段错误原因:payload_text 数组其中任一个指针指向的字符串长度大于16000(之前程序在组合邮件内容时,其中一个指针指向了整个内容)
解决方法:把过长的邮件内容拆成多个字符串
深层原因:可能和 curl 实现有关系(需要深入研究)
相关文章推荐
- c/c++ curl smtp 发送邮件 foxmail 中文乱码问题解决
- SMTP发送邮件附件问题已经得到解决!!!
- 【C++】【网络】利用Socket 编写SMTP 发送邮件程序
- 关于JavaMail包和J2EE包冲突导致无法发送邮件问题
- java使用smtp发送邮件问题
- python smtplib发送邮件遇到的认证问题
- 用smtp命令发送邮件附件给新浪邮箱的问题
- 每日学习总结:CSS:Clear属性的用法、重复交易提示框、弹出提示框后页面变形、asp.net调用smtp服务发送邮件问题
- 记一次SmtpClient发送邮件引发的系列问题
- SMTP基本原理与C++实现向多人发送邮件
- php中通过curl smtp发送邮件
- 使用system.web.mail.SMTPmail发送邮件,处理smtp验证问题
- 结合MIME C++ library与CURL发送带附件的邮件
- php中通过curl smtp发送邮件
- smtp发邮件实现及邮件发送时的一些报错问题的解决
- 用C++实现读取windows日志并用zlib压缩后通过jwsmtp邮件发送出去.
- 调试php没法使用smtp发送邮件的问题
- GoDaddy的SMTP发送邮件的问题及解决方法
- 通过SMTP中继服务器发送邮件的问题
- 关于java使用网易服务器smtp.163.com发送邮件,连接失败的问题