Archiv verlassen und diese Seite im Standarddesign anzeigen : OutlookMail.exe
Peter Schirmer
11.11.2008, 17:46
In einem anderen Thread habe ich ein kleines Programm geschrieben, dass aus allen möglichen Situationen eine Outlook-Mail erstellt. Man kann Betreff, Text, Mail-Empfänger und Dateien angeben.
D.h., aus einer Batch-Datei oder aus einem anderen beliebigen Programm kann man Mails versenden.
Der Aufruf erfolgt so:
"C:\temp\OutlookMail\OutlookMail.exe" /body="Wie versprochen, die Unterlagen." /subject="Ihre Unterlagen" /files="C:\Temp\bin\Release" /to="test@mail.org
Hier ein Bild dazu:
32569
Benötigt wird
.NET 3.5
Office ab 2003
Cooles Teil! Das weckt Fantasien...
Danke!
Ghost in the Shell
11.11.2008, 18:48
hui da lässt sich einiges Automatisieren, super vielen Dank :)
Peter Schirmer
11.11.2008, 19:18
So, ich habe noch ein wenig gebastelt. Unter Office 2007 erscheint eine Fehlermeldung, wenn der Anhang zu groß ist (interne Meldung von Outlook). Es erscheint dieser Hinweis und zusätzlich die Größe des bereits eingefügten Anhangs.
Freut mich übrigens, dass es euch gefällt. :D
Bullayer
11.11.2008, 22:40
Das Programm ist nicht schlecht. Danke.
Peter Schirmer
12.11.2008, 09:35
Freut mich, dass es euch gefällt. :satisfied:
Ghost in the Shell
12.11.2008, 09:43
Noch genialer wäre es wenn du als Basis ein Open Source/Freeware Mail Programm verwenden würdest. Das ganze noch Standalone, dann könnte man es sehr gut in Entwicklungen einbinden :)
Peter Schirmer
12.11.2008, 09:52
Der Code ist nicht schwer. Ich habe ihn gerade noch mal ausführlicher kommentiert:
Imports System.IO
Imports Out = Microsoft.Office.Interop.Outlook
Module Module1
Private OutApp As Out.Application = CreateObject(ProgId:="Outlook.Application")
Sub Main()
'Mail-Objekt anlegen
Dim OutMailItem As Out.MailItem = OutApp.CreateItem(Microsoft.Office.Interop.Outlook .OlItemType.olMailItem)
'Objekteigenschaften festlegen
With OutMailItem
'Wichtigkeit
.Importance = Microsoft.Office.Interop.Outlook.OlImportance.olIm portanceNormal
'Weitere Argumente
Dim BodyArg As String = "/body="
Dim SubArg As String = "/subject="
Dim FilesArg As String = "/files="
Dim Empf As String = "/to="
Dim Send As String = "/send="
'Variablen für die Verwendung
Dim Dateien() As String
Dim Volumen As Double = 0
Dim inputName As String = ""
'Durchlaufe alle gefundenen Kommandozeilenschalter
For Each s In My.Application.CommandLineArgs
'Text
If s.ToLower.StartsWith(BodyArg) Then
inputName = s.Remove(0, BodyArg.Length)
.Body = inputName
End If
'Betreff
If s.ToLower.StartsWith(SubArg) Then
inputName = s.Remove(0, SubArg.Length)
.Subject = inputName
End If
'Empfänger
If s.ToLower.StartsWith(Empf) Then
inputName = s.Remove(0, Empf.Length)
.To = inputName
End If
'Anhang
If s.ToLower.StartsWith(FilesArg) Then
inputName = s.Remove(0, FilesArg.Length)
Dateien = Directory.GetFiles(inputName)
Try
'Array durchlaufen
For i = 0 To Dateien.GetUpperBound(0)
.Attachments.Add(Dateien(i))
'Dateigröße bestimmen
Dim Eigenschaften As New FileInfo(Dateien(i))
Volumen = Volumen + Eigenschaften.Length
'Variable auflösen
Eigenschaften = Nothing
Next i
Catch ex As Exception
'Ausgabe Fehlermeldung
MsgBox(ex.Message & " Der aktuelle Anhang hat eine Größe von " & Math.Round((Volumen / 1024 / 1024), 2) & " MB.", MsgBoxStyle.Information Or MsgBoxStyle.SystemModal)
End Try
End If
'Automatisches Senden (führt allerdings zu Outlook-Hinweis)
If s.ToLower.StartsWith(Send) Then
inputName = Microsoft.VisualBasic.LCase(s.Remove(0, Send.Length))
If inputName = "true" Then
.Send()
End If
'Bewusst auf FALSE gesetzt
If inputName = "false" Then
.Display()
End If
'Keine Angabe => Mailfenster dennoch anzeigen
If inputName = "" Then
.Display()
End If
End If
Next
.Display()
End With
End Sub
End Module
Projektdateien folgen. :satisfied:
Edit: Und hier sind sie.
Ghost in the Shell
12.11.2008, 09:55
Das ist VB oder? Ich muss mal wieder meine Syntax kentnisse auffrischen.
Peter Schirmer
12.11.2008, 09:56
Ja, ist es. :satisfied: Die Projektdateien sind oben angehängt.
bluefisch200
14.11.2008, 22:22
Danke, super :up
Finde ich besser als die .NET interne Möglichkeit(ich weis nun kommt natürlich wieder die Frage auf: "ist das schön so?" aber ist mir eigentlich egal)
Peter Schirmer
15.11.2008, 07:54
[...](ich weis nun kommt natürlich wieder die Frage auf: "ist das schön so?" aber ist mir eigentlich egal)
Verstehe ich gerade nicht. :wacko
bluefisch200
15.11.2008, 09:51
Verstehe ich gerade nicht. :wacko
Kleines Beispiel: .NET Applikation fährt einen PC runter:
-Unschön: über die Konsole(cmd) den Befehl geben
-Schön: Die .NET internen Methoden dafür verwenden...
Peter Schirmer
15.11.2008, 09:52
Ach so. Ich dachte, die Antwort bezog sich auf den Unterschied mit .NET eine Mail zu verschicken oder über Outlook. :satisfied:
Peter Schirmer
19.11.2008, 15:36
Mir ist heute eine .NET Bibliothek in die Hand gefallen, die ich unbedingt probieren musste. Damit kann man .zip-Dateien anlegen und entpacken. Das Ergebnis findet ihr hier.
Im Anhang an die erzeugte Mail findet sich nun das Archiv "Archiv.zip" mit den gezippten Dateien.
Der Aufruf erfolgt so:
C:\Temp\OutlookMail.exe /body="Wie versprochen, die Unterlagen." /subject="Ihre Unterlagen" /pack="C:\Temp\bin\Release" /to="test@mail.org
Ihr ersetzt einfach "/files=" durch "/pack=" ;)
Viel Spaß beim Mailen!
bluefisch200
19.11.2008, 16:14
Kurze Frage...ist Open Source oder? Würde das Ganze gerne in ne DLL Packen...für weitere Projekte sicher besser...
Peter Schirmer
19.11.2008, 17:02
Kurze Frage...ist Open Source oder? Würde das Ganze gerne in ne DLL Packen...für weitere Projekte sicher besser...
Kannste in eine .dll packen. ;)
Hab es auch heruntergeladen und find es recht gut. Könnte man nicht noch eine Überprüfung einbauen, ob Outlook überhaupt auf dem PC installiert ist.
Peter Schirmer
23.11.2008, 09:24
Ich habe den Code um ein Try...Catch erweitert. Sollte irgendein Fehler auftauchen, so wird die Fehlermeldung ausgegeben. Aber man sollte das Programm natürlich nur einsetzen, wenn Outlook auch installiert ist. ;)
Der aktuelle Quellcode:
Imports System.IO
Imports Out = Microsoft.Office.Interop.Outlook
Imports Zip
Module Module1
Private OutApp As Out.Application = CreateObject(ProgId:="Outlook.Application")
Sub Main()
Try
'Mail-Objekt anlegen
Dim OutMailItem As Out.MailItem = OutApp.CreateItem(Microsoft.Office.Interop.Outlook .OlItemType.olMailItem)
'Objekteigenschaften festlegen
With OutMailItem
'Wichtigkeit
.Importance = Microsoft.Office.Interop.Outlook.OlImportance.olIm portanceNormal
'Weitere Argumente
Dim BodyArg As String = "/body="
Dim SubArg As String = "/subject="
Dim FilesArg As String = "/files="
Dim Empf As String = "/to="
Dim Send As String = "/send="
Dim Pack As String = "/pack="
'Variablen für die Verwendung
Dim Dateien() As String
Dim Volumen As Double = 0
Dim inputName As String = ""
Dim Zip As New Packer
Dim FilesToZip As String
Dim ArchivName As String
'Durchlaufe alle gefundenen Kommandozeilenschalter
For Each s In My.Application.CommandLineArgs
'Text
If s.ToLower.StartsWith(BodyArg) Then
inputName = s.Remove(0, BodyArg.Length)
.Body = inputName
End If
'Betreff
If s.ToLower.StartsWith(SubArg) Then
inputName = s.Remove(0, SubArg.Length)
.Subject = inputName
End If
'Empfänger
If s.ToLower.StartsWith(Empf) Then
inputName = s.Remove(0, Empf.Length)
.To = inputName
End If
'Packen
If s.ToLower.StartsWith(Pack) Then
inputName = s.Remove(0, Pack.Length)
End If
'Anhang
If s.ToLower.StartsWith(FilesArg) Then
inputName = s.Remove(0, FilesArg.Length)
Dateien = Directory.GetFiles(inputName)
Try
'Array durchlaufen
For i = 0 To Dateien.GetUpperBound(0)
.Attachments.Add(Dateien(i))
'Dateigröße bestimmen
Dim Eigenschaften As New FileInfo(Dateien(i))
Volumen = Volumen + Eigenschaften.Length
'Variable auflösen
Eigenschaften = Nothing
Next i
Catch ex As Exception
'Ausgabe Fehlermeldung
MsgBox(ex.Message & " Der aktuelle Anhang hat eine Größe von " & Math.Round((Volumen / 1024 / 1024), 2) & " MB.", MsgBoxStyle.Information Or MsgBoxStyle.SystemModal)
End Try
End If
'Packen
If s.ToLower.StartsWith(Pack) Then
inputName = s.Remove(0, Pack.Length)
'ArchivName = "OutlookMailArchiv_" & Date.Now.Hour & Date.Now.Minute & Date.Now.Second & ".zip"
ArchivName = "Archiv.zip"
If File.Exists(My.Application.Info.DirectoryPath.ToSt ring & "\Archiv.zip") Then
File.Delete(My.Application.Info.DirectoryPath.ToSt ring & "\Archiv.zip")
End If
Try
'Array durchlaufen
Zip.Packen(My.Application.Info.DirectoryPath & "\" & ArchivName, inputName)
.Attachments.Add(My.Application.Info.DirectoryPath & "\" & ArchivName)
Catch ex As Exception
MsgBox(ex.Message.ToString, MsgBoxStyle.OkOnly Or MsgBoxStyle.Information, "Hinweis")
End Try
End If
'Automatisches Senden (führt allerdings zu Outlook-Hinweis)
If s.ToLower.StartsWith(Send) Then
inputName = Microsoft.VisualBasic.LCase(s.Remove(0, Send.Length))
If inputName = "true" Then
.Send()
End If
'Bewusst auf FALSE gesetzt
If inputName = "false" Then
.Display()
End If
'Keine Angabe => Mailfenster dennoch anzeigen
If inputName = "" Then
.Display()
End If
End If
Next
.Display()
End With
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation Or MsgBoxStyle.SystemModal, "Hinweis")
End Try
End Sub
End Module