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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
| { ===================================================================== }
procedure TF_Mail.Button4Click(Sender: TObject);
Const
NbMax = 3 ; // Nombre maxi d'essai d'envois
Var
Nb : Integer ;
Ok : Boolean ;
Heure1 : TDateTime ;
Heure2 : TDateTime ;
Delta : TDateTime ;
begin
// Il faut déposer plusieurs TLabel sur la fiche ( Lbl_Mess, LblThread, Lbl_Time)
Nb := 0 ;
Ok := False ;
while ((not Ok) And (Nb < NbMax)) do
Begin
Heure1 := Time ;
Nb := Nb + 1 ;
Application.ProcessMessages ;
Lbl_Nb.Caption := 'Essai n° '+ InttoStr(Nb) ;
Application.ProcessMessages ;
SMTPServer2 := edServeur.Text ; // Adresse IP ou nom du serveur SMTP (ex : smtp.orange.fr)
FromName2 := edNom.Text ; // Nom de l'expéditeur (facultatif)
FromAddress2 := edSender.Text ; // Adresse mail de l'expéditeur
ToAddresses2 := edTo.Text ; // Liste des adresses des destinataires séparés par des virgules
CCAddresses2 := EdCC.Text ; // Liste des adresses des destinataires en copie séparés par des virgules
BCCAddresses2 := EdBCC.Text ; // Liste des adresses des destinataires en copie cachée séparés par des virgules
Port12 := StrToInt(EdPort.Text) ; // port Smtp pour l'envoi Ex : 25
User12 := EdLogin.text ; // Adresse de l'expéditeur enregistré sur le serveur SMTP ( = FromAdress en général)
Pswd12 := EdPassword.text ; // Mot de passe de cet expéditeur
Subject2 := edObject.Text ; // Objet du mail
EmailBody2 := Memo.Text ; // Corps du mail
IsBodyHtml2 := False ; // texte en HTML ?
Fichier2 := EdPJ.Text ; // Fichier à mettre en PJ
Ok := SendEmailIndy(
SMTPServer2,
FromName2,
FromAddress2,
ToAddresses2,
CCAddresses2,
BCCAddresses2,
Port12,
User12,
Pswd12,
Subject2,
EmailBody2,
IsBodyHtml2,
Fichier2) ;
Heure2 := Time ;
Delta := Heure2 - Heure1 ;
lbl_Time.Caption := 'Temps écoulé : '+ TimeToStr(Delta)+' (Essai précédent)' ;
End;
if Ok then
Vcl.Dialogs.MessageDlg('Message envoyé - Essai : '+IntToStr(Nb), mtInformation,
[mbOk], 0, mbOk)
Else
Vcl.Dialogs.MessageDlg('Message non envoyé - Essai : '+IntToStr(Nb), mtInformation,
[mbOk], 0, mbOk) ;
End ;
{ ===================================================================== }
Function TF_Mail.SendEmailIndy(
const SMTPServer: string; // Adresse IP ou nom du serveur SMTP (ex : smtp.orange.fr)
const FromName : String; // Nom de l'expéditeur (facultatif)
const FromAddress: string; // Adresse mail de l'expéditeur
const ToAddresses: string; // Liste des adresses des destinataires séparés par des virgules
const CCAddresses: string; // Liste des adresses des destinataires en copie séparés par des virgules
const BCCAddresses: string; // Liste des adresses des destinataires en copie cachée séparés par des virgules
const Port1 : Integer ; // port Smtp pour l'envoi Ex : 25
const User1 : String ; // Adresse de l'expéditeur enregistré sur le serveur SMTP ( = FromAdress en général)
const Pswd1 : String ; // Mot de passe de cet expéditeur
const Subject: string; // Objet du mail
const EmailBody: string; // Corps du mail
const IsBodyHtml: Boolean; // texte en HTML ?
const Fichier : String ) : Boolean ; // Fichier à mettre en PJ
var
SMTP: TIdSMTP; // Uses IdSmtp
msg: TidMessage; // Uses IdMessage
builder: TIdMessageBuilderHtml; // Uses IdMessageBuilder
// IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
Begin
if Test2 then Memo1.Clear ;
Result := False ;
LblThread.Caption := ' .... ' ;
msg := TidMessage.Create(nil);
try
builder := TIdMessageBuilderHtml.Create;
// IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
try
if IsBodyHtml then
begin
builder.Html.Text := EmailBody;
builder.HtmlCharSet := 'utf-8';
builder.HtmlContentTransfer := 'quoted-printable';
end
Else
begin
builder.PlainText.Text := EmailBody;
builder.PlainTextCharSet := 'utf-8';
builder.PlainTextContentTransfer := 'quoted-printable';
end;
F_Mail.Lbl_Mess.Caption := 'Corps du message construit' ;
Application.ProcessMessages ;
if Fichier <> '' then
begin
builder.Attachments.Add(Fichier);
F_Mail.Lbl_Mess.Caption := 'Fichier joint' ;
Application.ProcessMessages ;
end;
builder.FillMessage(msg);
finally
builder.Free;
end;
F_Mail.Lbl_Mess.Caption := 'Fin du builder' ;
Application.ProcessMessages ;
msg.From.Name := FromName;
msg.From.Address := FromAddress;
msg.Subject := Subject;
msg.Recipients.EmailAddresses := ToAddresses;
msg.CCList.EmailAddresses := CCAddresses;
msg.BccList.EmailAddresses := BCCAddresses;
smtp := TIdSMTP.Create(nil);
try
SMTP.Host := SMTPServer ;
SMTP.Port := Port1 ;
SMTP.Username := User1 ;
SMTP.Password := Pswd1 ;
SMTP.AuthType := satDefault ;
// SMTP.IOHandler := IdSSLIOHandlerSocket;
SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1 ;
if useTLS.Checked then
begin
SMTP.UseTLS:=utUseImplicitTLS; // 1
SMTP.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;
end
else
begin
SMTP.UseTLS:=utNoTLSSupport; // 0
End ;
SMTP.Connect;
F_Mail.Lbl_Mess.Caption := 'Serveur SMTP connecté' ;
Application.ProcessMessages ;
try
SMTP.Send(msg);
LblThread.Caption := 'Le message à '+ToAddresses+' a été envoyé' ;
Result := True ;
F_Mail.Lbl_Mess.Caption := 'Message envoyé' ;
Application.ProcessMessages ;
except
LblThread.Caption := 'Erreur : E-mail non envoyé' ;
end;
SMTP.Disconnect;
except
LblThread.Caption := 'Erreur : Impossible de se connecter au serveur SMTP';
end;
Except
LblThread.Caption := 'Erreur : Impossible de créer le message';
End ;
// Ajout
// IdSSLIOHandlerSocket.free ; // J'ai enlevé le create car ça plante
// j'ai déposé le composant IdSSLIOHandlerSocketOpenSSL1 sur la fiche
// et la méthode onStatusInfoEx est ci-dessous
end;
{ ===================================================================== }
procedure TF_Mail.IdSSLIOHandlerSocketOpenSSL1StatusInfoEx(ASender: TObject;
const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType,
AMsg: string);
begin
// Test2 est une constante à True si on veux écrire dans Memo1
if Test2 then memo1.lines.Add(AMsg);
end;
{ ========================================================================== } |
Partager