Mail mit PDF-Anhang

Ich versuche ein Writerdokument (doc) als PDF-Datei im Anhang eines
Mails zu versenden aber leider kommt nur ein leerer Anhang mit dem Mail
an. Weiß wer was hier falsch ist?

Global oOutputStream as Object

Sub Mailtest(Doc as Object)
Dim Attachment(1) as Object

oOutputStream=CreateUnoService("com.sun.star.io.outputstream")
Dim args(1) as New com.sun.star.beans.PropertyValue
args(0).Name="FilterName"
args(0).Value="writer_pdf_Export"
args(1).Name="OutputStream"
args(1).Value=oOutputStream
doc.store(args())

oMailProvider = CreateUNOService("com.sun.star.mail.MailServiceProvider")
oCont = CreateUNOListener("CurCont_","com.sun.star.uno.XCurrentContext")
oAuth = CreateUNOListener("Authent_","com.sun.star.mail.XAuthenticator")
oTrans
=CreateUNOListener("Trans_","com.sun.star.datatransfer.XTransferable")
oAtt =CreateUNOListener("Att_","com.sun.star.datatransfer.XTransferable")
Attachment=CreateObject("com.sun.star.mail.MailAttachment")
Attachment.data=oAtt
Attachment.ReadableName="Testattachment.pdf"
oMailServiceObj = com.sun.star.mail.MailMessage
oMail = oMailServiceObj.createwithattachment( "to@me.at", "from@me.at",
"the subject", oTrans,Attachment)

xMailServer = oMailProvider.Create("com.sun.star.mail.SMTP")

xMailServer.Connect(oCont,oAuth)
xMailServer.SendMailMessage(oMail)
xMailServer.Disconnect()

End Sub

Function Trans_getTransferData(f) As Any
     if f.MimeType = "text/html" then
         Trans_getTransferData = "<html><body><p>My Mail!</p></body></html>"
     end if
End Function

Function Trans_getTransferDataFlavors() As Variant
     Dim f As New com.sun.star.datatransfer.DataFlavor
     f.MimeType = "text/html"
     Trans_getTransferDataFlavors = Array(f)
End Function

Function Trans_isDataFlavorSupported(f) As Boolean
    Trans_isDataFlavorSupported = (f.MimeType = "text/html")
End Function

Function Att_getTransferData(f) As Any
     if f.MimeType = "application/pdf" then
         Att_getTransferData = oOutputstream
     end if
End Function

Function Att_getTransferDataFlavors() As Variant
     Dim f As New com.sun.star.datatransfer.DataFlavor
     f.MimeType = "application/pdf"
     f.HumanPresentableName="PDF-Datei"
     Att_getTransferDataFlavors = Array(f)
End Function

Function Att_isDataFlavorSupported(f) As Boolean
    Att_isDataFlavorSupported = (f.MimeType = "application/pdf")
End Function

Ich versuche ein Writerdokument (doc) als PDF-Datei im Anhang eines
Mails zu versenden aber leider kommt nur ein leerer Anhang mit dem Mail
an. Weiß wer was hier falsch ist?

Schwer zu sagen, was genau heißt ein "leerer Anhang"? Gar kein Anhang, eine korrekte aber leere pdf-Datei, oder eine 0 byte große Datei, oder oder...?

Passiert das auch wenn du es mit einem Writerdokument im OpenDocument-Format versuchst?

HTH
tom

PS:

Global oOutputStream as Object
...

(Code nicht überprüft.)

Hast du den selber geschrieben oder von irgendwo kopiert? Falls letzteres evtl. sich besser an den Code-Autor wenden.

Leerer Anhang heißt Es wir ein Anhang angezeigt der ist aber 0 Byte lang.
Den Code habe ich selbst geschrieben. Insbesondere was die Verwendung
des Outputstream betrifft bin ich mir absolut nicht sicher ob es sich
dabei um einen richtigen Ansatz handelt. Ich bin nur darauf gekommen
weil in der Doc zu "Dataflavor" für "datatype" "XOutputStream" als
Beispiel angeführt wird.

