Page 1 sur 1

Perte des pièces jointes en provenance de MAC

MessagePublié: 08 Sep 2010 à 14:45
par informatiquepadr
Bonjour,

Nous utilisons une base journal qui fait tourner un agent qui reçoit le courrier en arrivée, qui collecte les différentes informations du mail (expéditeur, date, body, etc...) et les copie dans un nouveau document, dans la vue Courrier en Arrivée.

Pour simplifier le problème, tout fonctionne bien depuis plusieurs années en ce qui concerne les mails envoyés depuis des OS Windows, par contre dès qu'un mail est envoyé depuis un MAC, nous avons le texte mais la ou les pièces jointes sont systématiquement manquantes (après plusieurs vérifications, le mail arrive bel et bien entier à l'agent, la perte s'effectue après traitement).

Une différence que j'ai remarqué est qu'un mail "normal" à un seul champ Body de type Texte Riche, alors que le mail MAC à plusieurs champs Body (10) de type MIME. Je ne sais pas si le problème viens de là.

Voici le code en question :


Code : Tout sélectionner
Sub Initialize
   
   On Error Goto ErrorRoutine
   
   Dim s As New notesSession
   Dim db As notesDatabase
   Dim coldoc As notesdocumentCollection
   Dim doc As notesdocument
   Dim docMail As notesdocument
   Dim docParam As notesdocument
   
   Set db = s.CurrentDatabase
   Set docMail = s.DocumentContext
   
   Set docParam = db.GetProfileDocument("FrmPrm")
   
   If docParam Is Nothing Then
      Msgbox "AGENT ROUTAGE MAIL BD :  " & db.FileName & " L'agent ne recupère pas le document de parametrage FrmPrm "
   End If
   
   If docMail Is Nothing Then
      Msgbox "AGENT ROUTAGE MAIL BD :  " & db.FileName & "  L'agent ne recupère aucun mail à router"
      Exit Sub
   End If
   
   If  Not docMail Is Nothing Then
      
      Set doc = New notesdocument(db)
      
      
      Call doc.ReplaceItemValue("EvnEmisLe" , Now)
      Call doc.ReplaceItemValue("EvnEmisPar", docMail.GetItemValue("From")(0) )
      Call doc.ReplaceItemValue("EvnMajLe" , Now)
      Call doc.ReplaceItemValue("PostedDate", Now)
      Call doc.ReplaceItemValue("EvnMajPar", docMail.GetItemValue("From")(0))
      Call doc.ReplaceItemValue("EvnEmtNom", docMail.GetItemValue("From")(0))
      Call doc.ReplaceItemValue("EvnLectTxt" , docParam.GetItemValue("DftCrrLct")(0) )
      Call doc.ReplaceItemValue("EvnAutTxt", docParam.GetItemValue("DftCrrMaj")(0) )
      Call doc.ReplaceItemValue("EvnEmtEtb", Strtoken(docMail.GetItemValue("From")(0) , "@", 2 ) )
      Call doc.ReplaceItemValue("EvnObj", docMail.GetItemValue("Subject")(0) )
      
      Call doc.replaceItemValue("SendTo", docMail.getItemValue("SendTo") )
      Call doc.ReplaceItemValue("Subject", docMail.GetItemValue("Subject")(0) )
      
      Call doc.replaceItemValue("CopyTo", docMail.getItemValue("CopyTo") )
      
      Dim readersItem As New NotesItem(doc, "EvnLect_calculé",  "", READERS)
      Dim authorsItem As New NotesItem(doc, "EvnAuteur_calculé", "", AUTHORS)
      
      Call readersItem.AppendToTextList(docParam.GetItemValue("DftCrrLct")(0))
      Call readersItem.AppendToTextList("[admin]")
      
      Call authorsItem.AppendToTextList(docParam.GetItemValue("DftCrrMaj")(0))
      Call authorsItem.AppendToTextList("[admin]")
      
      If docMail.GetItemValue("ReplyDate")(0) = "" Then
         Call doc.ReplaceItemValue("EvnSit", "")
         Call doc.ReplaceItemValue("EvnEch" , "")
      Else
         Call doc.ReplaceItemValue("EvnSit", "A faire")
         Call doc.ReplaceItemValue("EvnEch" , docMail.GetItemValue("ReplyDate")(0) )
      End If
      
      Dim ItemNom As NotesItem
      Set ItemNom = doc.GetFirstItem("EvnEmtNom")
      If  ItemNom.Contains({"}) Then
         ItemNom.Values = Strtoken(ItemNom.Values ,{"}, 1 )
      End If
      Dim ItemEmbEtb As NotesItem
      Set ItemEmbEtb = doc.GetFirstItem("EvnEmtEtb")
      If  ItemEmbEtb.Contains({>}) Then
         ItemEmbEtb.Values = Strtoken(ItemEmbEtb.Values ,{>}, 1 )
      End If
      
      Dim itemA As NotesItem
'...set value of doc...
      Set itemA = docMail.GetFirstItem( "Body" )   
   '   Call itemA.CopyItemToDocument( doc, "Body_1" )
      Call itemA.CopyItemToDocument( doc, "Body" )
      
      
      
      Call doc.ReplaceItemValue("DisplaySent",  doc.GetItemValue("EvnEmtNom")(0) )
      Call doc.ComputeWithForm(True, False)
      Call doc.ReplaceItemValue("Form" , "MemoArr")
      Call doc.Save(True, False)
      
      Call doc.PutInFolder( "DssArriv" , True )
      Msgbox "AGENT ROUTAGE MAIL BD : Mail routé dans le dossier Courrier en Arrivée"
      Call docMail.Remove(True)
   End If
   
   Msgbox "AGENT ROUTAGE MAIL BD : " & db.FileName & " Fin Exécution"
   Exit Sub
   
ErrorRoutine :
   Msgbox "Erreur Agent Routage Mail " & db.FileName  & " "&  Str(Erl) & ": " & Error$
   Call docMail.PutInFolder("Mail Non Traite" , True)
   Exit Sub
   
End Sub


Voyez vous ce qui pourrait expliquer la perte de pièce jointe ?

Merci d'avance.
Cordialement,
Guillaume.

MessagePublié: 08 Sep 2010 à 14:49
par Michael DELIQUE
salut

ce code détache toutes les pj, regarde s'il ne retrouverait tes pj en provenance d'un mac ?

=> http://forum.dominoarea.org/detacher-le ... 11940.html

MessagePublié: 08 Sep 2010 à 14:58
par LSong
dans ton code tu copie un seul body
hors effectivement il peut y en avoir plusieurs

s'il y en a plusieurs :

tu peu y acceder en faisant un parcour de docMail.items
je ne sais pas si tu les aura toujours dans le bon ordre

tu peu aussi faire un remove du body et refaire un getFirstItem ("body") tu auras le suivant etc ... jusqu'au moment ou ca te renvois nothing

MessagePublié: 08 Sep 2010 à 22:44
par roubech
bonjour,

Lorsqu'un mail vient d'internet il est au format MIME
Lorsqu'un mail vient d'un autre client Notes du même domaine, à priori, il est au format RichText
Mais il peut y avoir d'autres facteurs :
paramétrage du client pour forcer un envoi au format MIME
paramétrage du compte qui reçoit pour forcer un format particulier
...

il faut donc vérifier ces différents paramètres.

De plus, avant de manipuler des mails au format MIME, regarder l'aide pour notesSession.ConvertMIME

MessagePublié: 09 Sep 2010 à 09:01
par informatiquepadr
Merci pour votre réactivité!

A la place de:
Code : Tout sélectionner
Set itemA = docMail.GetFirstItem( "Body" )   
Call itemA.CopyItemToDocument( doc, "Body" )


On a mis:
Code : Tout sélectionner
Set itemA = docMail.GetFirstItem( "Body" )   
While Not itemA Is Nothing
   Call itemA.CopyItemToDocument( doc, "Body" )
   Call itemA.Remove()
   Set itemA = docMail.GetFirstItem( "Body" )
Wend


Nous rencontrions le même problème avec des mails venant d'Evolution, la messagerie d'Ubuntu. Et la modification a permis de corriger le problème.
Mais le problème persiste toujours pour les clients MAC.

On va se pencher sur le: notesSession.ConvertMIME et la fonction de Michael DELIQUE.

MessagePublié: 09 Sep 2010 à 14:22
par informatiquepadr
Bonjour,

La fonction d'extraction ne semble pas fonctionner sur un mail normal :
Code : Tout sélectionner
Call FileDetach(docMail, "Body", "D:\PJ", "test.txt")


J'envoie un mail contenant une pièce jointe non vide "test.txt", et celle-ci n'est pas copiée dans le répertoire "D:\PJ" que j'ai créé.

Y a-t-il un paramètre erroné dans l'appel ci-dessus ?

Cordialement,
Guillaume.

EDIT : le notesSession.ConvertMIME est bien défini sur True par défaut

MessagePublié: 09 Sep 2010 à 14:44
par LSong
s'il y a pas de body mais un beau mime a mon avis la fonction y arrivera pas
peu-etre en regardant les embbede directement dans le document

doc.EmbeddedObjects

tu as un array avec les attachements

if doc.HasEmbedded then
forall emb in doc.EmbeddedObjects
emb.extractFile ("c:\temp\" & emb.name)
end forall
end if

j'ai écrit ca a la vote sans tester mais il doit y avoir la base
tu peu aussi chercher les champs $file

MessagePublié: 09 Sep 2010 à 14:56
par informatiquepadr
J'ai testé la fonction sur un mail envoyé depuis une boite mail Lotus, vers notre base journal où l'agent tourne. A priori le mail est bien en Texte Riche, et il y a bien un Body.

Probablement une erreur de placement de code de mon côté ou de syntaxe, je ne suis nullement expert dans le domaine. Je vérifie pour être sûr.

Cordialement,
Guillaume.

EDIT : Il fallait "autoriser les opérations restreintes" dans les propriété de l'agent... Bon, on teste avec un mail envoyé depuis un MAC et on vous tiens au courant.

MessagePublié: 10 Sep 2010 à 15:42
par informatiquepadr
Bonjour,

La fonction récupère bien une pièce jointe pour un mail Lotus (envoyé en Texte Riche), mais pas pour un mail MAC.

Il y a donc bien un format particulier du mail envoyé depuis un MAC.
Nous sommes en train de faire divers tests.

Si vous avez des idées, nous sommes preneur.
Merci.

Cordialement,
Guillaume.

MessagePublié: 13 Sep 2010 à 14:11
par informatiquepadr
Bonjour,

Nous avons trouvé la solution, à la place de copier un ou plusieurs "Body", on copie tous les items (CopyAllitems) :

Code : Tout sélectionner
Sub Initialize
   On Error Goto ErrorRoutine
   Dim s As New notesSession
   Dim db As notesDatabase
   Dim doc As notesdocument
   Dim docMail As notesdocument
   Dim NotifDocMail As notesdocument   
   Dim docParam As notesdocument
   Dim ItemNom As NotesItem
   Dim BaseCourrier As String      
   
   Set db = s.CurrentDatabase
   Set NotifDocMail = New notesdocument(db)
   Set docMail = s.DocumentContext
   Set docParam = db.GetProfileDocument("FrmPrm")
   
      If docParam Is Nothing Then            
      Goto ErrorRoutine
   End If
   
   
   If docMail Is Nothing Then
      Goto ErrorRoutine
   End If
   
   
   If  Not docMail Is Nothing Then
      'docMail fait référence à un objet
      'Création du document "doc"
      Set doc = New notesdocument(db)

Le principal changement (remplace la récupération de Body) :
Code : Tout sélectionner
      Call docMail.CopyAllItems(doc)

Code : Tout sélectionner
      
      Call doc.ReplaceItemValue("EvnLectTxt" , docParam.GetItemValue("DftCrrLct")(0) )
      Call doc.ReplaceItemValue("EvnAutTxt", docParam.GetItemValue("DftCrrMaj")(0) )
      Dim readersItem As New NotesItem(doc, "EvnLect_calculé",  "", READERS)
      Dim authorsItem As New NotesItem(doc, "EvnAuteur_calculé", "", AUTHORS)
      Call readersItem.AppendToTextList(docParam.GetItemValue("DftCrrLct")(0))
      Call readersItem.AppendToTextList("[admin]")      
      Call authorsItem.AppendToTextList(docParam.GetItemValue("DftCrrMaj")(0))
      Call authorsItem.AppendToTextList("[admin]")
      
      
      Call doc.ReplaceItemValue("EvnEmisLe" , Now)
      Call doc.ReplaceItemValue("EvnEmisPar", docMail.GetItemValue("From")(0) )
      Call doc.ReplaceItemValue("EvnMajLe" , Now)
      Call doc.ReplaceItemValue("PostedDate", Now)
      Call doc.ReplaceItemValue("EvnMajPar", docMail.GetItemValue("From")(0))
      Call doc.ReplaceItemValue("EvnEmtNom", docMail.GetItemValue("From")(0))
      Call doc.ReplaceItemValue("EvnObj", docMail.GetItemValue("Subject")(0) )
      
      If docMail.GetItemValue("ReplyDate")(0) = "" Then
         Call doc.ReplaceItemValue("EvnSit", "")
         Call doc.ReplaceItemValue("EvnEch" , "")
      Else
         Call doc.ReplaceItemValue("EvnSit", "A faire")
         Call doc.ReplaceItemValue("EvnEch" , docMail.GetItemValue("ReplyDate")(0) )
      End If
      
      Set ItemNom = doc.GetFirstItem("EvnEmtNom")
      If  ItemNom.Contains({"}) Then
         ItemNom.Values = Strtoken(ItemNom.Values ,{"}, 1 )
      End If
      
      Call doc.ComputeWithForm(True, False)
      Call doc.ReplaceItemValue("Form" , "MemoArr")
      Call doc.Save(True, False)      
      Call doc.PutInFolder( "DssArriv" , True )      
      Call docMail.Remove(True)
      
   End If
   Exit Sub
   
ErrorRoutine :
   BaseCourrier = db.Title
   NotifDocMail.Subject = "Erreur Routage Courrier (" & BaseCourrier & ")"
   NotifDocMail.Form = "Memo"
   
   Call NotifDocMail.ComputeWithForm(True, False)
   Call NotifDocMail.Send(True, "VOTREADRESSE@DOMAINE.FR")
   Call NotifDocMail.Remove(True)
   
   Call docMail.PutInFolder("Mail Non Traite" , True)
   Call docMail.Remove(True)
   
   Exit Sub
   
End Sub


De cette façon, tous les mails testés, Windows/Linux/MAC sont correctement traités avec les pièces jointes.

Merci pour votre aide.

Cordialement,
Guillaume.