5 / 5 / 0
Регистрация: 26.04.2012
Сообщений: 36

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

02.03.2014, 16:15. Показов 45033. Ответов 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
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,892
Записей в блоге: 12
02.03.2014, 16:25
libeay32.dll и ssleay32.dll присутствуют?
1
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 517
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
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. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru