При отправке писем через SMTP компоненты Indy в Delphi 7 наталкивался периодически на разные проблемы.
В интернете общего решения не находил - только разрозненные части.
Все решения свел здесь. может кому-то пригодится
procedure SendEmail(
aSmtpServer: string;
aSmtpPort: integer;
aSmtpLogin: string;
aSmtpPassword: string;
aFromAddress: string;
aFromName: string;
aToAddress: string;
aMessageSubject: string;
aMessageText: string;
aAttachmentFileFullName: string;
aUseSSL: boolean = false
);
var
lMessage : TIDMessage;
lSMTP : TIdSMTP;
attach : TIdAttachmentFile;
sslHandler: TIdSSLIOHandlerSocketOpenSSL;
lindystub: Tindystub;
idtTextPart: TIdText;
begin
lMessage:= TIDMessage.Create(nil);
lSmtp:= TIDSmtp.Create(nil);
sslHandler:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);
lindystub:= Tindystub.Create();
try
lSMTP.AuthType:= satDefault;
lSMTP.Host := aSmtpServer; //Хост
lSMTP.Port := aSmtpPort; //Порт (25 - по умолчанию)
lSMTP.Username := aSmtpLogin;
lSMTP.Password := aSmtpPassword;
//-- решаем проблему отправки писем, если у компьютера руссоке имя
lSMTP.HeloName := 'tfo';
//-- отправляем почту через SSL, если надо (пока тестировал только на ukr.net)
if (aUseSSL) then
begin
SSLHandler.Destination := aSmtpServer+':'+IntToStr(aSmtpPort);
SSLHandler.Host := aSmtpServer;
SSLHandler.Port := aSmtpPort;
SSLHandler.DefaultPort := 0;
SSLHandler.SSLOptions.Method := sslvSSLv23;
SSLHandler.SSLOptions.Mode := sslmUnassigned;
lSMTP.IOHandler := SSLHandler;
lSMTP.UseTLS := utUseImplicitTLS;
end;
//-- решаем вопрос кодировки темы письма
lMessage.OnInitializeISO := lindystub.OnInitISO;
lMessage.Subject := aMessageSubject;
lMessage.From.Address := aFromAddress;
lMessage.From.Name := aFromName;
lMessage.Recipients.EMailAddresses:= aToAddress;
//-- решаем вопрос кодировки тела письма
idtTextPart := TIdText.Create(lMessage.MessageParts, nil);
idtTextPart.ContentType := 'text/plain';
idtTextPart.CharSet := 'Windows-1251';
idtTextPart.Body.Text:= aMessageText;
//-- работа со вложенными файлами
if (aAttachmentFileFullName <> '') then
begin
attach:=TIdAttachmentFile.Create(lMessage.MessageParts, aAttachmentFileFullName); //Вложение
end;
//-- собственно отправка
lSMTP.Connect;
try
lSMTP.Send(lMessage);
finally
lSMTP.Disconnect;
end;
finally
sslHandler.Free;
lMessage.Free;
lSmtp.Free;
lindystub.Free;
end;
end;
см. также
EMAIL MESSAGES FROM DELPHI. USING INDY TO SEND E-MAILS