Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Сети
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.81/151: Рейтинг темы: голосов - 151, средняя оценка - 4.81
helgboy
4 / 4 / 0
Регистрация: 26.04.2012
Сообщений: 26
1

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

02.03.2014, 16:15. Просмотров 27949. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2014, 16:15
Ответы с готовыми решениями:

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

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

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

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

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

73
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
28325 / 18862 / 7427
Регистрация: 22.10.2011
Сообщений: 32,993
Записей в блоге: 6
02.03.2014, 16:25 2
libeay32.dll и ssleay32.dll присутствуют?
1
wendstor
133 / 133 / 64
Регистрация: 15.05.2012
Сообщений: 504
02.03.2014, 16:54 3
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
1
Вложения
Тип файла: zip indy_openssl096b.zip (461.1 Кб, 1295 просмотров)
helgboy
4 / 4 / 0
Регистрация: 26.04.2012
Сообщений: 26
02.03.2014, 19:03  [ТС] 4
Кинул эти три файла в папку с программой. Теперь сообщение 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
02.03.2014, 19:03
Dianabella
0 / 0 / 0
Регистрация: 17.09.2014
Сообщений: 2
17.09.2014, 22:44 5
Сделала все как написано, но Error conecting with SSL продолжает появляться, подскажите, пожалуйста, возможно еще какой параметр компонент нужно было выставить или что-то не так. Дельфи у меня 7, версия Инди наверное 9 но я его не обновляла, стоит тот что в комплекте...
0
Nick Veremey
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
21.09.2014, 23:29 6
На самом деле, mail.ru требует обязательной аутентификации.
Поэтому эту строчку отставить:
Delphi
1
// IdSocksInfo1.Authentication:=saNoAuthentication;
а вместо нее:
Delphi
1
2
3
IdSocksInfo1.Authentication:=saUsernamePassword;
IdSocksInfo1.Username:='имя';
IdSocksInfo1.Password:='пароль';
Это необходимо, но недостаточно. Все равно не работает.
2
Nick Veremey
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
23.09.2014, 02:23 7
В общем, дела обстоят так. Все заработало, но не с помощью Indy, а с помощью библиотеки Synapse. Только не знаю, должен ли я начать новый топик или писать сюда же... Как модератор распорядится?
2
sts78
0 / 0 / 0
Регистрация: 23.09.2014
Сообщений: 3
23.09.2014, 11:55 8
Nick Veremey - если не секрет, поделитесь кодом, у меня та же проблема, что и у автора темы, по решению helgboy не смог запустить, я тоже только начал изучение, а срочно необходимо переписать на работе отправку почты..(
0
Nick Veremey
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
23.09.2014, 15:46 9
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

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

1. Скачать библиотеку Synapse:
http://www.ararat.cz/synapse/lib/exe/fetch.php/file:synapse40.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
sts78
0 / 0 / 0
Регистрация: 23.09.2014
Сообщений: 3
23.09.2014, 15:52 10
Огромное спасибо за подробную инструкцию! Все четко и ясно и ничего лишнего, благодарю!!
0
NotBeginner
171 / 158 / 71
Регистрация: 22.02.2013
Сообщений: 1,770
Записей в блоге: 2
23.09.2014, 15:52 11
Цитата Сообщение от Nick Veremey Посмотреть сообщение
1. Скачать библиотеку Synapse:
а чем Вас Indy не устраивает?
0
Nick Veremey
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
23.09.2014, 16:02 12
На закуску:

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

Добавлено через 4 минуты
NotBeginner, с Indy я (и не только я - см. выше) долго мучились, и у многих ничего не вышло. Может, надо Indy10 поставить вместо 9, не знаю. Не хотелось бы пакет программ Delphi расковыривать и что-то там менять. А здесь все пошло. И главное удобство - строчек кода в несколько раз меньше! Вот если бы только с отсутствием диагностики разобраться...
2
Nic1305
0 / 0 / 1
Регистрация: 03.09.2014
Сообщений: 1
23.09.2014, 16:08 13
Лучший ответ Сообщение было отмечено 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
sts78
0 / 0 / 0
Регистрация: 23.09.2014
Сообщений: 3
23.09.2014, 16:50 14
у меня на делфи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 15
procedure SendMail ( что указать здесь) при обьявлении этой процедуры.
0
Nick Veremey
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
26.09.2014, 20:39 16
Берик, вот эта строчка
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 17
Спасибо. с объявлением процедуры разобрался. Надо было вставить TForm1. перед Sendmail. У вас там этого нет.
Но все таки не работает. могу ли я Вам выслать исходник?
0
Nick Veremey
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
26.09.2014, 21:11 18
Я писал сюда код не целиком, а фрагментами.
Шапка файла выглядит так:
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 19
Спасибо. Компиляция работает. Письмо не отправляется.

Добавлено через 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
Nick Veremey
10 / 10 / 1
Регистрация: 21.09.2014
Сообщений: 14
26.09.2014, 21:22 20
Который из фигурирующих в тексте адресов "от кого", а который "кому"?
В SendMail сначала должен стоять "кому".
0
26.09.2014, 21:22
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2014, 21:22

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.