Reinhard

Hallo Reinhard

Leerer Anhang heißt Es wir ein Anhang angezeigt der ist aber 0 Byte lang.
Den Code habe ich selbst geschrieben.

Das bezweifle ich leider sehr, da ich den Code 1 zu 1 mehrmals im Netz gefunden habe:
z.b. hier :http://permalink.gmane.org/gmane.comp.documentfoundation.discuss/6416

Insbesondere was die Verwendung
des Outputstream betrifft bin ich mir absolut nicht sicher ob es sich
dabei um einen richtigen Ansatz handelt. Ich bin nur darauf gekommen
weil in der Doc zu "Dataflavor" für "datatype" "XOutputStream" als
Beispiel angeführt wird.

Deine Variable oOutputStream müsste mit deiner Methode ein String enthalten,
der den gesamten Inhalt der pdf Datei enthält. Das tut sie aber nicht.

Eine Möglichkeit, um das zu realisieren wäre, dass du
1. die pdf-Datei speicherst
2. zum lesen als *.*.txt öffnest
3. den text als stringvariable speicherst.
und dann alles wie gehabt.

Das funktioniert leider auch nicht, da nur Asci2 unterstützt wird, und die pdf datei als String ungefähr so ausschaut:
"oÏHH%µ[î½.Xsöòà‚Õ'›ŒŒaIÑÏi…ø28É…xó¥+Œaé
P"......

Hier trotzdem der Code, damit du weist, was ich meine.
Wenn du ein paar Kleinigkeiten abänderst, dann bekommst du einen einwandfreien Anhang, allerdings nur als CSV oder txt Datei
hinter der 3. Zeile mit "=========" der andere Code.

Eine einfache methode ist: simplemailmessage sihe:
http://api.openoffice.org/docs/common/ref/com/sun/star/system/XSimpleMailMessage.html
allerdings kannst du da kein "Boody" setzen.

Eine methode, mit der du auch einen "Boody" Versenden kannst ist:

shell("C:\thunderbird\thunderbird.exe", 3, "-Compose to=" & sEmail & ",subject=" & sBetreff & ",body=" & sText & ",attachment=" & sDatei)

der nachteil hier ist, dass du jedesmahl bei Tunderbird noch auf Absenden klicken mußt.

gruß frieder
'==========================================================================================================
'So müßte dein code aussehen, aber es geht leider nicht.
Global oOutputStream as Object
Global sDir as string

Sub Mailtest
Dim Attachment(1) as Object
Dim aAttach(0) as string
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
Doc = ThisComponent
sUrl = ThisComponent.getURL()
Path = DirectoryNameoutofPath(sUrl, "/")
Pfad1 = ConvertFromUrl(Path)
sDir = Pfad1 & GetPathSeparator & "Test1.pdf"
sDir1 = converttourl(sDir)
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ExportFormFields" 'just show the contents of the Form.Fields
args1(0).Value= True
args1(1).Name = "Printing" ' you don't need that.
args1(1).Value= 0
dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "FilterName"
args2(0).Value = "writer_pdf_Export"
args2(1).Name = "FilterData"
args2(1).Value = args1
ThisComponent.storeToURL(sDir1,args2())

oMailProvider = CreateUNOService("com.sun.star.mail.MailServiceProvider")
oCont = CreateUNOListener("CurCont_","com.sun.star.uno.XCurrentContext")
oAuth = CreateUNOListener("Authent_","com.sun.star.mail.XAuthenticator")
oTrans= CreateUNOListener("Trans_","com.sun.star.datatransfer.XTransferable")
oAtt = CreateUNOListener("Att_","com.sun.star.datatransfer.XTransferable")
Attachment=CreateObject("com.sun.star.mail.MailAttachment")
Attachment.data=oAtt
Attachment.ReadableName="Testattachment.pdf"

oMailServiceObj = com.sun.star.mail.MailMessage
oMail = oMailServiceObj.createwithattachment _
( "to@beispiel.de", "from@beispiel.de","the subject", oTrans, Attachment)

