PDA

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

WillyV
11.11.2008, 17:49
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. ;)

smitty
22.11.2008, 22:14
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