Отправка сообщение на email

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Проверил нативный socket. ЗАпустил. Пишет, что отправил, но до адресата не доходит. Попробую чуть позже разобраться лучше в чем причина
delphius
постоялец
Сообщения: 131
Зарегистрирован: 18.03.2020 12:40:11

Сообщение delphius »

Ichthyander писал(а):Пишет, что отправил, но до адресата не доходит
Нативный сокет и winsock примеры без ssl, они только через серверы, не требующие обязательного шифрования смогут отправлять и это не боевые примеры, а просто пруф оф концепт, без проверок ошибок.
Строже всего в этом плане пример через cryptlib, но он транспилированный и заточенный напильником, поэтому могут быть тоже проблемы...
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

delphius писал(а):Строже всего в этом плане пример через cryptlib, но он транспилированный и заточенный напильником, поэтому могут быть тоже проблемы...
А как подключить cryptlib модуль?
delphius
постоялец
Сообщения: 131
Зарегистрирован: 18.03.2020 12:40:11

Сообщение delphius »

Ichthyander писал(а):А как подключить cryptlib модуль?
Долил на гитхаб необходимое...
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

delphius писал(а):Долил на гитхаб необходимое...
Спасибо. Пока дает ошибку, сразу после ответа SMTP server 220. Видимо лучше ответ-вопросы продолжить на гит? Позже потестю еще. Спасибо за репу.

Код: Выделить всё

SERVER_NAME: smtp.mail.ru
SERVER_PORT: 465
Session established.
Data to send: EHLO fpmail

220 smtp56.i.mail.ru ESMTP ready (Looking for Mail for your domain? Visit https://biz.mail.ru)

Server responce code: 220
Error sending mail.
delphius
постоялец
Сообщения: 131
Зарегистрирован: 18.03.2020 12:40:11

Сообщение delphius »

Ichthyander писал(а):сразу после ответа SMTP server 220
Этот код тестировался только на отправке с gmail, собственно, как и писался исходный на c++.
Но в целом, не должно быть проблем ни с каким сервером, выполняющим rfc. Я проверю на mail.ru, но из лога мне не очень понятно, почему ehlo перед приветом от mail.ru, должно быть наоборот, после установления защищённого соединения сервер высылает 220 и после этого уже клиент говорит привет Я такой-то, на что получает 250 и возможности сервера.

Но в коде есть затык со считыванием ответов из сокета, я думаю проблема где-то там кроется. Вот это вот приветствие сервера, не нужное для клиента, смывается очисткой входящего буфера сокета чтением, перед посылкой нового запроса. Видимо где-то там что-то идёт не так в адаптации для паскаля

Вот лог отправки через gmail

Код: Выделить всё

SERVER_NAME: smtp.gmail.com
SERVER_PORT: 465
Session established.
Data to send: EHLO fpmail

250-smtp.gmail.com at your service
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8

Server responce code: 250
EHLO ok
Data to send: AUTH LOGIN
Upd: Поправил репу на гитхабе.
Банально была нужна временная задержка между установлением защищенного соединения и очисткой буфера от приветственного сообщения сервера, которое он просто не успевает отдать во входящий буфер сокета на стороне клиента, при этом гугл получается отдает быстрее:

Код: Выделить всё

// Activate the session
    RetVal := cryptSetAttribute(hSess, CRYPT_SESSINFO_ACTIVE, 1);
    if RetVal <> CRYPT_OK then
    begin
      sErr := 'SESSINFO_ACTIVE ERROR: ' + Err2Str(RetVal) + ' ' + ErrExStr(hSess);
      FuncRet := -10;
      Break;
    end
    else writeln('Session established.');

    Sleep(100); // Вот тут нужно немного подождать! Думаю 100 мс вполне достаточно!

    // Discard initial response created by connecting
    RetVal := TLSPop(hSess, sErr, sReply, 0);
    if RetVal < 0 then
    begin
      FuncRet := -12;
      Break;
    end;
Ну и надеюсь, что в настройках включены внешние сервисы и настроен пароль приложения

Наверное, имеет смысл переписать все в виде подключаемых модулей с одной "торчащей функцией", унифицировать их максимально, чтобы проще было комбинировать, потому что во всех нативных модулях будет одинаковая реализация протокола smtp, разниться будут только "надстройки" шифрования.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Да, теперь работает. Могу я предложить пуллреквесты? Первое для удобства сбокри демо приложения. И подключения функций через uses
delphius
постоялец
Сообщения: 131
Зарегистрирован: 18.03.2020 12:40:11

Сообщение delphius »

Ichthyander писал(а):Да, теперь работает.
Отлично!
Ichthyander писал(а):Могу я предложить пуллреквесты?
Конечно!
Ответить