Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/205: Рейтинг темы: голосов - 205, средняя оценка - 4.63
5 / 5 / 0
Регистрация: 26.04.2012
Сообщений: 36

Как использовать SSL для отправки почты на Delphi 7 Indy 9

02.03.2014, 16:15. Показов 44855. Ответов 73

Студворк — интернет-сервис помощи студентам
Прошу помощи в реализации кода для отправки почты. Не прошу сделать все за меня, программа уже многое время работала но недавно на mail.ru сделали обязательным SSL. Если кто знает объясните что надо подключить и как прилепить SSL к IdSMTP . Возможно ли это сделать без установки Indy 10?

Добавлено через 13 часов 31 минуту
Неужели никто не знает? Я на форму кинул TIdSSSLIOHandlerSocket , TIdSocksInfo
Для IdSocksInfo1 задал свойства Username Pasword соответствующие логин и паролю ящика а также Port 465 Version svNoSocks
Для IdSSLIOHandlerSocket1 задал SSLOptions.metod sslvSSLv2 - ну пробовал и другие варианты
В коде писал примерно это
Delphi
1
2
3
4
5
6
7
8
9
  IdSSLIOHandlerSocket1.SocksInfo:=IdSocksInfo1;
  idSmtp1.IOHandler := IdSSLIOHandlerSocket1;
  idSmtp1.Host := 'smtp.mail.ru';
  idMessage1.Body.Text := ' Hello World ';
  idMessage1.From.Text := 'mymailsend@mail.ru';
  idMessage1.Recipients.EMailAddresses := 'vasyapupkin@mail.ru';
  idMessage1.Subject := 'tema ';
  
  idSmtp1.Connect(15000);
Выдает разные ошибки в зависимости от вариаций, то какие то библиотеки требует то еще что то, есть у кого рабочий примерчик как это делать?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.03.2014, 16:15
Ответы с готовыми решениями:

Можно ли для отправки почты из asp использовать MAPI?
а можно ли для отправки почты из asp использовать MAPI?

Как правильно использовать класс отправки почты из формы?
уважаемы кодеры помогите разобраться с кодом!? как мне правильно поставить приписать к почте Class 1 ? пример кусок начало Public Class...

Можно ли использовать учетную запись outlook на сервере для отправки почты со страниц АСП???
Уважаемые ГУРУ!!! Ищу выход из ситуации, с SMTP сервером лажа..... Можно ли использовать учетную запись outlook на сервере для...

73
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,863
Записей в блоге: 12
02.03.2014, 16:25
libeay32.dll и ssleay32.dll присутствуют?
1
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 516
02.03.2014, 16:54
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
    idSmtp1.Host := 'smtp.mail.ru';
  idMessage1.Body.Text := ' Hello World ';
  idMessage1.From.Text := 'XXXX@mail.ru';
  idMessage1.Recipients.EMailAddresses := 'YYYY@mail.ru';
  idMessage1.Subject := 'tema ';
 
  IdSSLIOHandlerSocket1.SSLOptions.Method := sslvTLSv1;
 
 
  idSmtp1.Connect;
  idSmtp1.Send(IdMessage1);
  idSmtp1.Disconnect;
Ниже прикрепил библу SSL
Вложения
Тип файла: zip indy_openssl096b.zip (461.1 Кб, 1517 просмотров)
1
5 / 5 / 0
Регистрация: 26.04.2012
Сообщений: 36
02.03.2014, 19:03  [ТС]
Кинул эти три файла в папку с программой. Теперь сообщение Error conecting with SSL . В socksinfo не понятно какой порт ставить такой же как и в Smtp 465? Или 1080? а еще Authentication = saUsernamePassword или правильно saNoAuthentication

Добавлено через 21 минуту
Ура! кажется заработало, один вопрос файл openssl.exe я так полагаю не обязательно должен быть в папке с программой? Сейчас все причешу в программе и скину решение, наверняка многим пригодиться, 2 дня убил на это(с учетом что я новичек:-) )

