c/c++ curl smtp 发送邮件太长导致段错误的问题
来源:互联网 发布:斑马二维码打印软件 编辑:程序博客网 时间:2024/06/04 19:17
在Linux下,使用 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 实现有关系(需要深入研究)
阅读全文
1 0
- c/c++ curl smtp 发送邮件太长导致段错误的问题
- C#smtp发送邮件
- c/c++ curl smtp 发送邮件 foxmail 中文乱码问题解决
- 嘻哈C#---SMTP发送邮件
- 利用SMTP发送邮件(C#)
- C#smtp服务器发送邮件
- c#.net smtp 发送邮件
- cURL开源库中的发送邮件示例代码(smtp-multi.c)
- C语言实现简单的SMTP发送邮件
- C语言实现SMTP协议发送邮件
- c语言利用SMTP协议发送邮件
- [C#]SMTP邮件发送小例子
- c语言利用SMTP协议发送邮件
- C语言使用SMTP发送邮件
- c#:SMTP发送带图片邮件
- php中通过curl smtp发送邮件
- php中通过curl smtp发送邮件
- php中通过curl smtp发送邮件
- RecyclerView---adapter.notifyDataSetChanged()不起作用
- ElasticSearch Yellow status d
- druid连接池
- error MSB6006: “cmd.exe”已退出,代码为1
- Android XListView下拉刷新和上拉加载更多
- c/c++ curl smtp 发送邮件太长导致段错误的问题
- 滴滴插件化开源virtual apk开源,实现插件和宿主资源互访
- Hibernate 优化技术之调用视图(View)和存储过程(Procedure)
- 《拒绝平庸》读后感,勉励自己
- 最稳定的Nginx绿色环境,可无限自定义PHP和mysql版本、同时运行N个版本
- 在github上下载单个文件夹
- Android Studio关联 SVN
- python
- python小程序-0009