LINUX.ORG.RU

Как отправить письмо на C++?

 ,


0

2

Есть клиент и сервер на C++. При регистрации пользователя надо, чтобы ему на почту отправлялся код подверждения регистрации. Очень желательно, чтобы решение было кроссплатфоменным.



Последнее исправление: user08 (всего исправлений: 1)

Вроде в libcurl есть что-то на эту тему.

anonymous
()

Тебе нужен libcurl, там есть поддержка SMTP.

Deleted
()

простой путь - popen(«sendmail», «w»);

сложный - написать код, реализующий SMTP протокол и отправку письма по нему

Harald ★★★★★
()
Ответ на: комментарий от Harald

простой путь - popen(«sendmail», «w»);

Меня интересует простой путь. Кроме отправки кода регистрации наверное ничего не понадобится. Можно пример? И будет ли работать на виндоусе?

user08
() автор топика

SMTP очень простой текстовый протокол. Посмотри RFC. Клиент пишется на коленке минут за 20 максимум.

xpahos ★★★★★
()
Ответ на: комментарий от user08

Только подскажите, что мне делать с этой строкой

"Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
"rfcpedant.example.org>\r\n"

Я не в курсе зачем это.

user08
() автор топика
Последнее исправление: user08 (всего исправлений: 2)
Ответ на: комментарий от user08

Это для идентификации письма: то, что перед @ должно быть более менее уникально, например рандомно (но может быть и формата YYYYMMDDHHMMSS.random). Когда почтовый клиент красиво показывает переписку как дерево, кто кому отвечал, это благодаря Message-ID, которое при ответе прописывается в поле In-Reply-To.

gag ★★★★★
()
Ответ на: комментарий от user08

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

CURLcode sendEmail(const std::string &from,
                   const std::string &to,
                   const std::string &nameFrom,
                   const std::string &password,
                   const std::string &server,
                   const std::string &subject,
                   const std::string &text)

и быть уверенным, что нигде не ошибся, всё безопасно и потокобезопасно. Есть ли более высокоуровневое решение задачи вроде этого прототипа? - Готовый пример или библиотека.

user08
() автор топика
Последнее исправление: user08 (всего исправлений: 1)
Ответ на: комментарий от user08

Есть ли более высокоуровневое решение задачи вроде этого прототипа?

Вызвать консольный curl и передать ему все нужные параметры

annulen ★★★★★
()
Ответ на: комментарий от Harald

сложный - написать код, реализующий SMTP протокол и отправку письма по нему

Минимально-необходимая реализация согласно rfc совсем несложная.

andreyu ★★★★★
()
Ответ на: комментарий от user08

Я не в курсе зачем это.

Вам же уже предложили прочитать rfc.

andreyu ★★★★★
()
Ответ на: комментарий от gag

Это для идентификации письма: то, что перед @ должно быть более менее уникально, например рандомно (но может быть и формата YYYYMMDDHHMMSS.random). Когда почтовый клиент красиво показывает переписку как дерево, кто кому отвечал, это благодаря Message-ID, которое при ответе прописывается в поле In-Reply-To.

YYYYMMDDHHMMSS - здесь 14 символов. А в dcd7cb36-11db-487a-9f3a-e652a9458efd я насчитал 32. Что из этого делать рандомным, а что YYYYMMDDHHMMSS?

user08
() автор топика
Ответ на: комментарий от Harald

простой не сработает. большинство хостеров мыла тупо не принимают почту с неизвестных им частных мелких серверов. особенно гуголь.

Iron_Bug ★★★★★
()
Ответ на: комментарий от user08

YYYY - год, MM - месяц, DD - день, HH - часы, MM - минуты, SS - секунды. Потом точка. А random - и есть набор произвольных символов, различающийся для каждого письма.

gag ★★★★★
()
Ответ на: комментарий от gag

YYYY - год, MM - месяц, DD - день, HH - часы, MM - минуты, SS - секунды. Потом точка. А random - и есть набор произвольных символов, различающийся для каждого письма.

dcd7cb36-11db-487a-9f3a-e652a9458efd
YYYYMMDD-HHMM-SSrr-rrrr-rrrrrrrrrrrr

так?

user08
() автор топика
Последнее исправление: user08 (всего исправлений: 1)
Ответ на: комментарий от gag

20160827143701.RaNdOmStRiNgasufhdiuvn

Так нормально?

std::string generateMessageId()
{
    const int MESSAGE_ID_LEN = 37;
    time_t t;
    struct tm tm;

    std::string ret;
    ret.resize(15);

    time(&t);
    gmtime_s(&tm, &t);

    strftime((char *)ret.c_str(), MESSAGE_ID_LEN, "%Y%m%d%H%M%S.", &tm);
    ret.reserve(MESSAGE_ID_LEN);

    static const char alphanum[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";

    while (ret.size() < ret.capacity()) {
        ret += alphanum[rand() % (sizeof(alphanum) - 1)];
    }

    return ret;
}
user08
() автор топика
Ответ на: комментарий от Softwayer

Ещё в 2011 в плюсы завезли нормальный рандом, и писать в таком духе не осталось ни одной причины.

А как теперь это пишут?

user08
() автор топика
Ответ на: комментарий от Harald

Для людей, страдающих фобиями по отношению к видео, там также приложены слайды.

Softwayer ★★
()
Ответ на: комментарий от user08

dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org

А что писать вместо rfcpedant.example.org?

Домен сервера, с которого будет осуществляться отправка.

gag ★★★★★
()
Ответ на: комментарий от user08
        ret += alphanum[rand() % (sizeof(alphanum) - 1)];

Нужно только где-то один раз инициализировать генератор: через srand(seed) с неповторяющимся seed (например, кол-во секунд с начала эпохи time()).

gag ★★★★★
()
Последнее исправление: gag (всего исправлений: 1)
Ответ на: комментарий от Chaser_Andrey

Больше велосипедов!

ого у тебя ребрендинг.

Ну вообще это С++, чего ты от него хочешь?

xpahos ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.