xMailServer = oMailProvider.create("com.sun.star.mail.SMTP")

xMailServer.Connect(oCont,oAuth)
xMailServer.SendMailMessage(oMail)
xMailServer.Disconnect()

End Sub

Function Trans_getTransferData(f) As Any
if f.MimeType = "text/html" then
Trans_getTransferData = "<html><body><p>My Mail!</p></body></html>"
end if
End Function

Function Trans_getTransferDataFlavors() As Variant
Dim f As New com.sun.star.datatransfer.DataFlavor
f.MimeType = "text/html"
Trans_getTransferDataFlavors = Array(f)
End Function

Function Trans_isDataFlavorSupported(f) As Boolean
Trans_isDataFlavorSupported = (f.MimeType = "text/html")
End Function

Function Att_getTransferData(f) As Any
if f.MimeType = "application/pdf" then
iNumber = Freefile
Open sDir For Input As #iNumber
While not eof(iNumber)
Line Input #iNumber, sZeile
If sZeile <>"" then
sMsg = sMsg & sZeile & chr(10)
end if
wend
Close #iNumber
Att_getTransferData = sMsg
end if
End Function

Function Att_getTransferDataFlavors() As Variant
Dim f As New com.sun.star.datatransfer.DataFlavor
f.MimeType = "application/pdf"
f.HumanPresentableName="PDF-Datei"
Att_getTransferDataFlavors = Array(f)
End Function

Function Att_isDataFlavorSupported(f) As Boolean
Att_isDataFlavorSupported = (f.MimeType = "application/pdf")
End Function

Function CurCont_GetValueByName(s) as Any
Select Case s
Case "ServerName"
CurCont_GetValueByName = "smtp.beispiel.de"
Case "Port"
CurCont_GetValueByName = 25
Case "ConnectionType"
CurCont_GetValueByName = "Insecure"
End Select

End Function

Function Authent_GetUserName() as Any
Authent_GetUserName = "your_name@beispiel.de"
End Function

Function Authent_GetPassword()
Authent_GetPassword = "your_Passwort"
End Function
'=====================================================================
'dieser code funktioniert, aber du kannst nur txt oder csv dateien erzeugen, und du darfst keine sonderzeichen verwenden.
Global oOutputStream as Object
Global sDir as string

Sub Mailtest
Dim Attachment(1) as Object
Dim aAttach(0) as string
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
Doc = ThisComponent
sUrl = ThisComponent.getURL()
Path = DirectoryNameoutofPath(sUrl, "/")
Pfad1 = ConvertFromUrl(Path)
sDir = Pfad1 & GetPathSeparator & "Test1.pdf"
sDir1 = converttourl(sDir)
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ExportFormFields" 'just show the contents of the Form.Fields
args1(0).Value= True
args1(1).Name = "Printing" ' you don't need that.
args1(1).Value= 0
dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "FilterName"
args2(0).Value = "writer_pdf_Export"
args2(1).Name = "FilterData"
args2(1).Value = args1
ThisComponent.storeToURL(sDir1,args2())

oMailProvider = CreateUNOService("com.sun.star.mail.MailServiceProvider")
oCont = CreateUNOListener("CurCont_","com.sun.star.uno.XCurrentContext")
oAuth = CreateUNOListener("Authent_","com.sun.star.mail.XAuthenticator")
oTrans= CreateUNOListener("Trans_","com.sun.star.datatransfer.XTransferable")
oAtt = CreateUNOListener("Att_","com.sun.star.datatransfer.XTransferable")
Attachment=CreateObject("com.sun.star.mail.MailAttachment")
Attachment.data=oAtt
Attachment.ReadableName="Testattachment.txt"

oMailServiceObj = com.sun.star.mail.MailMessage
oMail = oMailServiceObj.createwithattachment _
( "to@beispiel.de", "from@beispiel.de","the subject", oTrans, Attachment)

xMailServer = oMailProvider.create("com.sun.star.mail.SMTP")

xMailServer.Connect(oCont,oAuth)
xMailServer.SendMailMessage(oMail)
xMailServer.Disconnect()

End Sub

Function Trans_getTransferData(f) As Any
if f.MimeType = "text/html" then
Trans_getTransferData = "<html><body><p>My Mail!</p></body></html>"
end if
End Function

Function Trans_getTransferDataFlavors() As Variant
Dim f As New com.sun.star.datatransfer.DataFlavor
f.MimeType = "text/html"
Trans_getTransferDataFlavors = Array(f)
End Function

Function Trans_isDataFlavorSupported(f) As Boolean
Trans_isDataFlavorSupported = (f.MimeType = "text/html")
End Function

Function Att_getTransferData(f) As Any
if f.MimeType = "application/pdf" then
Att_getTransferData = "Hallo das ist ein Beispiel" & Chr(10) & _
"sdfsdfdfgsdfgdfgjghkzuikjm" & Chr(10) & _
"Gruß Frieder"
end if
End Function

Function Att_getTransferDataFlavors() As Variant
Dim f As New com.sun.star.datatransfer.DataFlavor
f.MimeType = "application/pdf"
f.HumanPresentableName="PDF-Datei"
Att_getTransferDataFlavors = Array(f)
End Function

Function Att_isDataFlavorSupported(f) As Boolean
Att_isDataFlavorSupported = (f.MimeType = "application/pdf")
End Function

Function CurCont_GetValueByName(s) as Any
Select Case s
Case "ServerName"
CurCont_GetValueByName = "smtp.beispiel.de"
Case "Port"
CurCont_GetValueByName = 25
Case "ConnectionType"
CurCont_GetValueByName = "Insecure"
End Select
End Function

Function Authent_GetUserName() as Any
Authent_GetUserName = "your_name@beispiel.de"
End Function

Function Authent_GetPassword()
Authent_GetPassword = "your_Passwort"
End Function

Hallo Reinhard
Ich habe jetzt eine Möglichkeit gefunden, eine e-Mail per Makro zu senden,
und zwar mit PDFAnhang und Boddy und Subject.
Ich verwende dazu MailMerge, allerdings mit einer fast leeren Datenbank:

1 Tabelle mit ID und einer Spalte "Mail" und nur en Record, bei dem "eMail" leer ist.
die wichtigen Daten werden also nicht aus der Datenbank geholt, sondern direkt über das Makro.
die Daten aus der Datenbank zu holen ist aber auch kein Problem.

mit meiner Googlemail Adresse schaffe ich es leider nicht, eine Verbindung aufzubauen.
Das liegt wahrscheinlich am https.
Aber mit gmx.net oder web.de geht alles prima.
zuerst muss man unter Extras->Optionen->LO Writer->Serienbrief-E-Mail,
Die Verbindung zu seinem Mail-Account einrichten ,Authentifizieren und Testen.
Danach Datenbank einrichten( siehe oben)

Makro in ein Modul(bib Standard) einfügen,
und aus dem Dokument, welches du als PDF Anhang senden möchtest ausführen.
(vorher noch die empfännger e-Mail adresse anpassen.)

Hier der Code:

REM ***** BASIC *****
'Copyright (c) 2011 Frieder Delor, Mailto: delorfr@googlemail.com

'This program is free software; you can redistribute it and/or modify it under
'the terms of the GNU General Public License as published by the Free Software
'Foundation; either version 2 of the License, or (at your option) any later
'version.

'This program is distributed in the hope that it will be useful, but WITHOUT
'ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
'FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

'You should have received a copy of the GNU General Public License along with
'this program; if not, write to the Free Software Foundation, Inc., 59 Temple
'Place, Suite 330, Boston, MA 02111-1307 USA
' ========================================================================

sub mailmerge_Email_WithAttechement
'Testen ob Writer oder nicht.
If Not ThisComponent.supportsService("com.sun.star.text.TextDocument") Then
  MsgBox "Dieses Makro kann nur aus einem Writer Dokument ausgeführt werden." ,16,"Fehler"
  exit Sub
