Perte des pièces jointes en provenance de MAC

Forum destiné aux questions sur le développement : Formules, LotusScript, Java ...

Perte des pièces jointes en provenance de MAC

Messagepar informatiquepadr » 08 Sep 2010 à 14:45

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.
Dernière édition par informatiquepadr le 13 Sep 2010 à 14:14, édité 1 fois.
informatiquepadr
Découvre Dominoarea
Découvre Dominoarea
 
Message(s) : 6
Inscrit(e) le : 08 Sep 2010 à 14:28

Messagepar Michael DELIQUE » 08 Sep 2010 à 14:49

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
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar LSong » 08 Sep 2010 à 14:58

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
LSong
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 353
Inscrit(e) le : 07 Nov 2007 à 14:27
Localisation : Ile de france

Messagepar roubech » 08 Sep 2010 à 22:44

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
Avatar de l’utilisateur
roubech
Modérateur
Modérateur
 
Message(s) : 4976
Inscrit(e) le : 01 Fév 2007 à 20:22
Localisation : Lille

Messagepar informatiquepadr » 09 Sep 2010 à 09:01

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.
informatiquepadr
Découvre Dominoarea
Découvre Dominoarea
 
Message(s) : 6
Inscrit(e) le : 08 Sep 2010 à 14:28

Messagepar informatiquepadr » 09 Sep 2010 à 14:22

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
informatiquepadr
Découvre Dominoarea
Découvre Dominoarea
 
Message(s) : 6
Inscrit(e) le : 08 Sep 2010 à 14:28

Messagepar LSong » 09 Sep 2010 à 14:44

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
LSong
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 353
Inscrit(e) le : 07 Nov 2007 à 14:27
Localisation : Ile de france

Messagepar informatiquepadr » 09 Sep 2010 à 14:56

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.
informatiquepadr
Découvre Dominoarea
Découvre Dominoarea
 
Message(s) : 6
Inscrit(e) le : 08 Sep 2010 à 14:28

Messagepar informatiquepadr » 10 Sep 2010 à 15:42

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.
informatiquepadr
Découvre Dominoarea
Découvre Dominoarea
 
Message(s) : 6
Inscrit(e) le : 08 Sep 2010 à 14:28

Messagepar informatiquepadr » 13 Sep 2010 à 14:11

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.
informatiquepadr
Découvre Dominoarea
Découvre Dominoarea
 
Message(s) : 6
Inscrit(e) le : 08 Sep 2010 à 14:28


Retour vers Développement