Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: fsinani am 06.09.16 - 12:24:37

Titel: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: fsinani am 06.09.16 - 12:24:37
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.
Titel: Re: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: jBubbleBoy 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?
Titel: Re: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: fsinani am 06.09.16 - 13:16:33
Jep,

das Klammersymbol ist in der Inbox zu sehen.
Titel: Re: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: jBubbleBoy 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.
Titel: Re: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: Klafu 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
Titel: Re: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: fsinani 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

Titel: Re: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: jBubbleBoy 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.
Titel: Re: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: Klafu 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
Titel: Re: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: fsinani 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 :-)
Titel: Re: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: Klafu 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
Titel: Re: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: fsinani 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
Titel: Re: Lösen eines pdfs aus einem Mime Mail LotusScript
Beitrag von: thkn777 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.