2016-05-07 1 views
1

Я знаю, что есть сотни сообщений, но почему-то это не работает для меня. Я пытаюсь отправить электронное письмо с libcurl. Это мой код:, отправив письмо с libcurl/smtp с gmail: login denied

#include <stdio.h> 
#include <string.h> 
#include <curl/curl.h> 

#define FROM "<[email protected]>" 
#define TO  "<[email protected]>" 
#define CC  "<[email protected]>" 

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: <[email protected]" 
    "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) { 
    curl_easy_setopt(curl, CURLOPT_URL, "smtp://smtp.gmail.com:587"); 
    curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL); 
    curl_easy_setopt(curl, CURLOPT_USERNAME, "[email protected]"); 
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "mypassword"); 
    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); 

    recipients = curl_slist_append(recipients, TO); 
    recipients = curl_slist_append(recipients, CC); 
    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); 

    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); 
curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); 
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); 

    res = curl_easy_perform(curl); 

    /* Check for errors */ 
    if(res != CURLE_OK) 
     fprintf(stderr, "curl_easy_perform() failed: %s\n", 
       curl_easy_strerror(res)); 

    curl_slist_free_all(recipients); 

    curl_easy_cleanup(curl); 
    } 

    return (int)res; 
} 

Я также попытался это example, который очень похож, за исключением текста получает по трубопроводу через другой файл.

Но я всегда получаю

curl_easy_perform() не удалось: Логин отказано

, а затем Gmail отправляет мне сообщение о том, что кто-то пытался взломать мой счет. (Регистрационные данные являются правильными)

Это curl-config --feature

дает мне

SSL IPv6 UnixSockets libz NTLM NTLM_WB

Чтение пару · блоги, · Я также попытался с Hotmail, используя smtp://smtp.live.com:465

Но здесь я получаю

curl_easy_perform() не удалось: Не удалось подключиться к серверу

Что я здесь делаю неправильно?

ответ

0

я использовать Libcurl, так что я скачал завиток-7.49.1 и внутри каталога

я скопировал IMap-fetch.c для создания специфичного для IMAP Gmail, чем я копировать, вставлять и переименовать IMap-принести-gmail.h

внутри IMap-Fetch-gmail.hi установить свои параметры на этой линии:

curl_easy_setopt(curl, CURLOPT_USERNAME, "[email protected]"); 
curl_easy_setopt(curl, CURLOPT_PASSWORD, "mypassword"); 

/* This will fetch message 1 from the user's inbox */ 
curl_easy_setopt(curl, CURLOPT_URL, 
       "imaps://imap.gmail.com:993/INBOX/;UID=1"); 

затем, внутри завитка папки я называю GCC для компиляции моего IMAP -fetch-gmail.h с настройками моей учетной записи, такими как E-mail, Пароль и параметры с помощью этой команды

НКУ-IMAP выборка-gmail.c -о-IMAP выборка-Gmail -lcurl

После этого

Во-первыхи, вам необходимо включить ваши настройки IMAP на вашем аккаунте GMAIL, то вам нужно чтобы менее безопасные приложения могли получить доступ к вашей учетной записи gmail. Если вы не делаете это вы имеете receice электронной почты безопасности с темой: «Попытка логин предотвращено»

Вы можете управлять доступом к менее защищенным приложениям на этой ссылке: https://www.google.com/settings/security/lesssecureapps

Для получения дополнительных сведений о отдельные компоненты URL IMAP см. в RFC 5092.

+0

Звучит ужасно взломать ... – Kusalananda

2

Мне пришлось потратить много времени, чтобы заставить это работать, но я, наконец, получил его на работу.Вот что я нашел:

Первое:

#define FROM "<[email protected]>" 
#define TO  "<[email protected]>" 
#define CC  "<[email protected]>" 

Там не должно быть никаких "<" или ">" в электронный адрес. Я ошибся в повторном использовании определений и не смог понять, почему логин завершился неудачно.

Второе:

Вы, скорее всего, нужно идти здесь и разрешить небезопасные приложения: https://www.google.com/settings/security/lesssecureapps

Третье:

Если вы используете порт 587 вам необходимо следующее line:

curl_easy_setopt(m_curl, CURLOPT_USE_SSL, CURLUSESSL_ALL); 

Это делает кажется, не нужно для 465.

Примечания:

Это нормально использовать либо порт 465 или 587. 465 требует SSL, так что вам нужно будет использовать SMTPS вместо SMTP, чтобы указать это - smtps://smtp.gmail.com:465. Я нашел некоторую информацию об этом здесь: https://support.google.com/a/answer/176600?hl=en

Смежные вопросы