Добавлено через 26 минут
Итак кидаем на форму два компонента TIdSSLIOHandlerSocket находится в Indy I/O Handlers и
TIdSocksInfo находится в Indy Misc
Пишем код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    
    IdSocksInfo1.Authentication:=saNoAuthentication;
    IdSocksInfo1.Port:=465;
    IdSocksInfo1.Version:=svNoSocks;
    IdSSLIOHandlerSocket1.SocksInfo:=IdSocksInfo1;
    IdSSLIOHandlerSocket1.SSLOptions.Method:=sslvTLSv1;
    idSmtp1.IOHandler:= IdSSLIOHandlerSocket1;
    idSmtp1.Host := 'smtp.mail.ru';
    //не забываем другие настройки SMTP логин и пароль
    idMessage1.Body.Text := 'Сообщение ';
    idMessage1.From.Text := 'mymail@mail.ru';
    idMessage1.Recipients.EMailAddresses := 'vasyadrug@mail.ru';
    idMessage1.Subject := 'hello ';
    idSmtp1.Connect(15000);
    idSmtp1.Send(idMessage1);
    idSmtp1.Disconnect;
Ну и конечно кидаем два файла который предоставил нам любезно wendstor . Маленький вопрос к спецам, а как же эти две dll самостоятельно прицепились к проекту? Если я их нигде в программе не объявлял? Это где то прописано в самих компонентах Indy ?
2
0 / 0 / 0
Регистрация: 17.09.2014
Сообщений: 2
17.09.2014, 22:44
Сделала все как написано, но Error conecting with SSL продолжает появляться, подскажите, пожалуйста, возможно еще какой параметр компонент нужно было выставить или что-то не так. Дельфи у меня 7, версия Инди наверное 9 но я его не обновляла, стоит тот что в комплекте...
0
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
21.09.2014, 23:29
На самом деле, mail.ru требует обязательной аутентификации.
Поэтому эту строчку отставить:
Delphi
1
// IdSocksInfo1.Authentication:=saNoAuthentication;
а вместо нее:
Delphi
1
2
3
IdSocksInfo1.Authentication:=saUsernamePassword;
IdSocksInfo1.Username:='имя';
IdSocksInfo1.Password:='пароль';
Это необходимо, но недостаточно. Все равно не работает.
2
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
23.09.2014, 02:23
В общем, дела обстоят так. Все заработало, но не с помощью Indy, а с помощью библиотеки Synapse. Только не знаю, должен ли я начать новый топик или писать сюда же... Как модератор распорядится?
2
0 / 0 / 0
Регистрация: 23.09.2014
Сообщений: 3
23.09.2014, 11:55
Nick Veremey - если не секрет, поделитесь кодом, у меня та же проблема, что и у автора темы, по решению helgboy не смог запустить, я тоже только начал изучение, а срочно необходимо переписать на работе отправку почты..(
0
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
23.09.2014, 15:46
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

sts78, код сейчас вышлю, но прежде надо сделать ряд вещей:

1. Скачать библиотеку Synapse:
http://www.ararat.cz/synapse/l... apse40.zip
2. Положить содержимое архива в произвольную папку, но чтобы в пути не было символов кириллицы, и чтобы эта папка не менялась.
3. Найти в ней файл smtpsend.pas
4. Раскомментировать строчку
Delphi
1
SMTP.AutoTLS := True;
5. Открыть Delphi,
в меню Tools открыть Environment Options, вкладка Library
(у меня Delphi 7, в более новых - Tools -> Options -> Environment Options).
6. Там прописать путь к папке Lib из вышеустановленного пакета (добавить к уже имеющимся путям). Проделать это нужно дважды: 1) для Library Path; 2) для Browsing Path (там все увидите).
В обоих случаях указать путь к Lib и нажать кнопку Add.
7. После окончательного "Ok" библиотека в Delphi прописана - можно работать.

Далее: нужно скачать из Интернета (ссылку не помню, но легко найти поисковиком) библиотеки libeay32.dll и ssleay32.dll. Я их кладу и в парку, где лежит проект, и в папку с исполняемым модулем. Т.е., таскаю их всюду за собой. В Delphi я их не прописываю - неизвестно, может там файлы с такими именами уже есть, как бы не было конфликта...

Вроде, все. Следующим сообщением высылаю код.

Добавлено через 6 минут
Вот, собственно, код:

1. Uses в заголовке:
Delphi
1
2
3
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ssl_openssl, StdCtrls, Buttons, SMTPSend, MIMEPart, MIMEMess;
2. Вызов вспомогательной процедуры и сама процедура:

Delphi
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
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  SendMail('smtp.mail.ru', 'тема сообщения', 'e-mail получателя', 'e-mail отправителя', 'Текст сообщения', '');
end;
 
Procedure SendMail (pHost, pSubject, pTo, pFrom , pTextBody, pHTMLBody : string);
var
  tmpMsg : TMimeMess;
  tmpStringList : TStringList;
  tmpMIMEPart : TMimePart;
begin
  tmpMsg := TMimeMess.Create;
  tmpStringList := TStringList.Create;
  try
    // Headers
    tmpMsg.Header.Subject := pSubject;
    tmpMsg.Header.From := pFrom;
    tmpMsg.Header.ToList.Add(pTo);
    // MIMe Parts
    tmpMIMEPart := tmpMsg.AddPartMultipart('alternate',nil);
    if length(pTextBody)<>0 then
    begin
      tmpStringList.Text := pTextBody;
      tmpMsg.AddPartText(tmpStringList, tmpMIMEPart);
    end
    else
    begin
      tmpStringList.Text := pHTMLBody;
      tmpMsg.AddPartHTML(tmpStringList, tmpMIMEPart);
    end;
    // Encode and send
    tmpMsg.EncodeMessage;
    smtpsend.SendToRaw(pFrom, pTo, pHost, tmpMsg.Lines, '<Ваш username>', '<Ваш пароль>');
  finally
    tmpMsg.Free;
    tmpStringList.Free;
  end;
end;
3
0 / 0 / 0
Регистрация: 23.09.2014
Сообщений: 3
23.09.2014, 15:52
Огромное спасибо за подробную инструкцию! Все четко и ясно и ничего лишнего, благодарю!!
0
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2
23.09.2014, 15:52
Цитата Сообщение от Nick Veremey Посмотреть сообщение
1. Скачать библиотеку Synapse:
а чем Вас Indy не устраивает?
0
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
23.09.2014, 16:02
На закуску:

Присоединение файла (после tmpMIMEPart):
Delphi
1
    tmpMsg.AddPartBinaryFromFile (CurrentAttachedFileName, nil);
И еще просьба. У меня эта штука работает, но я сразу заметил одну проблему. Начисто нет никакой диагностики и обработки ошибок. Например, эта хреновина бодро и радостно "отправляет" сообщения при выключенном интернете О мелких неполадках в соединении я даже молчу. Если кто разберется в этом - поделитесь, pls, как выводить и обрабатывать те или иные исключения. Например, "не удалось соединиться с сервером", "не удалось отправить сообщения", и др. Заранее спасибо!

Добавлено через 4 минуты
NotBeginner, с Indy я (и не только я - см. выше) долго мучились, и у многих ничего не вышло. Может, надо Indy10 поставить вместо 9, не знаю. Не хотелось бы пакет программ Delphi расковыривать и что-то там менять. А здесь все пошло. И главное удобство - строчек кода в несколько раз меньше! Вот если бы только с отсутствием диагностики разобраться...
2
0 / 0 / 1
Регистрация: 03.09.2014
Сообщений: 1
23.09.2014, 16:08
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

У меня заработало так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//***********************************************
if IdSMTP1.Connected then
  begin
    IdSMTP1.Disconnect;
  end;
   IdSocksInfo1.Authentication:=saNoAuthentication;
    IdSocksInfo1.Port:=465;
    IdSocksInfo1.Version:=svNoSocks;
    //SSLHandler.sSSLSocket:=IdSocksInfo1;
    SSLHandler.SSLOptions.Method:=sslvTLSv1;
  IdMessage1.Clear; // очищаю письмо
  IdSMTP1.IOHandler := SSLHandler; //устанавливаем SSL Handler для IdPOP3 SMTP
     IdSMTP1.UseTLS := utUseImplicitTLS;  //использовать неявный TSL
  SSLHandler.SSLOptions.Method := sslvTLSv1;
  IdSMTP1.Host := 'smtp.yandex.ru';
  IdSMTP1.Port := 465;        // обычно при использование ssl 495, 587 или стандартный 25
  // SetupSSL;  // настройка SSL соединения
  IdSMTP1.AuthType := satDefault;
  IdSMTP1.UserName := 'name';
  IdSMTP1.Password := 'parol';
  IdMessage1.From.Name :=' *** '; // От кого
  IdMessage1.From.Address := 'name@yandex.ru'; // EMail-От кого;
 
//***********************************************
+ выше описанные файлики в папке с проектом.
0
0 / 0 / 0
Регистрация: 23.09.2014
Сообщений: 3
23.09.2014, 16:50
у меня на делфи7 тоже с инди не вышло, может из-за недостатка опыта, а пример выше от Nick Veremey реально заработал на mail.ru через 5 минут после прочтения текста )

по диагностике - я поставил себе

