Autor Thema: Liste mit contentTypes(MIME)/Problem mit Name von Anhängen in Email  (Gelesen 3859 mal)

Offline Preda7oR

  • Frischling
  • *
  • Beiträge: 6
Hallo zusammen,

ich hab folgende zwei Fragen:

1. Bei dem Befehl "Call notesMIMEEntity.SetContentFromBytes( stream, contentType, encoding )" muss ja der contentType angegeben werden. Gibt es hierzu eine Liste, welche verschiedenen Typen es gibt? Also application/pdf, image/bmp etc...

2. Ich erstelle mit VBA eine Email im HTML-Format mit Anhängen. Dies klappt jetzt auch soweit so gut, nur passen die Namen der einzeönen Anhänge nicht. D.h. Sie entsprechen nicht dem Dateinamen, sondern heißen z.b. "application-xlsx-attachment" bei einer Excel-Datei und nicht "xyz.xlsx". Ich verwende folgenden Code:
Code
Sub LotusMail(Empfaenger As String, Inhalt As String, Absender As String,
Betreff As String, CC As String, BCC As String, Anhang As Variant, Zeile As
Integer)

Dim server As String, mailfile As String
Dim session As Object
Dim DB As Object
Dim doc As Object
Dim alleAnhänge As Variant


' Auslesen der Mail-DB
Set session = CreateObject("Notes.NotesSession")
session.ConvertMime = False
server = session.GetEnvironmentString("MailServer", True)
mailfile = session.GetEnvironmentString("MailFile", True)

Set DB = session.GETDATABASE(server, mailfile)
Set doc = DB.CreateDocument()

doc.Form = "Memo"
doc.SendTo = Empfaenger ' Adressdaten übergeben
doc.CopyTo = Split(CC, ";") 'CC
doc.BlindCopyTo = Split(BCC, ";") ' BCC
doc.Subject = Betreff 'Betreff

Set body = doc.CreateMIMEEntity

Set bodyChild = body.CreateChildEntity()
Set stream = session.CreateStream
Call stream.Writetext(Inhalt)
Call bodyChild.SetContentFromText(stream, "text/html;charset=iso-8859-1",
1729)
Call stream.Close
Call stream.Truncate

alleAnhänge = Split(Anhang, ";")

' Pfade der Anhänge bearbeiten und hinzufügen
For i = 0 To UBound(alleAnhänge)

strAnhang = alleAnhänge(i)

If Len(strAnhang) > 0 And Len(Dir(strAnhang)) > 0 Then
' Name des Anhangs aus dem Pfad extrahieren
Position = InStrRev(strAnhang, "\")
Dateiname = Right(strAnhang, Len(strAnhang) - pos)

'Neues Child-Element des body für einen Anhang
Set bodyChild = body.CreateChildEntity()
Set Header = bodyChild.CreateHeader("Content-Type")
Call Header.SetHeaderVal("multipart/mixed")

Set Header = bodyChild.CreateHeader("Content-Disposition")
Call Header.SetHeaderVal("attachment; filename=" & Dateiname)

Set Header = bodyChild.CreateHeader("Content-ID")
Call Header.SetHeaderVal(Dateiname)

Set stream = session.CreateStream()

If stream.Open(strAnhang, "binary") Then

Dateityp = Split(alleAnhänge(i), ".")
Dateityp = "application/" & Dateityp(UBound(Dateityp))
Call bodyChild.SetContentFromBytes(stream, Dateityp, 1730)

End If

End If

Next

Call stream.Close
Call stream.Truncate

'doc.SAVEMESSAGEONSEND = True

doc.principal = Absender 'Absender

Call doc.Send(False) 'Email senden

'Variablen leeren
session.ConvertMime = True
Set doc = Nothing
Set DB = Nothing
End Sub

Wäre super wenn mir jemand auf die Sprünge helfen köönte :-)

Vielen Dank im Voraus!!

VG Dennis

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Zitat
[RFC2046] specifies that Media Types (formerly known as MIME types) and Media
Subtypes will be assigned and listed by the IANA.

Procedures for registering Media Types can be found in [RFC6838], [RFC4289],
and [RFC6657]. Additional procedures for registering media types for transfer via
Real-time Transport Protocol (RTP) can be found in [RFC4855].

Die in RFC 2046 geforderte Liste der Media Types (formerly known as MIME types) and Media Subtypes hält die IANA auf http://www.iana.org/assignments/media-types/media-types.xhtml vor.


