С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/32: Рейтинг темы: голосов - 32, средняя оценка - 4.53
...
4 / 4 / 1
Регистрация: 10.11.2017
Сообщений: 151

отправка почты с пом ощью curl

31.08.2018, 08:25. Показов 7039. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Проблема такова: нужно реализовать отправку почты из программы. Накопал кучу примеров с curl, но ни одного рабочего, компилятор ругается везде одинаково:
C:\Users\Vladimir\Desktop\с++ 3\mail-1\main.cpp|62|undefined reference to `_imp__curl_easy_init'| (и еще штук двадцать подобных строк)
Попутно возникает проблема с подключением libcurl.lib, он ее не видит или игнорирует, не знаю. Пишет warning в соответствующей #pragma..., может проблема в этом? Перенос библиотеки в папку с проектом результата не дал.
Вот весь код примера для ясности:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <string.h>
 
#include "C:\users\Vladimir\Downloads\curl\curl-7.61.0\builds\libcurl-vc17-x86-release-dll-ipv6-sspi-winssl\include\curl\curl.h"
#pragma comment(lib,"C:\users\Vladimir\Downloads\curl\curl-7.61.0\builds\libcurl-vc17-x86-release-dll-ipv6-sspi-winssl\lib\libcurl.lib")
 
#define FROM    "<avazart@yandex.ua>"
#define TO      "<avazart@yandex.ua>"
 
static const char *payload_text[] = {
  "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
  "To: " TO "\r\n",
  "From: " FROM "\r\n",
  "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\r\n",
  "Subject: Тема тестового письма.\r\n",
  "\r\n", /* empty line to divide headers from body, see RFC5322 */
  "Содержимое тестового письма.\r\n",
  "\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;
}
 
#define SKIP_PEER_VERIFICATION
#define SKIP_HOSTNAME_VERFICATION
 
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, "avazart@yandex.ua");
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "*****");
 
    /* This is the URL for your mailserver. Note the use of smtps:// rather
     * than smtp:// to request a SSL based connection. */
    curl_easy_setopt(curl, CURLOPT_URL, "smtps://smtp.yandex.ru");
    curl_easy_setopt(curl, CURLOPT_PORT, 465);
 
    /* If you want to connect to a site who isn't using a certificate that is
     * signed by one of the certs in the CA bundle you have, you can skip the
     * verification of the server's certificate. This makes the connection
     * A LOT LESS SECURE.
     *
     * If you have a CA cert for the server stored someplace else than in the
     * default bundle, then the CURLOPT_CAPATH option might come handy for
     * you. */
#ifdef SKIP_PEER_VERIFICATION
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
#endif
 
    /* If the site you're connecting to uses a different host name that what
     * they have mentioned in their server certificate's commonName (or
     * subjectAltName) fields, libcurl will refuse to connect. You can skip
     * this check, but this will make the connection less secure. */
#ifdef SKIP_HOSTNAME_VERFICATION
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
#endif
 
    /* 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);
  }
 
    getchar();
  return (int)res;
}
если что, он отсюда: http://avazart.zz.mu/2014/10/curl-smtp-send-mail/
Спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.08.2018, 08:25
Ответы с готовыми решениями:

Обработка двумерных массивов с пом ощью подпрограмм
Пусть задана вещественная матрица А(n x n). Упорядочить элементы матрицы по не убыванию значений максимальных элементов в строках. ...

Отправка почты: "необработанное исключение отправки почты в system.Dll"
подскажите - вот пример на C#, но он мне пишет &quot;необработанное исключение отправки почты в system.dll&quot; using System; using...

С пом. директивы absolute, отсортировать по убыванию с пом. одной подпрограммы векторы из 10 и 14 вещественных компонент
Program hz_wache; uses crt; const k=10; l=14; var i:byte; a:array of real; b:array of real; procedure sort(var m); var...

17
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.08.2018, 08:28
sad_guy, этот код для Visual Studio. А у вас что?
0
...
4 / 4 / 1
Регистрация: 10.11.2017
Сообщений: 151
31.08.2018, 08:31  [ТС]
C::B, разве это принципиально?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.08.2018, 08:35
Лучший ответ Сообщение было отмечено sad_guy как решение

Решение

Цитата Сообщение от sad_guy Посмотреть сообщение
разве это принципиально?
Конечно. Формат библиотек импорта у mingw и vc++ - разный.
У вас даже в пути написано, что curl под VC17 собран.
Во-вторых, #pragma comment - это расширение VC++, которое позволяет линковать библиотеки прямо в коде - другие компиляторы могут такое неподдерживать (mingw не поддерживает).
0
...
4 / 4 / 1
Регистрация: 10.11.2017
Сообщений: 151
31.08.2018, 08:38  [ТС]
Попробовал в vs, тоже не получается: без stdafx.h - неожиданный конец файла, с ним - не может открыть библиотеку
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.08.2018, 08:44
Цитата Сообщение от sad_guy Посмотреть сообщение
Попробовал в vs, тоже не получается: без stdafx.h - неожиданный конец файла, с ним - не может открыть библиотеку
Что такое "не может открыть библиотеку"?
Ошибки компиляции\линковки приводите как они есть, а не в пересказе.
0
...
4 / 4 / 1
Регистрация: 10.11.2017
Сообщений: 151
31.08.2018, 08:45  [ТС]
fatal error LNK1104: не удается открыть файл
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.08.2018, 09:01
Цитата Сообщение от sad_guy Посмотреть сообщение
fatal error LNK1104: не удается открыть файл
Возможно компилируете в режиме x64, а библиотека у вас, очевидно, x86.



_____
Для Mingw есть четыре пути.
Первый (предполагается использование 32-битного mingw или 32-битного режима компиляции (-m32)): делаем для mingw библиотеку импорта (руководство). Подключаем ее в настройках среды (link libraries).
Второй: можно попробовать сразу подключить dll к mingw, если он достаточно новый, то поддерживает direct link.

Третий: можно самому скомпилировать и подключить curl под ту версию mingw, которая установлена.

Четвертый: скачать MSYS2, установить там curl из репозитория. Из командной строки, или предварительно подключив компилятор оттуда к C::B, скомпилировать пример.

Все пути предполагают удаление pragma comment из кода, и приведение в порядок путей для заголовочных файлов curl.
1
...
4 / 4 / 1
Регистрация: 10.11.2017
Сообщений: 151
31.08.2018, 09:10  [ТС]
Может можно настроить vs на другой режим?

Добавлено через 3 минуты
Когда вместо сборки я запустил компиляцию, он начал сборку, провел ее успешно с одним пропуском. Это нормально, так можно оставить?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.08.2018, 09:10
Цитата Сообщение от sad_guy Посмотреть сообщение
Может можно настроить vs на другой режим?
Можно. На у меня нет под рукой ее сейчас, чтобы сделать вам скриншоты

Ну и проверьте сперва, что библиотека все-таки доступна по пути, который у вас указан.
0
...
4 / 4 / 1
Регистрация: 10.11.2017
Сообщений: 151
31.08.2018, 09:10  [ТС]
Когда вместо сборки я запустил компиляцию, он начал сборку, провел ее успешно с одним пропуском. Это нормально, так можно оставить?
PS нельзя(((
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.08.2018, 09:13
Цитата Сообщение от sad_guy Посмотреть сообщение
Это нормально, так можно оставить?
Понятия не имею
Если exe запускается и работает, значит оставляйте
0
...
4 / 4 / 1
Регистрация: 10.11.2017
Сообщений: 151
31.08.2018, 09:22  [ТС]
Я нашел, где, все было правильно - x86, это про режим сборки
когда запустил отладчик, он указал на прежнюю ошибку, странно что при компиляции она выражается пропуском
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.08.2018, 09:29
sad_guy, Вот тут описаны возможные причины данной ошибки.
https://msdn.microsoft.com/ru-... eyw4s.aspx
Проверьте их все и устраните, если они имеют место.
0
...
4 / 4 / 1
Регистрация: 10.11.2017
Сообщений: 151
31.08.2018, 09:58  [ТС]
Насколько я понял - единственная возможная проблема - переменная среды lib, и решить ее можно только перенеся библиотеку в директорию, созданную vs для библиотек
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.08.2018, 10:06
Цитата Сообщение от sad_guy Посмотреть сообщение
переменная среды lib, и решить ее можно только перенеся библиотеку в директорию, созданную vs для библиотек
Лучше просто пропишите путь к библиотеке в настройках проекта (Configuration Properties => Linker => General => Additional Library directories) (и сделайте его покороче - так же удобнее, не ленитесь организовать себе рабочее окружение).
Потом пропишите имя библиотеки в Configuration Properties => Linker => Input => Additional dependencies.
И путь к заголовочным файлам в Configuration Properties => C/C++ => General => Additional Include directories.

А pragma comment из кода удалите. И #include приведите к форме #include <curl/curl.h>.

Пути тщательнее проверяйте.
0
...
4 / 4 / 1
Регистрация: 10.11.2017
Сообщений: 151
31.08.2018, 10:46  [ТС]
Заработало!)))

Добавлено через 38 минут
Для работы приложения нужна dll в той же директории. Можно ли это как-нибудь убрать?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
31.08.2018, 12:43
Цитата Сообщение от sad_guy Посмотреть сообщение
Можно ли это как-нибудь убрать?
Закинь ее в %SystemRoot%\system32
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.08.2018, 12:43
Помогаю со студенческими работами здесь

Подключение ЖД с пом. SATA, а DVD - привод с пом. IDE
Если подключить к материнке ЖД, на котором будет ОС, с помощью SATA, а DVD-привод подключить с помощью IDE, не будут ли какие-либо проблемы...

Отправка Curl запроса
Подскажите как лучше отправлять в python множество curl запросов? Всё что мне приходит на ум: 1) Создавать много файлов с python...

CURL и отправка Cookie
Всем доброго времени суток. Проблема следующего характера: с помощью cURL прохожу авторизацию на сайте, сохраняю куки в файл на сервере....

Отправка get запроса cURL
Необходимо оптравить get запрос и получить JSON #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string&gt; #include...

Отправка GET запроса средствами CURL
Добрый день! Есть такая проблема: Хочу получить информацию со страницы к примеру:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru