Autor Thema: Lösen eines pdfs aus einem Mime Mail LotusScript  (Gelesen 5974 mal)

Offline fsinani

  • Senior Mitglied
  • ****
  • Beiträge: 264
  • Ich liebe dieses Forum!
Hallo Freunde,

ich stecke in einer (vermutlichen) Kleinigkeit fest:
Ich möchte aus eingehenden Mails (Rechnungen) lediglich alle PDFs herauslösen und ins FileSystem speichern. Offensichtlich habe ich bisher keine Berührungspunkte mit MIME gehabt.

Ich habe bei Domino Support einen Schnipsel genommen und ihn auf meine Bedürfnisse angepasst.
Mein Problem ist die Zeile:
If (header.GetHeaderVal(True) = "attachment") Then

Hierbei greift "attachment" nicht. Der Code 'umfliegt' den darunterliegenden Code, da keine Übereinstimmung.

Wonach muss ich abfragen, wenns die PDF sein soll?

Anbei der Mime-Extraction-Code
Code
	While Not(mime Is Nothing)
				Set header = mime.GetNthHeader("Content-Disposition")
				If (Not header Is Nothing) Then 
					If (header.GetHeaderVal(True) = "attachment") Then 
					'if the Content-Disposition header exists then the filename parameter must be present 
						filename = header.GetParamVal("filename") 
						'strip off the quotation marks on the file name 
						filename = StrRight(filename, {"}) 
						filename = StrLeft(filename, {"}) 
						'open a file, get the content of the attachment, and write it to the file system 
						
						stream.Open FilePath1  & CStr(timestamp) & "_" & filename, "binary" 
						mime.GetContentAsBytes stream, True 
						stream.Close 
					End If  
				End If
				Set mime = mime.GetNextEntity(SEARCH_DEPTH) 
			Wend


Danke Euch.

P.S.
Ich suche peinlicher Weise bereits seit gestern Mittag -  auch die ansonsten aussagekräftige Domino Hilfe ist hierbei etwas dürftig.

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Lösen eines pdfs aus einem Mime Mail LotusScript
« Antwort #1 am: 06.09.16 - 13:05:08 »
Siehst du den Dokumenten an, das diese einen Anhang haben? z.B. Klammer-Symbol in der Ansicht Mail-Eingang oder mit @AttachmentNames?
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline fsinani

  • Senior Mitglied
  • ****
  • Beiträge: 264
  • Ich liebe dieses Forum!
Re: Lösen eines pdfs aus einem Mime Mail LotusScript
« Antwort #2 am: 06.09.16 - 13:16:33 »
Jep,

das Klammersymbol ist in der Inbox zu sehen.

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Lösen eines pdfs aus einem Mime Mail LotusScript
« Antwort #3 am: 06.09.16 - 13:21:28 »
Dann musst du dich nicht mit Mime herumschlagen sondern kannst die Standard-Notesfunktion verwenden um die Anhänge zu lösen.
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Klafu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.944
  • Geschlecht: Männlich
  • Remember the Cookies!
Re: Lösen eines pdfs aus einem Mime Mail LotusScript
« Antwort #4 am: 06.09.16 - 13:25:16 »
Zitat
bei SMTP-Mails sind die Anhangsnamen manchmal mit @AttachmentNames nicht lesbar - dafür gibt es aber einen Parameter, um das Lesen zu erzwingen.

Aus der Hilfe:
@AttachmentNames( excludeMIMEBody )
Parameter
excludeMIMEBody
Boolesches Ergebnis. Optional.
Geben Sie WAHR (1) an, um große MIME-Elemente, die als Anhänge gespeichert sind (aber inline angezeigt werden), auszuschließen. Dies ist die Vorgabe.
Geben Sie FALSCH (0) an, um große MIME-Elemente, die als Anhänge gespeichert sind (aber inline angezeigt werden), aufzunehmen.

Mit dem Parameter 0 hatte ich bisher keine Probleme - und große Performanceunterschiede konnte ich auch nicht feststellen.

Gruß

André

Chris
„Der einzige Mensch, der sich vernünftig benimmt, ist mein Schneider. Er nimmt jedesmal neu Maß, wenn er mich trifft, während alle anderen immer die alten Maßstäbe anlegen in der Meinung, sie paßten auch heute noch...“

Offline fsinani

  • Senior Mitglied
  • ****
  • Beiträge: 264
  • Ich liebe dieses Forum!
Re: Lösen eines pdfs aus einem Mime Mail LotusScript
« Antwort #5 am: 06.09.16 - 13:30:54 »
Bis gestern habe ich das tatsächlich auch so gehandhabt, bis der Einkauf mir mitteilte, die Rechnung eines Absenders nicht im Filesystem liegt, aber die Mail bereits in den Mailordner "erledigt" verschoben wurde.

In diesem Fall hat die IF-Anweisung

If Not IsEmpty(rtitem.embeddedobjects)  Then


Keine Übereinstimmung und springt raus. Bei allen anderen Mails bisher (und auch anderen seit gestern ankommenden) läuft das so. Nur dieser eine Absender (glaube ich zumindest), der seine Mail aus Apple OSX mit Mail versendet, da greift die Anweisung nicht.

hier der vollständige Code aus meinem Initialize des Agenten


Code
	Set s = New NotesSession
	Set DB = s.Currentdatabase
	Set Inbox = db.Getview("($Inbox)")

	filepath1 = "d:\extract\orig\" 
	filepath2 = "d:\extract\kopie\"
	
	RecipientTest = ""
	
	
	' Get First Mail in Inbox
	Set maildoc = Inbox.Getfirstdocument()
	' Prepare to see, if Mail is Mime
	s.ConvertMIME = False
	Set mime = Maildoc.GetMIMEEntity
	
	Do While Not maildoc Is Nothing
		timestamp = InternationalDate(maildoc.Created) & "_" & TimeString(maildoc.Created)
		Set rtitem = maildoc.GetFirstItem( "Body" )

		If ( rtitem.Type = RICHTEXT ) Then
			' Loop through all Attachments and extract them if they are PDF to FilePath1 and FilePath2
			If Not IsEmpty(rtitem.embeddedobjects)  Then
				ForAll o In rtitem.EmbeddedObjects
					If ( o.Type = EMBED_ATTACHMENT ) And (LCase(Right(o.Name,3))="pdf") Then
						Call o.ExtractFile ( FilePath1 & CStr(timestamp) & "_" & CStr(o.Name) )' orig
						'Call o.ExtractFile ( FilePath2 & CStr(timestamp) & "_" & CStr(o.Name) )' kopie
					End If
				End ForAll
			End If
			Call maildoc.Putinfolder("Extrahierte Rechnungen", True)
			Call maildoc.RemoveFromFolder("($Inbox)")
			Call MailVersand
		Else
            ' If Mail is Mime, then detaching is different
			While Not(mime Is Nothing)
				Set header = mime.GetNthHeader("Content-Disposition")
				If (Not header Is Nothing) Then 
					If (header.GetHeaderVal(True) = "application") Then 
					'if the Content-Disposition header exists then the filename parameter must be present 
						filename = header.GetParamVal("filename") 
						'strip off the quotation marks on the file name 
						filename = StrRight(filename, {"}) 
						filename = StrLeft(filename, {"}) 
						'open a file, get the content of the attachment, and write it to the file system 
						
						stream.Open FilePath1  & CStr(timestamp) & "_" & filename, "binary" 
						mime.GetContentAsBytes stream, True 
						stream.Close 
					End If  
				End If
				Set mime = mime.GetNextEntity(SEARCH_DEPTH) 
			Wend
			s.ConvertMIME = True ' Restore conversion
			Call maildoc.Putinfolder("Extrahierte Rechnungen", True)
			Call maildoc.RemoveFromFolder("($Inbox)")
			Call MailVersand	
		End If
		' Next Doc is now the first doc
		Set maildoc = Inbox.GetFirstdocument
	Loop
	Exit Sub


Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Lösen eines pdfs aus einem Mime Mail LotusScript
« Antwort #6 am: 06.09.16 - 13:35:43 »
Versuche einmal mittels @AttachmentNames die Anhänge zu identifizieren und mit doc.GetAttachment( Name ) dir ein NotesEmbeddedObject zu holen, das sollte klappen.
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Klafu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.944
  • Geschlecht: Männlich
  • Remember the Cookies!
Re: Lösen eines pdfs aus einem Mime Mail LotusScript
« Antwort #7 am: 06.09.16 - 14:33:06 »
Als Ergänzung für den Post von Erik

Code
varFileNames = Evaluate( "@AttachmentNames", doc )
If varFileNames(0) <> "" then

Chris
„Der einzige Mensch, der sich vernünftig benimmt, ist mein Schneider. Er nimmt jedesmal neu Maß, wenn er mich trifft, während alle anderen immer die alten Maßstäbe anlegen in der Meinung, sie paßten auch heute noch...“

Offline fsinani

  • Senior Mitglied
  • ****
  • Beiträge: 264
  • Ich liebe dieses Forum!
Re: Lösen eines pdfs aus einem Mime Mail LotusScript
« Antwort #8 am: 06.09.16 - 14:45:56 »
Hallo und danke an Alle!!! Es hat nun auch bei diesem Absender geklappt.



Code
	Set maildoc = Inbox.Getfirstdocument()
	Do While Not maildoc Is Nothing
		timestamp = InternationalDate(maildoc.Created) & "_" & TimeString(maildoc.Created)
		Set rtitem = maildoc.GetFirstItem( "Body" )

		If ( rtitem.Type = RICHTEXT ) Then
			' Loop through all Attachments and extract them if they are PDF to FilePath1 and FilePath2
			If Not IsEmpty(rtitem.embeddedobjects)  Then
				ForAll o In rtitem.EmbeddedObjects
					If ( o.Type = EMBED_ATTACHMENT ) And (LCase(Right(o.Name,3))="pdf") Then
						Call o.ExtractFile ( FilePath1 & CStr(timestamp) & "_" & CStr(o.Name) )' orig
						'Call o.ExtractFile ( FilePath2 & CStr(timestamp) & "_" & CStr(o.Name) )' kopie
					End If
				End ForAll
			Else
			' Sometime the attachment is stored in the doc, not in a RTITEM
				attNames = Evaluate("@AttachmentNames", Maildoc) 
				For i = 0 To UBound (attNames)
					If (LCase(Right(attNames(i),3))="pdf") Then
						Set MimeAtt = MailDoc.GetAttachment(attNames(i))
						Call MimeAtt.ExtractFile ( FilePath1 & CStr(timestamp) & "_" & CStr(attNames(i)) )' orig
					End if					
				Next
			End If
			Call maildoc.Putinfolder("Extrahierte Rechnungen", True)
			Call maildoc.RemoveFromFolder("($Inbox)")
			Call MailVersand
		End If
		' Next Doc is now the first doc
		Set maildoc = Inbox.GetFirstdocument
	Loop


Falls das jetzt irgendwer mal braucht, bzw. irgendwer mal optimieren möchte :-)

Offline Klafu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.944
  • Geschlecht: Männlich
  • Remember the Cookies!
Re: Lösen eines pdfs aus einem Mime Mail LotusScript
« Antwort #9 am: 06.09.16 - 14:54:20 »

Set maildoc = Inbox.Getfirstdocument()
Do While Not maildoc Is Nothing
   attNames = Evaluate("@AttachmentNames", Maildoc)
   For i = 0 To UBound (attNames)
      If (LCase(Right(attNames(i),3))="pdf") Then
         Set MimeAtt = MailDoc.GetAttachment(attNames(i))
         Call MimeAtt.ExtractFile ( FilePath1 & CStr(timestamp) & "_" & CStr(attNames(i)) )' orig
      End if               
   Next
   Call maildoc.Putinfolder("Extrahierte Rechnungen", True)
   Call maildoc.RemoveFromFolder("($Inbox)")
   Call MailVersand
Loop

Sollte im großen und ganzen schon reichen. Damit deckst du auch den " If ( rtitem.Type = RICHTEXT ) Then " Block ab.

Chris
„Der einzige Mensch, der sich vernünftig benimmt, ist mein Schneider. Er nimmt jedesmal neu Maß, wenn er mich trifft, während alle anderen immer die alten Maßstäbe anlegen in der Meinung, sie paßten auch heute noch...“

Offline fsinani

  • Senior Mitglied
  • ****
  • Beiträge: 264
  • Ich liebe dieses Forum!
Re: Lösen eines pdfs aus einem Mime Mail LotusScript
« Antwort #10 am: 09.09.16 - 15:29:27 »
So - hat länger gedauert.

weil .........

Ich mir vorgestern eine schicke Endlosschleife (kurz vor Feierabend)´gezaubert hab, die mir eine "Handvoll" Mails an mein Postfach gesendet hat und Traveler dann nicht mehr gaaanz so schnell lief.

War also ABM pur

Dann jetzt aber erst mal ein Dank an Klafu, der mir 80 % meiner Codezeilen ad absurdum geführt hat :-)
Schade, dass ich die Endlosschleife nicht schon vorher drin hatte ;D

Ein schönes Wochenende Euch

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Re: Lösen eines pdfs aus einem Mime Mail LotusScript
« Antwort #11 am: 26.09.16 - 11:53:05 »
Anmerkung:
Bzgl. der "einen Mail aus OSX" lies doch mal hier: http://atnotes.de/index.php/topic,59734.0.html

Inline-Mime-Attachments können in Notes zuweilen ganz schön rumzicken. Meistens sind derlei inline Attachments aber Bilder und keine PDF's. Vielleicht gibt's ja 'ne Anregung für Dich.

Schönen Wochenstart wünsch' ich!
Th.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz