Облазив множество сайтов и форумов в поисках новой процедуры для отправки письма с вложением с помощью Delphi XE 5 (ведь старый способ реализованный в Delphi 7 оказался неработоспособным в Delphi XE 5) я наткнулся наконец-то на нужную мне модернизированную процедуру. И вот здесь решил я её выложить, вдруг кому-нибудь понадобится.
Кидаем на форму три компонента: IdHTTP, IdMessage, IdSSLIOHandlerSocketOpenSSL
В Uses прописываем: idAttachment,IdAttachmentFile
uses idAttachment,IdAttachmentFile;
procedure TForm1.Button2Click(Sender: TObject);
var
attach:TidAttachment;
attach2:TidAttachment;
msg:TIdMessage;
FileDir:string;
att:TIdAttachmentFile;
IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
IdMessage1 := TIdMessage.Create;
IdMessage1.From.Address:=’mail1@yandex.ru’; // адрес первого ящика
IdMessage1.Recipients.EMailAddresses:=’mail2@yandex.ru’; // адрес второго ящика на который прейдет письмо
IdMessage1.Subject:= UTF8Encode(‘234’);
idmessage1.Subject:=AnsiString(‘Привет!’);// тема письма
IdMessage1.Date:= now;{настройка компонентов перед отправкой}
IdSMTP1:= TIdSMTP.Create(nil);IdSMTP1.Host:=’smtp.yandex.ru’;
IdSMTP1.Port:=465; // обычно при использование ssl 495, 587 или стандартный 25
IdSMTP1.Username:=’mail1@yandex.ru’;// адрес первого ящика
IdSMTP1.Password:=’111111′; //пароль от первого ящика с которого шлём письмо
IdSMTP1.AuthType:=satDefault;{это необходимо использовать для SSL}
IdSSLIOHandlerSocketOpenSSL:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IdSSLIOHandlerSocketOpenSSL.Destination := IdSMTP1.Host+’:’+IntToStr(IdSMTP1.Port);
IdSSLIOHandlerSocketOpenSSL.Host := IdSMTP1.Host;
IdSSLIOHandlerSocketOpenSSL.Port := IdSMTP1.Port;
IdSSLIOHandlerSocketOpenSSL.DefaultPort := 0;
IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;
//IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv2;IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;
IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL;
IdSMTP1.UseTLS := utUseImplicitTLS;FileDir:=ExtractFilePath(Application.ExeName)+’file.txt’;
if FileExists(FileDir) then begin
try
IdMessage1.IsEncoded:=true;
att:=TIdAttachmentfile.Create(IdMessage1.MessageParts,FileDir);{отправляем письмо}
IdSMTP1.Connect();
if idsmtp1.Connected then
showmessage(‘Письмо успешно отправлено!’);
IdSMTP1.Send(IdMessage1);
Application.ProcessMessages;
IdSMTP1.Disconnect;
idMessage1.Free;
IdSSLIOHandlerSocketOpenSSL.Free;
idSMTP1.Free;
exceptend;
end;
end;
Да для работы компонента IdSSLIOHandlerSocketOpenSSL вам возможно понадобятся две динамические библиотеки, которые можно скачать перейдя по этой ссылке.
МОЛОДЦОМ (IdSSLIOHandlerSocketOpenSSL…)
«проблема» SSL (ДЛЯ XE 2016 года) —
решилась «вашими» трудами — уже хотел бросить это дело..
.
2. Выскакивала Ошибка (Syntactically invalid EHLO argument(s)).
но другие «молодцы» (MQL4 форум.htm) «нашли решение».
…Имя Компьютера ОБЯЗАТЕЛЬНО должно быть На Английском Языке.
(Мой Компьютер/ПраваяКнопка/ИзменитьИмяПК).
3.
Привет !!! Ваш код не работает если отправляешь с windous 8.
Если отправляешь с ХР то работает, а так выходит ошибка
Мадияр, у меня нет под рукой Windows 8, но я думаю, что вы где-то допустили ошибку. Вот рабочий исходник отправки письма с файлом https://wisekaa.org/loaded/mail.rar протестирован в Windows 7 и Windows 10.
ошибка socterror 10060, использую делфи хе6, винда7
у меня ошибки такой не стало
когда добавил явно
IdSMTP1.ReadTimeout := 1500;
sergey, у меня тоже Delphi XE 6, Windows 7 и всё прекрасно работает.
скачайте файл из комментария, который находится
выше.
тоже самое
Да, может быть именно у вас мой исходник не работает.
Решение:
1) Либо у вас блокирует соединение файрвол;
2) если первый пункт не помог тогда лечить надо так:
http://www.sql.ru/forum/1019696/tidhttp-tidssliohandlersocketopenssl-socket-error-10060-connection-timed-out
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1454589330&n=4
Очень просто, надо кликнуть по компоненту правой кнопкой мыши:
версия такая же
Сергей, проблема (я думаю) не в библиотеке indy, а вашем компе.
Я протестировал свой исходник на ноутбуке с Windows 10, всё работает.
«socterror # 10060 — не удается подключиться к удаленному серверу».
До работающего сервера (smtp.yandex.ru) запросы от программы не доходят, значит нужно копаться в фаерволе или антивирусе, а может и стоит просканировать вашу Ось dr web cureit.
А как можно прикрепить несколько файлов?
На форму кидаем: ListBox, ещё одну кнопку — Button и компонент OpenDialog
procedure TForm1.Button2Click(Sender: TObject);
begin
if (OpenDialog1.Execute) then
begin
ListBox1.Items.Add(OpenDialog1.FileName);
OpenDialog1.FileName:='';
end;
end;
procedure TForm1.send;
var
attach: TidAttachment;
attach2: TidAttachment;
msg: TIdMessage;
Pas: integer;
Pas2, Pas3, FileDir: string;
dwConnectionTypes: DWORD;
att: TIdAttachmentFile;
IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
i : Integer;
begin
IdMessage1 := TIdMessage.Create;
IdMessage1.From.Address := 'mail@yandex.ru'; // с которого шлём письмо
IdMessage1.Recipients.EMailAddresses := 'mail2222@yandex.ru'; // в котором будем получать письмо
IdMessage1.Subject := UTF8Encode('234');
IdMessage1.Subject := AnsiString('Привет.'); // тема письма
IdMessage1.Date := now;
{ настройка компонентов перед отправкой }
IdSMTP1 := TIdSMTP.Create(nil);
IdSMTP1.Host := 'smtp.yandex.ru';
IdSMTP1.Port := 465;
// обычно при использование ssl 495, 587 или стандартный 25
IdSMTP1.Username := 'mail@yandex.ru';
IdSMTP1.Password := '123456789'; // пароль от mail@yandex.ru
IdSMTP1.AuthType := satDefault;
{ это необходимо использовать для SSL }
IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IdSSLIOHandlerSocketOpenSSL.Destination := IdSMTP1.Host + ':' +
IntToStr(IdSMTP1.Port);
IdSSLIOHandlerSocketOpenSSL.Host := IdSMTP1.Host;
IdSSLIOHandlerSocketOpenSSL.Port := IdSMTP1.Port;
IdSSLIOHandlerSocketOpenSSL.DefaultPort := 0;
IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;
IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;
IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL;
IdSMTP1.UseTLS := utUseImplicitTLS;
begin
try
IdMessage1.IsEncoded := true;
if ListBox1.Items.Count > 0 then
for i:=0 to ListBox1.Items.Count-1 do
att:=TIdAttachmentFile.Create(IdMessage1.MessageParts,ListBox1.Items.Strings[i]);
{ отправляем письмо }
IdSMTP1.Connect();
if IdSMTP1.Connected then
showmessage('Письмо успешно отправлено!');
IdSMTP1.send(IdMessage1);
Application.ProcessMessages;
IdSMTP1.Disconnect;
IdMessage1.Free;
IdSSLIOHandlerSocketOpenSSL.Free;
IdSMTP1.Free;
except
end;
end;
end;
Добрый день.
Попробовал Ваш пример. Отправляет все хорошо, но текст письмо с вопросительными знаками приходит.
IdMessage1.Date := now;
idMessage1.Body.Text := ‘Проверка связи’;
Проблема с кодировкой, вот попробуйте этот пример:
http://thedelphi.ru/articles/otpravka-e-mail-cherez-smtp.php
Добрый день.
Пробовал, не помогло. Для информации у меня Delphi XE 10.2
Переделал Ваш код немного.
Проверил, отправка с Яндекса на Майл почту, с прикрепленным файлом и без. В обоих вариантах писал тело письма «текст», приходит нормально, а не «?????».
Windows 10 x64, Delphi Seattle.
var
msg:TIdMessage;
FileDir:string;
att:TIdAttachmentFile;
IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
IdMessage1 := TIdMessage.Create;
IdMessage1.From.Address:=’mail_1′; // от кого отсылаем письмо
IdMessage1.Recipients.EMailAddresses:=’mail_2′; // адрес кому письмо
//IdMessage1.ContentType := ‘text/plain’; //Если включить то все письмо будет крякозябры
IdMessage1.CharSet :=’windows-1251′; // кодировка текста письма из ??? в норм текст
IdMessage1.Subject:=AnsiString(‘Привет!’);// тема письма
IdMessage1.Body.Text:=AnsiString(‘Текст’);// текст письма
IdMessage1.Date:= now;
{настройка компонентов перед отправкой}
IdSMTP1:= TIdSMTP.Create(nil);
IdSMTP1.Host:=’smtp.yandex.ru’; //вводим хост
IdSMTP1.Port:=465; // обычно при использование ssl 495, 587 или стандартный 25
IdSMTP1.Username:=’mail_1′;// от кого отсылаем письмо
IdSMTP1.Password:=’password’; //пароль от кого отсылаем письмо
IdSMTP1.AuthType:=satDefault;
{это необходимо использовать для SSL}
IdSSLIOHandlerSocketOpenSSL:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IdSSLIOHandlerSocketOpenSSL.Destination := IdSMTP1.Host+’:’+IntToStr(IdSMTP1.Port);
IdSSLIOHandlerSocketOpenSSL.Host := IdSMTP1.Host;
IdSSLIOHandlerSocketOpenSSL.Port := IdSMTP1.Port;
IdSSLIOHandlerSocketOpenSSL.DefaultPort := 0;
IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;
//IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv2;
{это необходимо использовать для SSL====}
IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;
IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL;
IdSMTP1.UseTLS := utUseImplicitTLS;
if OpenDialog2.Execute then begin
FileDir :=OpenDialog2.FileName; end; ///заносим в переменную путь открываемого файла
//FileDir:=ExtractFilePath(Application.ExeName)+’BD.mdb’;
if FileExists(FileDir) then //проверим прикрепили ли файл
begin ///отправим с файлом
try
IdMessage1.IsEncoded:=true;
att:=TIdAttachmentfile.Create(IdMessage1.MessageParts,FileDir);
{отправляем письмо}
IdSMTP1.Connect();
if idsmtp1.Connected then
showmessage(‘Письмо успешно отправлено!’);
IdSMTP1.Send(IdMessage1);
Application.ProcessMessages;
IdSMTP1.Disconnect;
idMessage1.Free;
IdSSLIOHandlerSocketOpenSSL.Free;
idSMTP1.Free;
except
end;
end
else
begin ///отправим без файла
{отправляем письмо}
IdSMTP1.Connect();
if idsmtp1.Connected then
showmessage(‘Письмо успешно отправлено!’);
IdSMTP1.Send(IdMessage1);
Application.ProcessMessages;
IdSMTP1.Disconnect;
idMessage1.Free;
IdSSLIOHandlerSocketOpenSSL.Free;
idSMTP1.Free;
end;
IdMessage1.Body:=memo1.Lines;
IdMessage1.CharSet :=’koi8-r’; //само письмо в такой кодировке
IdMessage1.ContentType := ‘multipart/mixed’;
IdMessage1.ContentTransferEncoding := ‘8bit’;
Здравствуйте! Спасибо за работающий пример. Подскажите, если текст письма body написать по-русски, приходят вопросит знаки и ядекс говорит, что текст письма румынский, предлагает перевести. Может еще какое свойство указать RU явно?
Есть ещё один рабочий пример отправки письма на Delphi.
https://wisekaa.org/kak-otpravit-pismo-s-vlozheniem-na-delphi-sposob-2/