diff --git a/src/libs/zbxmedia/email.c b/src/libs/zbxmedia/email.c index 51b54ad8da9..deb18172d8d 100644 --- a/src/libs/zbxmedia/email.c +++ b/src/libs/zbxmedia/email.c @@ -550,6 +550,8 @@ static int send_email_plain(const char *smtp_server, unsigned short smtp_port, c const char *response; + zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__); + /* connect to and receive an initial greeting from SMTP server */ if (FAIL == zbx_tcp_connect(&s, config_source_ip, smtp_server, smtp_port, timeout, ZBX_TCP_SEC_UNENCRYPTED, NULL, NULL)) @@ -709,12 +711,26 @@ static int send_email_plain(const char *smtp_server, unsigned short smtp_port, c close: zbx_tcp_close(&s); out: + zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __func__, zbx_result_string(ret)); + return ret; #undef OK_220 #undef OK_251 #undef OK_354 } +#define CURL_SETOPT(HANDLE, OPT, PARAM) \ + do \ + { \ + if (CURLE_OK != (err = curl_easy_setopt(HANDLE, OPT, (PARAM)))) \ + { \ + zbx_snprintf(error, max_error_len, "cannot set cURL option " #OPT ": %s", \ + curl_easy_strerror(err)); \ + goto clean; \ + } \ + } \ + while (0) + /* SMTP authentication options */ #define SMTP_AUTHENTICATION_NONE 0 #define SMTP_AUTHENTICATION_NORMAL_PASSWORD 1 @@ -734,6 +750,8 @@ static int send_email_curl(const char *smtp_server, unsigned short smtp_port, co struct curl_slist *recipients = NULL; smtp_payload_status_t payload_status; + zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__); + if (NULL == (easyhandle = curl_easy_init())) { zbx_strlcpy(error, "cannot initialize cURL library", max_error_len); @@ -785,45 +803,29 @@ static int send_email_curl(const char *smtp_server, unsigned short smtp_port, co /* CURLOPT_PROTOCOLS is supported starting with version 7.19.4 (0x071304) */ /* CURLOPT_PROTOCOLS was deprecated in favor of CURLOPT_PROTOCOLS_STR starting with version 7.85.0 (0x075500) */ # if LIBCURL_VERSION_NUM >= 0x075500 - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_PROTOCOLS_STR, "SMTPS,SMTP"))) + CURL_SETOPT(easyhandle, CURLOPT_PROTOCOLS_STR, "SMTPS,SMTP"); # else - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_PROTOCOLS, CURLPROTO_SMTPS | CURLPROTO_SMTP))) + CURL_SETOPT(easyhandle, CURLOPT_PROTOCOLS, CURLPROTO_SMTPS | CURLPROTO_SMTP); # endif - goto error; #endif - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_URL, url))) - goto error; + CURL_SETOPT(easyhandle, CURLOPT_URL, url); if (SMTP_SECURITY_NONE != smtp_security) { - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_SSL_VERIFYPEER, - 0 == smtp_verify_peer ? 0L : 1L)) || - CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_SSL_VERIFYHOST, - 0 == smtp_verify_host ? 0L : 2L))) - { - goto error; - } + CURL_SETOPT(easyhandle, CURLOPT_SSL_VERIFYPEER, 0 == smtp_verify_peer ? 0L : 1L); + CURL_SETOPT(easyhandle, CURLOPT_SSL_VERIFYHOST, 0 == smtp_verify_host ? 0L : 2L); if (0 != smtp_verify_peer && NULL != CONFIG_SSL_CA_LOCATION) - { - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_CAPATH, CONFIG_SSL_CA_LOCATION))) - goto error; - } + CURL_SETOPT(easyhandle, CURLOPT_CAPATH, CONFIG_SSL_CA_LOCATION); if (SMTP_SECURITY_STARTTLS == smtp_security) - { - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL))) - goto error; - } + CURL_SETOPT(easyhandle, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); } if (SMTP_AUTHENTICATION_NORMAL_PASSWORD == smtp_authentication) { - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_USERNAME, username)) || - CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_PASSWORD, password))) - { - goto error; - } + CURL_SETOPT(easyhandle, CURLOPT_USERNAME, username); + CURL_SETOPT(easyhandle, CURLOPT_PASSWORD, password); /* Don't specify preferred authentication mechanism implying AUTH=* and let libcurl choose the best */ /* one (in its mind) among supported by SMTP server. If someday we decide to let user choose their */ @@ -834,50 +836,34 @@ static int send_email_curl(const char *smtp_server, unsigned short smtp_port, co } if (0 >= from_mails->values_num) - { zabbix_log(LOG_LEVEL_DEBUG, "%s() sender's address is not specified", __func__); - } - else if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_MAIL_FROM, - ((zbx_mailaddr_t *)from_mails->values[0])->addr))) - { - goto error; - } + else + CURL_SETOPT(easyhandle, CURLOPT_MAIL_FROM, ((zbx_mailaddr_t *)from_mails->values[0])->addr); - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, ZBX_CURLOPT_ACCEPT_ENCODING, ""))) - goto error; + CURL_SETOPT(easyhandle, ZBX_CURLOPT_ACCEPT_ENCODING, ""); for (i = 0; i < to_mails->values_num; i++) recipients = curl_slist_append(recipients, ((zbx_mailaddr_t *)to_mails->values[i])->addr); - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_MAIL_RCPT, recipients))) - goto error; + CURL_SETOPT(easyhandle, CURLOPT_MAIL_RCPT, recipients); payload_status.payload = smtp_prepare_payload(from_mails, to_mails, inreplyto, mailsubject, mailbody, content_type); payload_status.payload_len = strlen(payload_status.payload); - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_UPLOAD, 1L)) || - CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_READFUNCTION, smtp_provide_payload)) || - CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_READDATA, &payload_status)) || - CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_TIMEOUT, (long)timeout)) || - CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_ERRORBUFFER, errbuf))) - { - goto error; - } + CURL_SETOPT(easyhandle, CURLOPT_UPLOAD, 1L); + CURL_SETOPT(easyhandle, CURLOPT_READFUNCTION, smtp_provide_payload); + CURL_SETOPT(easyhandle, CURLOPT_READDATA, &payload_status); + CURL_SETOPT(easyhandle, CURLOPT_TIMEOUT, (long)timeout); + CURL_SETOPT(easyhandle, CURLOPT_ERRORBUFFER, errbuf); if (NULL != config_source_ip) - { - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_INTERFACE, config_source_ip))) - goto error; - } + CURL_SETOPT(easyhandle, CURLOPT_INTERFACE, config_source_ip); if (SUCCEED == ZBX_CHECK_LOG_LEVEL(LOG_LEVEL_TRACE)) { - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_VERBOSE, 1L))) - goto error; - - if (CURLE_OK != (err = curl_easy_setopt(easyhandle, CURLOPT_DEBUGFUNCTION, smtp_debug_function))) - goto error; + CURL_SETOPT(easyhandle, CURLOPT_VERBOSE, 1L); + CURL_SETOPT(easyhandle, CURLOPT_DEBUGFUNCTION, smtp_debug_function); } if (CURLE_OK != (err = curl_easy_perform(easyhandle))) @@ -888,15 +874,14 @@ static int send_email_curl(const char *smtp_server, unsigned short smtp_port, co } ret = SUCCEED; - goto clean; -error: - zbx_strlcpy(error, curl_easy_strerror(err), max_error_len); clean: zbx_free(payload_status.payload); curl_slist_free_all(recipients); curl_easy_cleanup(easyhandle); out: + zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __func__, zbx_result_string(ret)); + return ret; #else ZBX_UNUSED(smtp_server);