VBScript: Script zur Erzeugung einer Email mit Variablen füttern
Ich möchte ein Script modifizieren, das ich aus mehreren verschiedenen Entwürfen aus dem Internet zusammengestellt habe.
Dem Script wird auch noch ein Argument per Kommandozeilenbefehl übergeben (Attachment, das von einem anderen Programm erstellt wird). Das funktioniert aber soweit.
Ich will dieses Script in ein anderes einbauen und habe den Code zu diesem Zweck mal als Function definiert.
Ob das der richtige Weg ist weiß ich nicht.
Ich möchte von Sub Funktionen aus Variablen in dieses Script hineinbringen (sMailto,sSubject,sBodyText), um je nach Auswahl im Menü verschiedene Empfänger mit verschiedenen Betreff-Zeilen einzufügen..
Leider bekomme ich das als VBScript Anfänger noch nicht so hin.
Bin gerade dabei mich etwas darin einzulesen und experimentiere mit Code-Schnipseln aus dem Internet.
Bisher werden meine Variablen entweder direkt als Text in Outlook angezeigt (also nicht die Variable die ich gern drin haben würde, sonder eben z.B. als Empfänger der Text "sMailto") oder ich bekomme eine Fehlermeldung "Objekt erforderlich [string:nobody@home.net".
Ich bin mir nicht sicher, was der Fehler ist. Ich hab schon versucht die strings in Objekte zu verwandeln oder als Objekte mit set zu definieren (wo genau liegt eigendlich der Unterschied zwischen variable, String, Objekt etc?) bisher aber ohne Erfolg.
Der Code zum erzeugen der Email über Outlook sieht so aus.
Wie rufe ich den jetzt richtig auf und übergebe die Parameter, Variablen, Strings, Objekte, oder um was es sich dabei auch immer handeln mag?
[code]Function email(sMailto,sSubject,sBodyText)
Dim oApp, oMail, bOLStarted
On Error Resume Next
Set oApp = GetObject("","Outlook.Application")
If oApp Is Nothing Then
Set oApp = CreateObject("Outlook.Application", vbNormalFocus)
bOLStarted = Not oApp Is Nothing
End If
Err.Clear
If Not oApp Is Nothing Then
On Error Resume Next
Set oMail = oApp.CreateItem(0)
Err.Clear
If Not oMail Is Nothing Then
oMail.To = "sMailto"
oMail.Subject = "sSubject"
oMail.Body = "sBodyText"
oMail.Attachments.add WScript.Arguments(0)
' oMail.... = ...
oMail.Display
Set oMail = Nothing
Else
MsgBox "Fehler beim Erstellen der Mail"
End If
If bOLStarted Then oApp.Quit
Set oApp = Nothing
Else
Msgbox "Fehler beim Ermitteln/Erstellen einer Outlook Instanz"
End If [/code]
Der Code mit dem ich obiges versuche aufzurufen sieht momentan so aus:
[code]Sub email_nobody()
Dim sMailto, sSubject, sBodyText
'sMailto = "nobody@home.net"
'sSubject = "Hallo alte Wurschthaut"
'sBodyText = "Hallo Nobody, "&vbcr&_
'""&vbcr&_
'"ich werd nochmal blöde mit dem Script hier:"
set sMailto = GetObject("nobody@home.net")
set sSubject = GetObject("Hallo alte Wurschthaut")
set sBodyText = GetObject("Hallo Nobody, "&vbcr&_
""&vbcr&_
"ich werd nochmal blöde mit dem Script hier:")
call email (sMailto,sSubject,sBodyText)
End Sub[/code]
Ein älterer Versuch steht noch in auskommentierter Form drin.
Es ist vermutlich nur eine Kleinigkeit was hier noch fehlt, aber als blutiger Anfänger komme ich einfach nicht drauf.
Dem Script wird auch noch ein Argument per Kommandozeilenbefehl übergeben (Attachment, das von einem anderen Programm erstellt wird). Das funktioniert aber soweit.
Ich will dieses Script in ein anderes einbauen und habe den Code zu diesem Zweck mal als Function definiert.
Ob das der richtige Weg ist weiß ich nicht.
Ich möchte von Sub Funktionen aus Variablen in dieses Script hineinbringen (sMailto,sSubject,sBodyText), um je nach Auswahl im Menü verschiedene Empfänger mit verschiedenen Betreff-Zeilen einzufügen..
Leider bekomme ich das als VBScript Anfänger noch nicht so hin.
Bin gerade dabei mich etwas darin einzulesen und experimentiere mit Code-Schnipseln aus dem Internet.
Bisher werden meine Variablen entweder direkt als Text in Outlook angezeigt (also nicht die Variable die ich gern drin haben würde, sonder eben z.B. als Empfänger der Text "sMailto") oder ich bekomme eine Fehlermeldung "Objekt erforderlich [string:nobody@home.net".
Ich bin mir nicht sicher, was der Fehler ist. Ich hab schon versucht die strings in Objekte zu verwandeln oder als Objekte mit set zu definieren (wo genau liegt eigendlich der Unterschied zwischen variable, String, Objekt etc?) bisher aber ohne Erfolg.
Der Code zum erzeugen der Email über Outlook sieht so aus.
Wie rufe ich den jetzt richtig auf und übergebe die Parameter, Variablen, Strings, Objekte, oder um was es sich dabei auch immer handeln mag?
[code]Function email(sMailto,sSubject,sBodyText)
Dim oApp, oMail, bOLStarted
On Error Resume Next
Set oApp = GetObject("","Outlook.Application")
If oApp Is Nothing Then
Set oApp = CreateObject("Outlook.Application", vbNormalFocus)
bOLStarted = Not oApp Is Nothing
End If
Err.Clear
If Not oApp Is Nothing Then
On Error Resume Next
Set oMail = oApp.CreateItem(0)
Err.Clear
If Not oMail Is Nothing Then
oMail.To = "sMailto"
oMail.Subject = "sSubject"
oMail.Body = "sBodyText"
oMail.Attachments.add WScript.Arguments(0)
' oMail.... = ...
oMail.Display
Set oMail = Nothing
Else
MsgBox "Fehler beim Erstellen der Mail"
End If
If bOLStarted Then oApp.Quit
Set oApp = Nothing
Else
Msgbox "Fehler beim Ermitteln/Erstellen einer Outlook Instanz"
End If [/code]
Der Code mit dem ich obiges versuche aufzurufen sieht momentan so aus:
[code]Sub email_nobody()
Dim sMailto, sSubject, sBodyText
'sMailto = "nobody@home.net"
'sSubject = "Hallo alte Wurschthaut"
'sBodyText = "Hallo Nobody, "&vbcr&_
'""&vbcr&_
'"ich werd nochmal blöde mit dem Script hier:"
set sMailto = GetObject("nobody@home.net")
set sSubject = GetObject("Hallo alte Wurschthaut")
set sBodyText = GetObject("Hallo Nobody, "&vbcr&_
""&vbcr&_
"ich werd nochmal blöde mit dem Script hier:")
call email (sMailto,sSubject,sBodyText)
End Sub[/code]
Ein älterer Versuch steht noch in auskommentierter Form drin.
Es ist vermutlich nur eine Kleinigkeit was hier noch fehlt, aber als blutiger Anfänger komme ich einfach nicht drauf.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 238732
Url: https://administrator.de/contentid/238732
Ausgedruckt am: 22.11.2024 um 09:11 Uhr
26 Kommentare
Neuester Kommentar
Hallo fred,
Beispiel:
Zum Lernen, anstatt nur Trial&Error zu betreiben, empfehle ich dir folgende Lektüren:
Grüße Uwe
p.s. bitte schieben den Beitrag in Entwicklung/VB for Applications
Beispiel:
strEmpfaenger = "nobody@home.net"
strSubject = "Das ist ein Subject"
strBody = "Das ist ein Body" & vbNewLine & "und ich eine zweite Zeile"
' ### Mit Attachment versenden ...####
' myAttachments = Array("D:\File1.docx","D:\File2.xlsx")
' email strEmpfaenger,strSubject,strBody,myAttachments
' ### Versende eine Mail ohne Attachment ###
email strEmpfaenger,strSubject,strBody,Array()
Function email(sMailto,sSubject,sBodyText,arrAttachments())
On Error Resume Next
Set objOutlook = GetObject("","Outlook.Application")
If objOutlook Is Nothing Then
Set objOutlook = CreateObject("Outlook.Application")
End If
Set objMail = objOutlook.CreateItem(0)
If Not objMail Is Nothing Then
With objMail
.To = sMailto
.Subject = sSubject
.Body = sBodyText
If UBound(arrAttachments) <> -1 Then
For i = 0 To UBound(arrAttachments)
.Attachments.Add arrAttachments(i)
Next
End If
.Display
'.Send
End With
End If
Set objOutlook = Nothing
End Function
Zum Lernen, anstatt nur Trial&Error zu betreiben, empfehle ich dir folgende Lektüren:
VBA/VBS/WSH/Office Developer Referenzen
- Visual Basic-Referenz
- Windows Script Host -Referenz
- Office 2010 Developer References
- Office 2013 Developer References
- Bücher zu VBA
Grüße Uwe
p.s. bitte schieben den Beitrag in Entwicklung/VB for Applications
Äh, kannst du mir mal erklären, wo hier der grosse Unterschied zu dem ist, was ich gepostet habe?
sicher dat ...oMail.To = "sMailto"
oMail.Subject = "sSubject"
oMail.Body = "sBodyText"
du machst hier aus den eigentlichen Variablen wieder Strings ... wegen den Anführungszeichen, wenn du diese weglässt sind es Variablen dessen Inhalt der Eigenschaft zugewiesen werden, ansonsten nur reine Strings die der Eigenschaft zugewiesen werden.oMail.Subject = "sSubject"
oMail.Body = "sBodyText"
http://www.html-world.de/program/vbs_2.php
Zitat von @fred08155:
Super. Wird gleich ausprobiert.
Dann noch als abschliessende Frage: ist es machbar (Beispielcode), dass der Cursor am Ende in einer Leerzeile unter dem Body Text
rumblinkt?
Mit Bordmitteln von Outlook selber, nicht.Super. Wird gleich ausprobiert.
Dann noch als abschliessende Frage: ist es machbar (Beispielcode), dass der Cursor am Ende in einer Leerzeile unter dem Body Text
rumblinkt?
Wenn Outlook bereits offen ist wird dies referenziert und bekommt bei der Display-Methode des Mailitems den Focus
Wenn man bei bereits geöffnetem Outlook ein neues Outlook Objekt erzeugt kann es sein das es nicht immer gleich den Fokus bekommt, das ist dann Zufall.
Willst du Anführungszeichen in einer Befehlszeile verwenden musst du sie innerhalb eines Strings verdoppeln. Hiermit können dann die Parameter auch Leerzeichen enthalten.
Grüße Uwe
Wenn man bei bereits geöffnetem Outlook ein neues Outlook Objekt erzeugt kann es sein das es nicht immer gleich den Fokus bekommt, das ist dann Zufall.
An der Stelle hat vbNormalFocus wohl nix bewirkt (in der alten Variante aber auch keinen Fehler bewirkt)
So ein Parameter Ist auch für die CreateObject() Methode nicht vorgesehen !die Subroutine ein weiteres Script aufgerufen hat (WSHShell.Run "wscript weiteres-script.vbs", vbNormalFocus) und hier hat vbNormalFocus definitiv was gebracht.
Sicher, diese Funktion hat ja auch diesen Parameter !Damit es aber nicht nachher tausend Scripte sind wollte ich eben hiermit die Funktion in das Hauptscript integrieren.
Und zum anderen hatte ich es nicht geschafft die Wscript.Arguments von einem Script an das nächste zu vererben. Vielleicht warn auch nur mal wieder ein paar Anführungszeichen zu viel drin. ^^
Und zum anderen hatte ich es nicht geschafft die Wscript.Arguments von einem Script an das nächste zu vererben. Vielleicht warn auch nur mal wieder ein paar Anführungszeichen zu viel drin. ^^
Set objShell = CreateObject("Wscript.Shell")
varArgument1 = "test1"
varArgument2 = "Parameter 2 mit Leerzeichen"
objShell.Run "wscript ""C:\anderes_script.vbs"" """ & varArgument1 & """ """ & varArgument2 & """"
Grüße Uwe
Ich meinte das mit dem Zufall in der vorherigen Variante als es noch nicht angepasst war, im jetzigen Zustand sollte das Fenster zu 99% den Fokus bekommen.
Hiermit lässt sich die Zuverlässigkeit noch steigern, und der Focus auf den Outlook-Prozess legen. Das Script holt sich die PID des Outlook-Prozesses und übergibt diese an die Funktion AppActivate des Shell-Objekts.
AppActivate kann zwar auch nach Fenster-Titeln aktivieren, aber die PID ist da doch zuverlässiger.
In Kombination mit obigem Script sieht das dann so aus:
Grüße Uwe
Hiermit lässt sich die Zuverlässigkeit noch steigern, und der Focus auf den Outlook-Prozess legen. Das Script holt sich die PID des Outlook-Prozesses und übergibt diese an die Funktion AppActivate des Shell-Objekts.
Set objShell = CreateObject("Wscript.Shell")
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where Name = 'outlook.exe'")
For Each objProcess in colProcessList
objShell.AppActivate objProcess.Handle
Next
In Kombination mit obigem Script sieht das dann so aus:
Set objShell = CreateObject("Wscript.Shell")
strEmpfaenger = "nobody@home.net"
strSubject = "Das ist ein Subject"
strBody = "Das ist ein Body" & vbNewLine & "und ich eine zweite Zeile"
email strEmpfaenger,strSubject,strBody,Array()
Function email(sMailto,sSubject,sBodyText,arrAttachments())
On Error Resume Next
Set objOutlook = GetObject("","Outlook.Application")
If objOutlook Is Nothing Then
Set objOutlook = CreateObject("Outlook.Application")
End If
Set objMail = objOutlook.CreateItem(0)
If Not objMail Is Nothing Then
With objMail
.To = sMailto
.Subject = sSubject
.Body = sBodyText
If UBound(arrAttachments) <> -1 Then
For i = 0 To UBound(arrAttachments)
.Attachments.Add arrAttachments(i)
Next
End If
.Display
'set focus to Outlook process
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where Name = 'outlook.exe'")
For Each objProcess in colProcessList
objShell.AppActivate objProcess.Handle
Next
End With
End If
Set objOutlook = Nothing
End Function
Hallo zusammen!
Um den Cursor im Word-Editor in eine neue Zeile zu setzen, geht in etwa so:
Grüße spatzenhirn
Super. Wird gleich ausprobiert.
Dann noch als abschliessende Frage: ist es machbar (Beispielcode), dass der Cursor am Ende in einer Leerzeile unter dem Body Text blinkt?
Dann noch als abschliessende Frage: ist es machbar (Beispielcode), dass der Cursor am Ende in einer Leerzeile unter dem Body Text blinkt?
Mit Bordmitteln von Outlook selber, nicht.
Um den Cursor im Word-Editor in eine neue Zeile zu setzen, geht in etwa so:
With objMail
.To = sMailto
.Subject = sSubject
.Body = sBodyText
With .GetInspector.WordEditor
.Paragraphs.Add
.Windows(1).Selection.EndKey 6 'wdStory
End With
If UBound(arrAttachments) <> -1 Then
For i = 0 To UBound(arrAttachments)
.Attachments.Add arrAttachments(i)
Next
End If
.Display
..........
Grüße spatzenhirn
Hallo fred08155!
Mit automatischer Signatur In etwa so (ohne .Body = Text):
Grüße Spatzenhirn
[edit] sText in sBodyText geändert [/edit]
Mit automatischer Signatur In etwa so (ohne .Body = Text):
With objMail
.To = sMailto
.Subject = sSubject
With .GetInspector.WordEditor
.Paragraphs.Add
.Paragraphs.First.Range.Text = sBodyText & vbNewLine & vbNewLine & vbNewLine
.Windows(1).Selection.MoveDown 5, 3 'wdLine, Zeilenanzahl
End With
If UBound(arrAttachments) <> -1 Then
For i = 0 To UBound(arrAttachments)
.Attachments.Add arrAttachments(i)
Next
End If
.Display
..........
Grüße Spatzenhirn
[edit] sText in sBodyText geändert [/edit]
oder die Automatische Signatur in Outlook einschalten um dann deinen Text dem Body voranstellen:
Alternativ kannst du auch eine Mail anhand einer *.oft Vorlage erstellen, in der deine Signatur im Body schon eingefügt ist
Die Möglichkeiten sind hier vielfältig.
Grüße Uwe
.Body = sBodyText & vbNewline & .Body
Set objMail = objOutlook.CreateItemFromTemplate("c:\vorlage.oft")
Grüße Uwe
Hallo Fred08155!
Hatte im letzten Code 'sText' anstatt sBodyText stehen (geändert)...
Grüße spatzenhirn
Hatte im letzten Code 'sText' anstatt sBodyText stehen (geändert)...
Grüße spatzenhirn
Vorlage basteln ist schlecht, das Script soll unabhängig von einem Netzwerk-Pfad laufen und an jedem Rechner im Netzwerk funktionieren.
Es reicht auch eine leere Vorlage, denn wenn man diese Variante benutzt wird die eingestellte Autosignatur automatisch mit eingefügt (dieses Verhalten dafür lässt sich auch in der Registry steuern).Ansonsten wie gesagt gibt es dafür mehrere Ansätze einer wäre dieser um die Signatur über das Commandbars-Objekt einzufügen:
Den Namen den die Signatur hat musst du natürlich entsprechend anpassen.
..
...
....
.Display
With .GetInspector
.WordEditor.Windows(1).Selection.Endkey 6
strNameSignature = "NameDeinerSignatur"
.CommandBars.Item("Insert").Controls("Signatur").Controls(strNameSignature).Execute
End With
...
..
.
Viel Erfolg
Grüße Uwe
Zitat von @fred08155:
Probier ich später mal.
Was muss ich dabei alles anpassen?
Muss ich eine Variable definieren? Bzw wie oder was mach ich bei "NameDeinerSignatur" rein?
Der Name mit dem die Signatur in Outook benannt ist.Probier ich später mal.
Was muss ich dabei alles anpassen?
Muss ich eine Variable definieren? Bzw wie oder was mach ich bei "NameDeinerSignatur" rein?
Muss ich wo einen Pfad einfügen?
Für diese Variante ist kein Pfad nötig, das dies Quasi den Befehl der Symbolleiste für das Einfügen der Signatur ausführt.Wenn ich das Programm Paint.NET mit Run starten will findet das Script aber das Programm nicht, obwohl der Pfad stimmt.
Kann es sein, dass der Pfad als URL oder sonstwas interpretiert wird?
Shell.Run "%programfiles%\Paint.NET\PaintDotNet.exe" & Wscript.Arguments(0)
Du hast in dem Pfad Leerzeichen in der Umgebungsvariablen, deshalb musst du den Pfad in Anführungszeichen setzen wenn du Parameter mitgeben willst (die verdoppelt werden müssen), hatte ich aber oben bereits erwähnt..Kann es sein, dass der Pfad als URL oder sonstwas interpretiert wird?
Shell.Run "%programfiles%\Paint.NET\PaintDotNet.exe" & Wscript.Arguments(0)
Shell.Run """%programfiles%\Paint.NET\PaintDotNet.exe"" " & """" & Wscript.Arguments(0) & """"
Für alles andere was VBS angeht bitte einen neuen Thread aufmachen. Merci.
Grüße Uwe
Das mit dem verdoppeln der Anführungszeichen hab ich wohl auch noch nicht ganz kapiert.
Im Grunde ist das ganz einfach. Wenn du ein einzelnes Anführungszeichen in einem String mit ausgeben willst musst du dies verdoppeln da es ansonsten in VBS als das Ende der Zeichenfolge interpretiert wird, da das " ja der Begrenzer für den String ist.Also ein
var = """"
var = chr(34)
Shell.Run chr(34) & "%programfiles%\Paint.NET\PaintDotNet.exe" & chr(34) & " " & chr(34) & Wscript.Arguments(0) & chr(34)
Aber an dieser Sache hängt meist jeder VBS-Anfänger wenn er das erste mal damit in Kontakt kommt, ich war da damals keine Ausnahme.
Bei der Ausführung eines Programmes, musst dir immer vorstellen als wärst du in einem CMD-Fenster. Dort würde dir der Interpreter auch eine Fehlermeldung auswerfen wenn du ein Programm mit Leerzeichen im Pfad ohne Anführungszeichen starten wolltest.
Denke jetzt sollte es klick machen
Grüße Uwe