Wenn Du den Dateinamen mitschicken willst, möchtest Du Dir RFC 2183 "Communicating Presentation Information in Internet Messages: The Content-Disposition Header Field" ansehen.
Dort heißt es:
Zitat
   The `filename' parameter can be used to suggest a filename for
   storing the bodypart, if the user wishes to store it in an external
   file.
Code
Content-Disposition: attachment; filename=genome.jpeg;
          modification-date="Wed, 12 Feb 1997 16:29:51 -0500";


HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline Preda7oR

  • Frischling
  • *
  • Beiträge: 6
Vielen Dank hat geklappt ;-)

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Hi Dennis,

auch dir möchte ich meinen Artikel http://atnotes.de/index.php/topic,52040.0.html empfehlen, bevor dir z.B. wegen deinem fehlenden "closeMimeEntities" ein Produktivsystem crashed.

Da habe ich auch Beispielcode wie man eine Mail mit Anhang erstellt.

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Preda7oR

  • Frischling
  • *
  • Beiträge: 6
Hey Roland,

vielen Dank für die Anmerkung.

Mein fertiger Code so wie folgt aus. Könntest du oder jemand anders bitte mal drüber schauen, ob da irgendwelche groben schnitzer drin sind?

Code
Sub LotusMail(Empfaenger As String, Inhalt As String, Absender As String,
Betreff As String, CC As String, BCC As String, Anhang As Variant, Zeile As
Integer)

Dim server As String, mailfile As String
Dim session As Object
Dim DB As Object
Dim doc As Object
Dim alleAnhänge As Variant


' Auslesen der Mail-DB
Set session = CreateObject("Notes.NotesSession")
session.ConvertMime = False
server = session.GetEnvironmentString("MailServer", True)
mailfile = session.GetEnvironmentString("MailFile", True)

Set DB = session.GETDATABASE(server, mailfile)
Set doc = DB.CreateDocument()

Set body = doc.CreateMIMEEntity

Set bodyChild = body.CreateChildEntity()
Set stream = session.CreateStream
Call stream.Writetext(Inhalt)
Call bodyChild.SetContentFromText(stream, "text/html;charset=iso-8859-1",
1729)
Call stream.Close
Call stream.Truncate

alleAnhänge = Split(Anhang, ";")

' Pfade der Anhänge bearbeiten und hinzufügen
For i = 0 To UBound(alleAnhänge)

strAnhang = alleAnhänge(i)

If Len(strAnhang) > 0 And Len(Dir(strAnhang)) > 0 Then
' Name des Anhangs aus dem Pfad extrahieren
Position = InStrRev(strAnhang, "\")
Dateiname = Right(strAnhang, Len(strAnhang) - Position)

'Neues Child-Element des body für einen Anhang
Set bodyChild = body.CreateChildEntity()
Set Header = bodyChild.CreateHeader("Content-Type")
Call Header.SetHeaderVal("multipart/mixed")

Set Header = bodyChild.CreateHeader("Content-Disposition")
Call Header.SetHeaderVal("attachment; filename=" & Dateiname)

Set Header = bodyChild.CreateHeader("Content-ID")
Call Header.SetHeaderVal(Dateiname)

Set stream = session.CreateStream()

If stream.Open(strAnhang, "binary") Then

Dateityp = Right(Dateiname, Len(Dateiname) - InStrRev
(Dateiname, "."))

'Auswahl des Dateitypes

If Dateityp Like "xls*" Then

Dateityp = "application/vnd.ms-excel"

Else

If Dateityp Like "doc*" Then

Dateityp = "application/msword"

Else

If Dateityp Like "ppt*" Then

Dateityp = "application/vnd.ms-powerpoint"

Else

If Dateityp Like "pdf" Then

Dateityp = "application/pdf"

Else

If Dateityp = "bmp" Then

Dateityp = "image/bmp"

Else

If Dateityp = "jpeg" Then

Dateityp = "image/jpeg"

Else

If Dateityp = "gif" Then

Dateityp = "image/gif"

Else

Dateityp =
"application/octet-stream"

End If

End If

End If

End If

End If

End If

End If

Call bodyChild.SetContentFromBytes(stream, Dateityp, 1730)

End If

End If

Next

Call stream.Close
Call stream.Truncate
Call doc.CloseMIMEEntities(True)

doc.Form = "Memo"
doc.SendTo = Empfaenger ' Adressdaten übergeben
doc.CopyTo = Split(CC, ";") 'CC
doc.BlindCopyTo = Split(BCC, ";") ' BCC
doc.Subject = Betreff 'Betreff
doc.principal = Absender 'Absender
'doc.SAVEMESSAGEONSEND = True

Call doc.Send(False) 'Email senden

'Variablen leeren
session.ConvertMime = True
Set doc = Nothing
Set DB = Nothing
End Sub

Vielen Dank!!

VG
Dennis

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Hallo Dennis,

kleine Anmerkung am Rande...ich würde dich bitten, beim posten von längerem Code die Formatierung beizubehalten. Hier nochhmal dein Code, etwas sauberer formatiert (für den nächsten der vielleicht noch drüber schaut). Es macht sonst echt keinen Spaß zum lesen
Code
Sub LotusMail(Empfaenger As String, Inhalt As String, Absender As String, Betreff As String, CC As String, BCC As String, Anhang As Variant, Zeile As Integer)

	Dim server As String, mailfile As String
	Dim session As Object
	Dim DB As Object
	Dim doc As Object
	Dim alleAnhänge As Variant


	' Auslesen der Mail-DB
	Set session = CreateObject("Notes.NotesSession")
	session.ConvertMime = False
	server = session.GetEnvironmentString("MailServer", True)
	mailfile = session.GetEnvironmentString("MailFile", True)

	Set DB = session.GETDATABASE(server, mailfile)
	Set doc = DB.CreateDocument()

	Set body = doc.CreateMIMEEntity

	Set bodyChild = body.CreateChildEntity()
	Set stream = session.CreateStream
	Call stream.Writetext(Inhalt)
	Call bodyChild.SetContentFromText(stream, "text/html;charset=iso-8859-1",1729)
	Call stream.Close
	Call stream.Truncate

	alleAnhänge = Split(Anhang, ";")

	' Pfade der Anhänge bearbeiten und hinzufügen
	For i = 0 To UBound(alleAnhänge)

		strAnhang = alleAnhänge(i)

		If Len(strAnhang) > 0 And Len(Dir(strAnhang)) > 0 Then
			' Name des Anhangs aus dem Pfad extrahieren
			Position = InStrRev(strAnhang, "\")
			Dateiname = Right(strAnhang, Len(strAnhang) - Position)

			'Neues Child-Element des body für einen Anhang
			Set bodyChild = body.CreateChildEntity()
			Set Header = bodyChild.CreateHeader("Content-Type")
			Call Header.SetHeaderVal("multipart/mixed")

			Set Header = bodyChild.CreateHeader("Content-Disposition")
			Call Header.SetHeaderVal("attachment; filename=" & Dateiname)

			Set Header = bodyChild.CreateHeader("Content-ID")
			Call Header.SetHeaderVal(Dateiname)

			Set stream = session.CreateStream()

			If stream.Open(strAnhang, "binary") Then

				Dateityp = Right(Dateiname, Len(Dateiname) - InStrRev(Dateiname, "."))

				'Auswahl des Dateitypes

				If Dateityp Like "xls*" Then
					Dateityp = "application/vnd.ms-excel"
				ElseIf Dateityp Like "doc*" Then
					Dateityp = "application/msword"
				ElseIf Dateityp Like "ppt*" Then
					Dateityp = "application/vnd.ms-powerpoint"
				ElseIf Dateityp Like "pdf" Then
					Dateityp = "application/pdf"
				ElseIf Dateityp = "bmp" Then
					Dateityp = "image/bmp"
				ElseIf Dateityp = "jpeg" Then
					Dateityp = "image/jpeg"
				ElseIf Dateityp = "gif" Then
					Dateityp = "image/gif"
				Else
					Dateityp ="application/octet-stream"
				End If

				Call bodyChild.SetContentFromBytes(stream, Dateityp, 1730)

			End If

		End If

	Next

	Call stream.Close
	Call stream.Truncate
	Call doc.CloseMIMEEntities(True)

	doc.Form = "Memo"
	doc.SendTo = Empfaenger ' Adressdaten übergeben
	doc.CopyTo = Split(CC, ";") 'CC
	doc.BlindCopyTo = Split(BCC, ";") ' BCC
	doc.Subject = Betreff 'Betreff
	doc.principal = Absender 'Absender
	'doc.SAVEMESSAGEONSEND = True

	Call doc.Send(False) 'Email senden

	'Variablen leeren
	session.ConvertMime = True
	Set doc = Nothing
	Set DB = Nothing
End Sub

Was mir aufgefallen ist:

> Call Header.SetHeaderVal("attachment; filename=" & Dateiname)
Dateiname darf nur "normale" Zeichen enthalten, habe meinen Artikel entsprechend ergänzt, wie man Umlaute encoden müsste.

> Set Header = bodyChild.CreateHeader("Content-Type")
> Call Header.SetHeaderVal("multipart/mixed")
dieser Header sollte ganz nach oben an den Body (in meiner Klasse rootMime)

> Set Header = bodyChild.CreateHeader("Content-ID")
Eine Content-ID ist nur bei multipart/related erforderlich (um z.B. im HTML darauf zu verweisen)

Ansonsten hab ich keine Schnitzer bzgl. MIME-Handling mehr gesehen.

Gruß
Roland



Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Preda7oR

  • Frischling
  • *
  • Beiträge: 6
Vielen Dank Roland und sry wegen der Formatierung. Die muss beim copy & paste verlorengegangen sein. Werd ich das nächste Mal auf jedenfall drauf achten!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz