Bonjour à tous!!!
ok, ça fait longtemps que je ne participe pas mais je vous apporte aujourd' hui une solution à un problème qui ne survient pas souvent.
Il arrive que lorsque l' on veut récupérer le nom de fichier d' un fichier anexé (par la propriété filename), celui-ci est une chaine vide.
Pourquoi?
---------
Je vous ai mis dans le fichier zip un exemple d' un mail que j' ai reçut (je l' ai réduit car les données des anexes etaient grands):
IdMessage.txt contient toute l' info sur le mail reçut (Body+anexes)
Les deux premiers "Messageparts" contiennent le body en format Html/texte
Le message possède 4 anexes dont les données sont dans les fichiers suivants :
ATTACHMENT NR 3.TXT est le contenu d' un anexe dont filename est vide.
ATTACHMENT NR 4.TXT est le contenu d' un anexe dont filename est vide.
ATTACHMENT NR 5.TXT est le contenu d' un anexe dont filename est vide.
ATTACHMENT NR 6.TXT est le contenu d' un anexe dont filename est vide.
Ces 4 anexes sont donc dans le mail donné ici dans IdMessage.txt ...
Comme on peut le voir dans ces 4 fichiers, ces 4 "Messageparts" contiennent ... (roulement de tambour) ... chacun toute l' information d' un mail (body et anexe(s) compris), allez savoir pourquoi!
Ce que je peux vous dire c' est que le mail futr envoyé via Outlook.
Je vous montre alors comment récupérer l' info de ces 4 "Messageparts" de type TidAttachment (TidAttachment=anexe) qui sont eux memes des anexes au mail principal, Body + possibles anexes cette fois sans toucher aux compos Indy.
Le truc est de créer TIdMessage dynamiquement et de lui attribuer le contenu de chaque "Messagepart" du mail principal afin que le compo crée dynamiquement puisse extraire le body+anexes!
--------------------------------------------------------------
Je vous conseille aussi de regarder ma dernière source:
MAILS AVEC INDY10, RÉSOLUTION DU PROBLÈME LORSQUE CHARSET = UTF-8
http://www.delphifr.com/codes/MAILS-AVEC-INDY10-RESOLUTION-PROBLEME-LORSQUE-CHARSET-UTF_43582
Source / Exemple :
IndMsg est l' indice du message que l' on veut récupérer
IdPOP31 est un compo de type TIdPOP3 qui est sur la form FrmPreview
IdMsg est un compo de type TIdMessage qui est sur la form FrmPreview
procedure PREVIEW_MAIL;
var
TOT_MSG, M: Integer;
_Ok: Boolean;
begin
FrmPreview := TFrmPreview.Create(nil);
with FrmPreview do
begin
try
_Ok := false;
RETexto.Lines.Clear; // RichEdit qui contiendra le Body du mail au format Texte
REHtml.Lines.Clear; // RichEdit qui contiendra le Body du mail au format Html
LBAnexos.Items.Clear; // ListBox avec les noms des anexes
IdPOP31.Host := xxx;
IdPOP31.Port := xxx;
IdPOP31.Username := xxx;
IdPOP31.Password := xxx;
IdPOP31.Connect;
TOT_MSG := IdPOP31.CheckMessages; // Nombre de messages
MemUID.Lines.Clear; // memo avec les UID, qui est une valeur unique pour chaque message
IdPOP31.UIDL(MemUID.Lines, -1); // Récupérer les UID des messages ...
IdMsg.Clear;
IdPOP31.Retrieve(IndMsg, IdMsg);
IDMESSAGE_EXTRACT_INFO(IdMsg);
_Ok := true;
finally
if IdPOP31.Connected
then IdPOP31.Disconnect; // Fermer la conexion
if LBAnexos.Items.Count = 0
then LBAnexos.Items.Add('(Aucun anexe)');
if _Ok
then Caption := ' Previsualizar mail'
else Caption := ' Erro ao tentar Previsualizar mail !!!';
ShowModal;
end;
end;
FrmPreview.Release;
end;
end;
// Fonction qui permet de récupérer le Body et les anexes :
procedure TFrmPreview.IDMESSAGE_EXTRACT_INFO(Mensagem: TIdMessage);
var
_a: Integer;
DuplicatedBody: Boolean;
aFileName: String;
procedure OPEN_MAIL_EMBEDDED_IN_ATTACHMENT(Anexo: TIdAttachment);
var
aTmpStream: TMemoryStream;
aTmpIdMsg: TIdMessage;
begin
aTmpStream := TMemoryStream.Create;
aTmpIdMsg := TIdMessage.Create(self);
try
Anexo.SaveToStream(aTmpStream);
aTmpStream.Position := 0; // Revenir au début des donées du Stream ...
aTmpIdMsg.Clear;
aTmpIdMsg.LoadFromStream(aTmpStream);
IDMESSAGE_EXTRACT_INFO(aTmpIdMsg); // On rapelle la fonction pou y retirer les infos ...
finally
FreeAndNil(aTmpStream);
aTmpIdMsg.Free;
end;
end;
begin
DuplicatedBody := False;
for _a := 0 to Mensagem.MessageParts.Count - 1 do
begin
if (Mensagem.MessageParts.Items[_a] is TIdText) // Texto ...
then begin
try
if Mensagem.Body = TIdText(Mensagem.MessageParts.Items[_a]).Body
then DuplicatedBody := True;
if TIdText(Mensagem.MessageParts.Items[_a]).ContentType = 'text/html'
then REHtml.Lines.AddStrings(TIdText(Mensagem.MessageParts.Items[_a]).Body) // text/html
else RETexto.Lines.AddStrings(TIdText(Mensagem.MessageParts.Items[_a]).Body); // text/plain e outros ...
except
end;
end
else begin
aFileName := GetAttachmentFilename(TIdAttachment(Mensagem.MessageParts.Items[_a]));
if aFileName <> '' // Pas de nom pour l' anexe?
then begin
LBAnexos.Items.Add('<' + aFileName + '>');
Activez cette ligne si vous voulez faire le download de l' anexe:
// TIdAttachment(Mensagem.MessageParts.Items[_a]).SaveToFile('c:\_output\' + aFileName);
end
else
OPEN_MAIL_EMBEDDED_IN_ATTACHMENT(TIdAttachment(Mensagem.MessageParts.Items[_a]));
end;
end;
if Pos('This is a multi-part message in MIME format.', Mensagem.Body.Text) = 0
then
if not DuplicatedBody
then RETexto.Lines.AddStrings(Mensagem.Body);
end;
// Quelques fois il y pas de nom pour les images visuzlisées dans le mail
// alors on donne le nom que l' on veut :
function GetAttachmentFilename(aAttachment: TIdAttachment): String;
begin
RESULT := aAttachment.FileName;
if RESULT = ''
then
// Ver se é uma imagem com "cid" mas sem nome para o ficheiro :
if Pos('image', LowerCase(aAttachment.ContentType)) > 0
then begin
RESULT := 'noname';
if Pos('jpeg', LowerCase(aAttachment.ContentType)) > 0
then RESULT := RESULT + '.jpg';
if Pos('jpg', LowerCase(aAttachment.ContentType)) > 0
then RESULT := RESULT + '.jpg';
if Pos('gif', LowerCase(aAttachment.ContentType)) > 0
then RESULT := RESULT + '.gif';
end;
end;
Conclusion :
Les compos Indy ont besoin de pas mal d' amélioration (et de simplification) mais ils ont au moins le mérite d' exister et d' être gratuits !!!
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.