mirror of
https://github.com/curl/curl.git
synced 2024-12-15 06:40:09 +08:00
3a6563d668
All plain C examples now (mostly) adhere to the curl code style. While they are only examples, they had diverted so much and contained all sorts of different mixed code styles by now. Having them use a unified style helps users and readability. Also, as they get copy-and-pasted widely by users, making sure they're clean and nice is a good idea. 573 checksrc warnings were addressed.
172 lines
6.2 KiB
C
172 lines
6.2 KiB
C
/***************************************************************************
|
|
* _ _ ____ _
|
|
* Project ___| | | | _ \| |
|
|
* / __| | | | |_) | |
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
*
|
|
* This software is licensed as described in the file COPYING, which
|
|
* you should have received as part of this distribution. The terms
|
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
|
*
|
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
* copies of the Software, and permit persons to whom the Software is
|
|
* furnished to do so, under the terms of the COPYING file.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
***************************************************************************/
|
|
|
|
/* <DESC>
|
|
* SMTP example using TLS
|
|
* </DESC>
|
|
*/
|
|
|
|
#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. It builds on the smtp-mail.c example to add authentication
|
|
* and, more importantly, transport security to protect the authentication
|
|
* details from being snooped.
|
|
*
|
|
* 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 TLS 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) {
|
|
/* Set username and password */
|
|
curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
|
|
curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
|
|
|
|
/* This is the URL for your mailserver. Note the use of port 587 here,
|
|
* instead of the normal SMTP port (25). Port 587 is commonly used for
|
|
* secure mail submission (see RFC4403), but you should use whatever
|
|
* matches your server configuration. */
|
|
curl_easy_setopt(curl, CURLOPT_URL, "smtp://mainserver.example.net:587");
|
|
|
|
/* In this example, we'll start with a plain text connection, and upgrade
|
|
* to Transport Layer Security (TLS) using the STARTTLS command. Be careful
|
|
* of using CURLUSESSL_TRY here, because if TLS upgrade fails, the transfer
|
|
* will continue anyway - see the security discussion in the libcurl
|
|
* tutorial for more details. */
|
|
curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL);
|
|
|
|
/* If your server doesn't have a valid certificate, then you can disable
|
|
* part of the Transport Layer Security protection by setting the
|
|
* CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST options to 0 (false).
|
|
* curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
|
* curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
|
* That is, in general, a bad idea. It is still better than sending your
|
|
* authentication details in plain text though. Instead, you should get
|
|
* the issuer certificate (or the host certificate if the certificate is
|
|
* self-signed) and add it to the set of certificates that are known to
|
|
* libcurl using CURLOPT_CAINFO and/or CURLOPT_CAPATH. See docs/SSLCERTS
|
|
* for more information. */
|
|
curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem");
|
|
|
|
/* 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);
|
|
|
|
/* Since the traffic will be encrypted, it is very useful to turn on debug
|
|
* information within libcurl to see what is happening during the transfer.
|
|
*/
|
|
curl_easy_setopt(curl, CURLOPT_VERBOSE, 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);
|
|
|
|
/* Always cleanup */
|
|
curl_easy_cleanup(curl);
|
|
}
|
|
|
|
return (int)res;
|
|
}
|