End if
'Pfad und name bestimmen
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
   sUrl = ThisComponent.getURL()
   Path = DirectoryNameoutofPath(sUrl, "/")
   Pfad1 = ConvertFromUrl(Path)
   sDir = Pfad1 & GetPathSeparator & "Test1.pdf"
   sDir1 = converttourl(sDir)
   sName =FileNameOutOfPath(sURL)
   sName=Left(sName,len(sName)-4)
   'exportfilter
dim args1(1) as new com.sun.star.beans.PropertyValue
   args1(0).Name = "ExportFormFields" 'just show the contents of the Form.Fields
   args1(0).Value= True
   args1(1).Name = "Printing" ' you don't need that.
   args1(1).Value= 0
dim args2(1) as new com.sun.star.beans.PropertyValue
   args2(0).Name = "FilterName"
   args2(0).Value = "writer_pdf_Export"
   args2(1).Name = "FilterData"
   args2(1).Value = args1
'Die geöffnete Datei als pdf exportieren
   ThisComponent.storeToURL(sDir1,args2())
'Mailmerge initialisieren
Dim oMailMerge As Object
oMailMerge = createUnoService("com.sun.star.text.MailMerge")
GlobalScope.BasicLibraries.LoadLibrary( "XrayTool" )
Xray oMailMerge
With oMailMerge
   .DataSourceName="MailmergeDatenbank"
   '"MailmergeDatenbank" Muss Existieren!!
   'Muss eine Tabelle mit Namen "Tabelle1" enthalten.
   'Muss ID und eine Spalte, mit name "eMail" enthalten.
   'Es genügt aber 1 Record, bei dem die Spalte "eMail" Leer ist.
   .DocumentURL=sUrl
   .CommandType=0
   .Command="Tabelle1"
   .OutputType=3 '3=eMail
   .Subject="Subject"
   .AddressFromColumn="eMail"
   'hier wird die empfänger adresse gesetzt(können auch mehr sein).
   'zb: Array("delorfr@googlemail.com", "you@bsp.net")
   .CopiesTo= Array("delorfr@googlemail.com")
   'wenn du die empfänger aus der Liste haben willst, kannst du auf "CopiesTo" verzichten.
   .SendAsHTML=False
   .SendAsAttachment=True
   .MailBody="Hallo" 'das ist die eigentliche Nachricht
   .AttachmentFilter="writer_pdf_Export"
   .AttachmentName=sName & ".pdf"
End With
  'senden
  oMailMerge.execute(Array())
  'Freigeben
  oMailMerge.dispose
  'PDF Datei wieder Löschen
  Kill sDir
end sub

Hallo Reinhard,

wie ich gerade sehe habe ich vergessen Zwei Zeilen aus dem Makro zu löschen.
bevor du das Makro ausprobierst, solltest du die folgenden Zeilen Löschen:

GlobalScope.BasicLibraries.LoadLibrary( "XrayTool" )
Xray oMailMerge

Gruß Frieder

Hallo Reinhard, und alle die es noch interessiert.

Nach langem Ausprobieren bin ich zu dem Schluss gekommen,
dass die beste Methode, um eine Mail(mit Anhang) per Makro zu versenden ,
ein Kommandozeilen- basierter E-mail-Client ist.
Zwei solcher E-mail-Clienten habe ich ausprobiert, und kann beide sehr empfehlen.
sie brauchen beide keine Installation, und sind recht handlich.

1. blat http://www.blat.net/>
-Nur für Windows:
+ keine Installation notwendig
+ Open Source
+ in c++ geschrieben und sehr klein(120 Kb)
+ sehr viele nützliche Einstellungen und Optionen
+smtp
+pop3
+nntp
+imap
+ sehr gute Dokumentation (Englisch)

2. sendEmail http://caspian.dotconf.net/menu/Software/SendEmail/
+Windows und Linux
+in den meisten Linux Distributionen über die Paketquellen erhältlich, Läuft aber auch ohne Installation
+ Open Source
- in perl geschrieben und verhältnismäßig groß(1,5MB)(mehr als 10 mal so groß wie blat)
+/- Weniger Optionen als blat (für Anfänger leichter, dafür weniger möglichkeiten für Fortgeschrittene)
+smtp
-kein pop3 ,nntp und imap
+ sehr gute Dokumentation (Englisch)