if smtpsend.SendToRaw(pFrom, pTo, pHost, tmpMsg.Lines, '<******@mail.ru>', '<*********>') then edit2.Text:='sent!' else edit2.Text:='not sent!';

не могу сказать насколько оно точно работает, но пока полчаса тестирую на своих ящиках - вроде работает
0
0 / 0 / 0
Регистрация: 26.09.2014
Сообщений: 12
26.09.2014, 20:28
procedure SendMail ( что указать здесь) при обьявлении этой процедуры.
0
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
26.09.2014, 20:39
Берик, вот эта строчка
Delphi
1
  Procedure SendMail (pHost, pSubject, pTo, pFrom , pTextBody, pHTMLBody : string);
указывается дословно в конце списка переменных var наверху.
0
0 / 0 / 0
Регистрация: 26.09.2014
Сообщений: 12
26.09.2014, 21:03
Спасибо. с объявлением процедуры разобрался. Надо было вставить TForm1. перед Sendmail. У вас там этого нет.
Но все таки не работает. могу ли я Вам выслать исходник?
0
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
26.09.2014, 21:11
Я писал сюда код не целиком, а фрагментами.
Шапка файла выглядит так:
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ssl_openssl, StdCtrls, Buttons, SMTPSend, MIMEPart, MIMEMess;
 
type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
  Procedure SendMail (pHost, pSubject, pTo, pFrom , pTextBody, pHTMLBody : string);
 
implementation
 
{$R *.dfm}
Далее - конкретные процедуры.
А что именно не работает, компиляция или исполняемый файл?
0
0 / 0 / 0
Регистрация: 26.09.2014
Сообщений: 12
26.09.2014, 21:16
Спасибо. Компиляция работает. Письмо не отправляется.

Добавлено через 1 минуту
Delphi
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
Procedure TForm1.SendMail (pHost, pSubject, pTo, pFrom , pTextBody, pHTMLBody : string);
var
  tmpMsg : TMimeMess;
  tmpStringList : TStringList;
  tmpMIMEPart : TMimePart;
begin
  tmpMsg := TMimeMess.Create;
  tmpStringList := TStringList.Create;
  try
    // Headers
    tmpMsg.Header.Subject := pSubject;
    tmpMsg.Header.From := pFrom;
    tmpMsg.Header.ToList.Add(pTo);
    // MIMe Parts
    tmpMIMEPart := tmpMsg.AddPartMultipart('alternate',nil);
    if length(pTextBody)<>0 then
    begin
      tmpStringList.Text := pTextBody;
      tmpMsg.AddPartText(tmpStringList, tmpMIMEPart);
    end
    else
    begin
      tmpStringList.Text := pHTMLBody;
      tmpMsg.AddPartHTML(tmpStringList, tmpMIMEPart);
    end;
    // Encode and send
    tmpMsg.EncodeMessage;
    smtpsend.SendToRaw(pFrom, pTo, pHost, tmpMsg.Lines, '<b7058889950>', 'пароль');
  finally
    tmpMsg.Free;
    tmpStringList.Free;
  end;
 
  end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
    SendMail('smtp.mail.ru', 'ТЕМА', 'berik27@mail.ru', 'b7058889950@mail.ru', 'содержание', '');
end;
 
end.
Добавлено через 1 минуту
Получатель Berik27@mail.ru
0
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
26.09.2014, 21:22
Который из фигурирующих в тексте адресов "от кого", а который "кому"?
В SendMail сначала должен стоять "кому".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.09.2014, 21:22
Помогаю со студенческими работами здесь

Как настроить php.ini для отправки почты
при использование mail() не приходят письма на почту, никакой ошибки не выдает просто нету писем. раньше форма работала но когда поменял...

Как указать порт для отправки почты в PowerShell 2.0?
Приветствую! Как указать порт для отправки почты в powershell 2.0. В поздних версиях есть параметр -Port, а тут нет. Если можно, пример...

Как сделать форму для отправки почты и узнать мэил отправителя?
У меня возникла необходимость в добавлении на мою страничку ссылки 'Написать автору' при нажатии на которую откроется форма для ввота...

Как спрятать Indy SSL?
Как спрятать Indy SSL? Просто мне не удобно когда dll лежат в папке, мне бы их внедрить как-то, это возможно?

Код для отправки письма на мыло по ssl
помогите написать код для отправления письма по ssl на одну из почт(Yandex,Mail,Gmail,rambler)


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru