Étrange, j'ai testé plusieurs fois (à différentes heures) orange sans aucun souci d'envoi
Version imprimable
Étrange, j'ai testé plusieurs fois (à différentes heures) orange sans aucun souci d'envoi
Bonjour Serge,
avec quel port testes tu ? 25, 465 ou 587 ? (avec ou sans identifiant et Pswd ?
A+
Charly
Exp : monMail@orange.fr
Dest: MonMail@laposte.net
Serveur smtp : smtp.orange.fr
Port : 465
identifiant : monMail@orange.fr
Password : Mon Mot de Passe de Messagerie Orange
useTLS oui
Ben, c'est quand même un problème, moi aussi, j'ai besoin de mettre cela dans mon appli de gestion associative...Citation:
C'est dommage, car ce n'est pas fiable et je vais abandonner l'idée d'envoyer des mails depuis ma petite application de type contact
Peut-être faudrait-il tester avec un autre serveur que Orange?:scarymov:
Il doit bien y avoir des professionnels de Delphi qui maitrisent ce sujet? :france: Où est-ce secret Défense?:help:
Je continue de travailler sur le sujet... dès que j'ai un peu de temps... Peut-être chercher du côté de ceux qui maitrisent la norme, le protocole...
:pc:
A+
Voilà mon dernier jus du même programme test
Merci beaucoup Serge,
j'ai testé ce matin et aussi en début d'après midi :
avec le port 465 en TSL cela fonctionne assez vite et bien. Il y a quand même parfois des cas ou le message ne part pas (assez rares)
Je vais reprendre ton code dans mon appli (si tu le permet ?) et essayer aussi d'ajouter des Pj ...
Merci encore
A+
Charly
Merci les amis pour vos contributions!
Je n'ai pas testé encore le dernier code de Sergio, mais je garde tout bien précieusement afin de comprendre pourquoi ça bloque chez moi!
J'ai remarqué depuis le début de l'hiver, des problèmes avec ma messagerie Orange qui est très lente à envoyer, valider une option quand je m'en sers! Et d'ailleurs, la connexion de ma LiveBox coupe souvent!
Peut-être est-ce dû à un temps d'attente trop long pour le protocole. Il faudrait que je téléphone à orange pour savoir ce qu'il en est?
Bon WE
A+
jlmat
Bonjour,
je mets le lien de cette discussion au cas où :
https://www.developpez.net/forums/d1...ant-hyperlien/
et un code qui fonctionne avec orange sous Delphi 7 et Indy10.
@+Code:
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 procedure TFAlerte.SendMail; var MonTexte: string; begin cxmemo1.Lines.Clear; idSmtp1.Host := 'smtp.orange.fr'; idsmtp1.Port := 25; IdMessage1.Clear; IdMessage1.From.Text := 'robot@domaine.fr'; IdMessage1.ReplyTo.EMailAddresses := 'DeMail@orange.fr'; IdMessage1.Recipients.EMailAddresses := 'AMail@orange.fr'; IdMessage1.Date := Now; IdMessage1.Subject := 'TEST'; idmessage1.ContentType := 'text/plain'; MonTexte := 'tester les accents, rêvé, donné'; MonTexte := UTF8Encode(MonTexte); idmessage1.Body.Text := MonTexte; // idmessage1.Body.Text := '<a href="https://www.google.fr">CLICK ME</a>'; try idSMTP1.Connect; idSMTP1.Send(idMessage1); idSMTP1.Disconnect; cxMemo1.Lines.Add('SMTP Ok , message envoyé'); except cxMemo1.Lines.Add('Impossible de se connecter au serveur SMTP. E-mail non envoyé'); end; end;
Merci Cantador,
j'ai suivi le fil de cette discussion, mais comme jlmat, je cherchais à envoyer des mails avec D10.3 - ça marche maintenant assez bien, même si parfois j'ai encore des ratés. Je ne sais pas pourquoi.
quand ça marche bien j'arrive à envoyer avec le port 25 sans TLS ou avec le port 465 avec TLS, et avec ou sans PJ.
Pour Info, voici mon code :
A+Code:
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; { ========================================================================== }
Charly
merci Charly910,
c'est le code que je voulais mettre au point..
hélas, pour moi le IdMessageBuilder ne semble pas fonctionner sous D7
j'ai tenté d'intégrer le .pas dans un .dpk de Indy, mais ça plante partout..
@+
cantador
Oui merci Cantador, comme Charly, j'avais suivi vos échanges antérieurs. Mais comme je suis sur 10.3, je m'y mets à fond... Il faut que je m'habitue à l'interface et options... c'est un monstre :ccool:ce 10.3, lol!
Je vous tiens au courant dès que je serais parvenu à des résultats...
A+
oh oui !Citation:
c'est un monstre ce 10.3, lol!
Bonjour,
Tant que le sujet est ouvert, l'un de vous sait-il comment demander une confirmation d'affichage et de lecture par l'intermédiaire de Indy ?
Et, sujet attenant : récupérer ces confirmations pour traitement ? Non pas que je ne sache pas comment récupérer les mails dans une boite mais savoir si ce type de message (ainsi que celui de non-délivrance) est particulier.
J'avoue, je n'ai pas encore cherché, la codification de ce traitement est prévu pour la semaine prochaine mais si vous avez des infos, je prends ;)
Bonjour Serge,
j'ai trouvé ceci sur le net, mais je n'ai pas testé :
A+Code:
1
2
3
4
5
6 // Accusé de réception if checkbox1.Checked then begin idmessage.ReceiptRecipient.Address:='Expediteur@provider.com'; idmessage.Headers.Add('disposition-notification-to: <'+Expediteur@provider.com+'>'); end;
Charly
Bonjour,
j'ai ajouté ceci à mon code :
Comme d'habitude, depuis le serveur smtp.wanadoo.fr, vers gmx.fr, en port 25 sans TLS ou en port 465 avec TLS, j'ai un message sur 5 environ qui part et arrive à destination.Code:
1
2
3 msg.ReceiptRecipient.Address:=FromName; msg.Headers.Add('disposition-notification-to: <'+FromName+'>'); msg.ReceiptRecipient.Text := 'Message reçu ---- ';
J'ai eu quand même 2 essais concluants. Si j'ouvre les messages reçus, j'ai bien le message qui demande si on doit envoyer une confirmation. Mais si je réponds Oui, un message m'informe que la confirmation d'envoi n'a pas pu être envoyée.
Dommage, car si cela fonctionnait on pourrait trier les messages de confirmation avec la propriété ReceiptRecipient.Text
A+
Charly
En tout cas merci pour ces deux pistes intéressantes :plusser:
wanadoo.fr existe encore 8OCitation:
Comme d'habitude, depuis le serveur smtp.wanadoo.fr, vers gmx.fr, en port 25 sans TLS ou en port 465 avec TLS, j'ai un message sur 5 environ qui part et arrive à destination.
as-tu vérifié la négociation avec le serveur via un intercepthandler ?
Oui, a priori le serveur smtp.wanadoo.fr existe encore ainsi que les adresses en wanadoo.fr
pour le intercepthandler je ne sais pas comment faire. Mais j'utilise ton code avec les Hello, certificate, exchange, negotiation et autres bestioles du même genre, code qui fonctionne parfaitement et le serveur se connecte bien
Sinon si je passe par la messagerie Orange le système de confirmation avec Gmx fonctionne bien
A+
Charly
Voici une version qui fonctionne de wanadoo.fr à Gmx.fr en TLS, port 465, avec un accusé de réception :
Pour retrouver le mail envoyé en accusé de réception, il faut tester l'objet :Code:
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 { ===================================================================== } 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 ; // mettre la constante Test2 à True pour afficher l'écho des commandes dans Memo1 Result := False ; LblThread.Caption := ' .... ' ; // C'est un Label 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' ; // Autre Label Application.ProcessMessages ; if Fichier <> '' then begin builder.Attachments.Add(Fichier); F_Mail.Lbl_Mess.Caption := 'Fichier joint' ; // Encore un Label ! 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; msg.ReceiptRecipient.Address:=FromAddress; msg.Headers.Add('disposition-notification-to: '+FromAddress); msg.Headers.Add('Reply-To: '+FromAddress) ; // msg.Headers.Add('X-Originating-IP: [MonAdresseIP]') ; // Fonctionne mais pas indispensable // msg.ReceiptRecipient.Text := 'Message reçu ---- '; // Ne fonctionne pas 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; { ========================================================================== }
'Lu:' + objet du message initial
A+
Charly