Im Beispielcode (Siehe unten) Exportiere ich eine Mail,
  mit je 2 Anhänge: Das aktuelle Writer-Dokument und das Dokument als PDF.
Getestet habe ich mit web.de und gmx.net (googlemail.com bekomme ich nicht hin)
die Mail-Adresse, Passwörter und Pfade müssen natürlich noch angepasst werden.

Gruß Frieder

Beispielcode um "blat" zu benutzen: nur Windows
'===============================================================
Sub eMail_blat
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
Doc=ThisComponent
   sUrl = ThisComponent.getURL()
   Path = DirectoryNameoutofPath(sUrl, "/")
   Pfad1 = ConvertFromUrl(Path)
   sDir = Pfad1 & GetPathSeparator & "Test1.pdf"
   sDir1 = converttourl(sDir)
dim args1(1) as new com.sun.star.beans.PropertyValue
   args1(0).Name = "ExportFormFields" 'just show the contents of the Form.Fields
   args1(0).Value= True
   args1(1).Name = "Printing" ' you don't need that.
   args1(1).Value= 0
dim args2(1) as new com.sun.star.beans.PropertyValue
   args2(0).Name = "FilterName"
   args2(0).Value = "writer_pdf_Export"
   args2(1).Name = "FilterData"
   args2(1).Value = args1
  ' args2(2).Name="OutputStream"
  'args2(2).Value=oOutputStream
   ThisComponent.storeToURL(sDir1,args2())
Shell("C:\Users\Username\Pfad_zu\blat276\full\blat.exe" & _
" - -to Empfaenger@googlemail.com" & _
" -s ""Subject""" & _
" -body ""Hallo wie gehts?" & Chr(10) & "Text hier...""" & _
" -attach " & sDir & "," & ConvertFromUrl(sUrl) & _
" -server smtp.web.de" & _
" -f you@web.de" & _
" -from you@googlemail.com" & _
" -u you@web.de -pw XXXXXX")
End Sub
'==================================================
'Und hier Beispielcode um "Sendmail" zu benutzen: Linux und Windows
Sub mail_SendEmail
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
Doc=ThisComponent
   sUrl = ThisComponent.getURL()
   Path = DirectoryNameoutofPath(sUrl, "/")
   Pfad1 = ConvertFromUrl(Path)
   sDir = Pfad1 & GetPathSeparator & "Test1.pdf"
   sDir1 = converttourl(sDir)
dim args1(1) as new com.sun.star.beans.PropertyValue
   args1(0).Name = "ExportFormFields" 'just show the contents of the Form.Fields
   args1(0).Value= True
   args1(1).Name = "Printing" ' you don't need that.
   args1(1).Value= 0
dim args2(1) as new com.sun.star.beans.PropertyValue
   args2(0).Name = "FilterName"
   args2(0).Value = "writer_pdf_Export"
   args2(1).Name = "FilterData"
   args2(1).Value = args1
  ' args2(2).Name="OutputStream"
  'args2(2).Value=oOutputStream
   ThisComponent.storeToURL(sDir1,args2())
'unter Windows muss der Pfad angepasst weden
Shell("sendEmail" & _
" -f you@web.de" & _
" -t empfaenger@gmx.de" &_
" -o reply-to= you@googlemail.com" &_
" -u ""Subject"" " & _
" -m ""Hallo wie gehts?" & Chr(10) & "sendEmail Text""" &_
" -a " & sDir &" -a " & ConvertFromUrl(sUrl) & _
" -s smtp.web.de" & _
" -xu you@web.de -xp XXXXXXXXX"
end sub

Hallo Frieder!

Danke für die Mühe, die du dir gemacht hast, Ich habe mich für die
SendEmail-Methode entschieden, weil meine Anwendung auf Windows und
Linux funktionieren muß. Das ganze läuft problemlos und ohne großen Aufwand.

liebe Grüße

Reinhard