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

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

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

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

Сообщение Ichthyander » 04.08.2023 01:41:37

Проверил нативный socket. ЗАпустил. Пишет, что отправил, но до адресата не доходит. Попробую чуть позже разобраться лучше в чем причина
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 675
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение delphius » 04.08.2023 08:15:35

Ichthyander писал(а):Пишет, что отправил, но до адресата не доходит

Нативный сокет и winsock примеры без ssl, они только через серверы, не требующие обязательного шифрования смогут отправлять и это не боевые примеры, а просто пруф оф концепт, без проверок ошибок.
Строже всего в этом плане пример через cryptlib, но он транспилированный и заточенный напильником, поэтому могут быть тоже проблемы...
delphius
постоялец
 
Сообщения: 122
Зарегистрирован: 18.03.2020 13:40:11

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

Сообщение Ichthyander » 09.08.2023 00:41:21

delphius писал(а):Строже всего в этом плане пример через cryptlib, но он транспилированный и заточенный напильником, поэтому могут быть тоже проблемы...

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

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

Сообщение delphius » 09.08.2023 00:50:01

Ichthyander писал(а):А как подключить cryptlib модуль?

Долил на гитхаб необходимое...
delphius
постоялец
 
Сообщения: 122
Зарегистрирован: 18.03.2020 13:40:11

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

Сообщение Ichthyander » 09.08.2023 01:41:48

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.
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 675
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение delphius » 09.08.2023 15:34:48

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, разниться будут только "надстройки" шифрования.
delphius
постоялец
 
Сообщения: 122
Зарегистрирован: 18.03.2020 13:40:11

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

Сообщение Ichthyander » 15.08.2023 01:26:35

Да, теперь работает. Могу я предложить пуллреквесты? Первое для удобства сбокри демо приложения. И подключения функций через uses
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 675
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение delphius » 15.08.2023 01:44:04

Ichthyander писал(а):Да, теперь работает.

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

Конечно!
delphius
постоялец
 
Сообщения: 122
Зарегистрирован: 18.03.2020 13:40:11

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 122

Рейтинг@Mail.ru