使用C语言curl库发送邮件失败,报错退出码0xC0000135
问题解决:CLion中C语言结合curl发送邮件出现0xC0000135退出码
问题根源
退出码-1073741515(0xC0000135)是Windows平台典型的动态链接库(DLL)缺失错误,程序运行时无法找到curl相关的DLL文件,导致进程直接崩溃;调试模式下程序未正常启动,所以断点被忽略,返回退出码-1。
解决方案
1. 补充缺失的DLL文件
如果你使用的是curl动态库版本:
- 找到curl预编译包中的
bin目录(一般在libcurl\bin下),将其中的libcurl.dll及依赖的其他DLL(如zlib.dll、libssl-*.dll、libcrypto-*.dll等)复制到你的程序输出目录(即cmake-build-debug文件夹,和生成的.exe可执行文件同目录)。 - 注意:Debug模式要对应复制Debug版本的DLL,Release模式对应Release版本,不能混用。
2. 修正CMake配置
当前CMakeLists.txt中curl的配置存在冗余且可能关联错误,建议调整为:
cmake_minimum_required(VERSION 3.26) project(aplicacao_back_end C) set(CMAKE_C_STANDARD 11) # 配置libmicrohttpd include_directories(lib/libmicrohttpd/include) link_directories(lib/libmicrohttpd/lib) # 配置curl:用find_package自动关联正确的库文件 find_package(CURL REQUIRED) include_directories(${CURL_INCLUDE_DIR}) add_executable(aplicacao_back_end main.c scripts/email.c scripts/email.h ) # 链接依赖库,使用find_package提供的CURL_LIBRARIES变量更可靠 target_link_libraries(aplicacao_back_end microhttpd ws2_32 ${CURL_LIBRARIES})
3. 代码修正(解决后续邮件发送失败问题)
当前代码存在几个逻辑错误,即使解决崩溃问题也无法正常发邮件:
#define TO "password"错误:TO应该是收件人邮箱地址,不是密码;- 缺少Gmail SMTP认证:需要添加用户名和应用专用密码(Gmail开启两步验证后需使用应用专用密码,不能用原密码);
- MIME结构未正确关联:创建的
alt子部分未附加到主mime中; - 未释放
alt导致内存泄漏。
修正后的核心代码片段:
// ... 其他代码不变 ... #define FROM "你的gmail邮箱@gmail.com" #define TO "收件人邮箱@xxx.com" #define APP_PASSWORD "你的Gmail应用专用密码" char * send_email(){ CURL *curl; CURLcode res = CURLE_OK; curl = curl_easy_init(); if(curl) { struct curl_slist *headers = NULL; struct curl_slist *recipients = NULL; curl_mime *mime; curl_mime *alt; curl_mimepart *part; const char **cpp; /* 配置SMTP服务器 */ curl_easy_setopt(curl, CURLOPT_URL, "smtps://smtp.gmail.com:465"); curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); recipients = curl_slist_append(recipients, TO); curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); curl_easy_setopt(curl, CURLOPT_MAIL_RCPT_ALLOWFAILS, 1L); // 添加SMTP认证信息 curl_easy_setopt(curl, CURLOPT_USERNAME, FROM); curl_easy_setopt(curl, CURLOPT_PASSWORD, APP_PASSWORD); 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); part = curl_mime_addpart(alt); curl_mime_data(part, inline_text, CURL_ZERO_TERMINATED); // 将alt子部分关联到主mime结构 part = curl_mime_addpart(mime); curl_mime_subparts(part, alt); curl_mime_type(part, "multipart/alternative"); 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); curl_mime_free(alt); // 释放alt } return "ok"; }
内容的提问来源于stack exchange,提问作者Skeff Igor
相关产品推荐
相关产品推荐

