Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
972to976
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
972to976
972to976
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

HTML-eMailversand

HTML-eMailversand
30.04.2008 14:32:00
volti
Hallo zusammen!
Ich möchte gerne meinem Kostenberichtsversand (email) von php auf Excel umstellen. (Politischer Grund)
Dazu habe ich mir schon eine kleine Routine geschrieben, die eine beliebige Anzahl (z.Zt. 60) emails erzeugt und inclusive der Kostenberichtsdatei versendet.
Hierbei habe ich noch zwei Probleme zu lösen, falls überhaupt möglich.
1. Werde ich bei jeder eMail mit einer lästigen, zu bestätigenden MsgBox "Eine Anwendung versucht...." behindert. Gibt es eine Möglichkeit, diese nicht oder nur einmalig bestätigen zu müssen?
Sicherlich ist das eine Spamverhinderungsfrage, aber doch in meinem Fall eher lästig.
2. Möchte ich in meinen Mails (HTML-Format) noch ein paar Icons einbauen. Die Möglichkeit diese per Link von einem Server zu laden, scheidet aus. Bleibt nur noch, diese irgendwie ins Mail an bestimmter Stelle einzufügen. Hat da jemand eine Ahnung wie man das machen kann.
Die Methode wie in php über &ltimg src="cid:kb_hg.jpg" width="600" height="69" border="0"&gt wird wohl nicht gehen?!
viele Grüße aus Freigericht
Karl-Heinz
PS: Wenn's interessiert, hier meine bisheriger Ansatz:

Sub Versende_Berichte_per_Email()
'Working in 2000-2007
'This example send the last saved version of the Activeworkbook
Const olMailItem = 0
Const olFormatUnspecified = 0
Const olFormatPlain = 1
Const olFormatHTML = 2
Const olFormatRichText = 3
Const olImportanceLow = 0
ConstolmportanceNormal = 1 '(Default)
Const olImportanceHigh = 2
Dim OutApp As Object, OutMail As Object
Dim Zeile As Integer, Empf As Integer
Dim Pfad As String, Text As String
Pfad = "D:\PIV_ADD\Excel\"
Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon
Set Inp = Sheets("Vorgaben")
On Error Resume Next
Empf = 10
'HTML-Vorlage einlesen
Open "D:\PIV_ADD\Mailvorgabe.txt" For Binary As #1
Text = Input(LOF(1), #1)
Close #1
For Zeile = 3 To 100
If Inp.Cells(Zeile, Empf) = "" Then Exit For
Set OutMail = OutApp.CreateItem(0)
OutMail.To = Inp.Cells(Zeile, Empf + 1).Value
OutMail.CC = Inp.Cells(Zeile, Empf + 2).Value
OutMail.BCC = ""
OutMail.Subject = Inp.Cells(1, 12).Value
OutMail.Sendername = "Volti"
OutMail.BodyFormat = olFormatHTML
OutMail.Importance = olImportanceHigh
OutMail.Categories = "Kostenberichte"
If UCase$(Left$(Inp.Cells(Zeile, Empf), 4)) = "FRAU" Then
Anrede = "Sehr geehrte "
Else
Anrede = "Sehr geehrter "
End If
Anrede = Anrede & Inp.Cells(Zeile, Empf) & "," & vbCrLf & vbCrLf     'Anrede erstellen
Text = Replace(Text, "#Anrede#", Anrede)                             'Anrede in Vorlagedaten  _
_
ersetzen
Text = Replace(Text, "#Periode#", "Juli 2008")
OutMail.HTMLBody = Text
'   OutMail.Body = Anrede & Inp.Cells(1, 14)                            'restlichen Body zufü _
gen (Textformat)
For X = Empf + 3 To Empf + 10
If Inp.Cells(Zeile, X) = "" Then Exit For                          'keine weiteren Anlagen  _
_
mehr vorgegeben
OutMail.Attachments.Add Pfad & Inp.Cells(Zeile, X).Value           'Anlage beifügen
Next
OutMail.Send
'   OutMail.Display
Next
On Error GoTo 0
Set Inp = Nothing
Set OutMail = Nothing
Set OutApp = Nothing
End Sub


17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: HTML-eMailversand
30.04.2008 16:34:57
mumpel
Hallo!
zu 2: Setzte die zeile in Anführungszeichen, also der Typ muss dabei auf hmtlbody gesetzt werden, die Anführungszeichen gedoppelt.
Zu 1: ersetze mal .send durch durch diese zwei Zeilen:
.display
SendKeys "%s", True
Tipp: Setze die vielen "OutMail" besser in einen Withblock. Das sieht besser aus und das makro läuft etwas schneller.
1. Bei Inp kann Set entfallen. Ich habe mal das Makro etwas anpgepasst. Ist aber ungetestet.
Sub Versende_Berichte_per_Email()
Rem Working in 2000-2007 
Rem This example send the last saved version of the Activeworkbook 
Dim olapp As Object
Dim Zeile As Integer
Dim Empf As Integer
Dim Pfad As String
Dim Text As String
Const olMailItem = 0
Const olFormatUnspecified = 0
Const olFormatPlain = 1
Const olFormatHTML = 2
Const olFormatRichText = 3
Const olImportanceLow = 0
ConstolmportanceNormal = 1 '(Default) 
Const olImportanceHigh = 2
Pfad = "D:\PIV_ADD\Excel\"
Rem Set olApp = CreateObject("Outlook.Application") 
Rem OutApp.Session.Logon 
Inp = Sheets("Vorgaben")
On Error Resume Next
Empf = 10
Rem HTML-Vorlage einlesen 
Open "D:\PIV_ADD\Mailvorgabe.txt" For Binary As #1
Text = Input(LOF(1), #1)
Close #1
For Zeile = 3 To 100
    Set olapp = CreateObject("Outlook.Application")
    With olapp.CreateItem(0)
        .To = Inp.Cells(Zeile, Empf + 1).Value
        .CC = Inp.Cells(Zeile, Empf + 2).Value
        .BCC = ""
        .Subject = Inp.Cells(1, 12).Value
        .Sendername = "Volti"
        .BodyFormat = olFormatHTML
        .Importance = olImportanceHigh
        .Categories = "Kostenberichte"
        If UCase$(Left$(Inp.Cells(Zeile, Empf), 4)) = "FRAU" Then
           Anrede = "Sehr geehrte "
    Else
        Anrede = "Sehr geehrter "
    End If
        Anrede = Anrede & Inp.Cells(Zeile, Empf) & "," & vbCrLf & vbCrLf 'Anrede erstellen 
        Text = Replace(Text, "#Anrede#", Anrede)                         'Anrede in Vorlagedaten ersetzen 
        Text = Replace(Text, "#Periode#", "Juli 2008")
        olapp.HTMLBody = Text & "<br><br><img src=""cid:kb_hg.jpg"" width=""600"" height=""69"" border=""0"">"
Rem olapp.Body = Anrede & Inp.Cells(1, 14)                            'restlichen Body zufü gen (Textformat) 
    For X = Empf + 3 To Empf + 10
        If Inp.Cells(Zeile, X) = "" Then Exit For                     'keine weiteren Anlagen mehr vorgegeben 
        OutMail.Attachments.Add Pfad & Inp.Cells(Zeile, X).Value      'Anlage beifügen 
    Next
        .display
        SendKeys "%s", True
Rem OutMail.Display 
    Next
End With
Rem Set Inp = Nothing 
Rem Set OutMail = Nothing 
Set OutApp = Nothing
On Error GoTo 0
End Sub


Gruß, Rene

Anzeige
Kleine Fehler:
30.04.2008 16:43:06
mumpel
Habe noch ein paar Kleinigkeiten ausgebessert. (Bodyformat entfernt, Importance und Categories ausdokumentiert, da ich nicht sicher bin, ob das in VBA funktioniert)
Sub Versende_Berichte_per_Email()
Rem Working in 2000-2007 
Rem This example send the last saved version of the Activeworkbook 
Dim olapp As Object
Dim Zeile As Integer
Dim Empf As Integer
Dim Pfad As String
Dim Text As String
Const olMailItem = 0
Const olFormatUnspecified = 0
Const olFormatPlain = 1
Const olFormatHTML = 2
Const olFormatRichText = 3
Const olImportanceLow = 0
ConstolmportanceNormal = 1 '(Default) 
Const olImportanceHigh = 2
Pfad = "D:\PIV_ADD\Excel\"
Rem Set olApp = CreateObject("Outlook.Application") 
Rem OutApp.Session.Logon 
Inp = Sheets("Vorgaben")
On Error Resume Next
Empf = 10
Rem HTML-Vorlage einlesen 
Open "D:\PIV_ADD\Mailvorgabe.txt" For Binary As #1
Text = Input(LOF(1), #1)
Close #1
For Zeile = 3 To 100
    Set olapp = CreateObject("Outlook.Application")
    With olapp.CreateItem(0)
        .To = Inp.Cells(Zeile, Empf + 1).Value
        .CC = Inp.Cells(Zeile, Empf + 2).Value
        .BCC = ""
        .Subject = Inp.Cells(1, 12).Value
        .Sendername = "Volti"
        .Body = Anrede & Inp.Cells(1, 14)                                'restlichen Body zufü gen (Textformat) 
Rem     .Importance = olImportanceHigh 
Rem     .Categories = "Kostenberichte" 
        If UCase$(Left$(Inp.Cells(Zeile, Empf), 4)) = "FRAU" Then
           Anrede = "Sehr geehrte "
    Else
        Anrede = "Sehr geehrter "
    End If
        Anrede = Anrede & Inp.Cells(Zeile, Empf) & "," & vbCrLf & vbCrLf 'Anrede erstellen 
        Text = Replace(Text, "#Anrede#", Anrede)                         'Anrede in Vorlagedaten ersetzen 
        Text = Replace(Text, "#Periode#", "Juli 2008")
        .HTMLBody = Text & "<br><br><img src=""cid:kb_hg.jpg"" width=""600"" height=""69"" border=""0"">"
Rem olapp.Body = Anrede & Inp.Cells(1, 14)                               'restlichen Body zufü gen (Textformat) 
    For X = Empf + 3 To Empf + 10
        If Inp.Cells(Zeile, X) = "" Then Exit For                        'keine weiteren Anlagen mehr vorgegeben 
        OutMail.Attachments.Add Pfad & Inp.Cells(Zeile, X).Value         'Anlage beifügen 
    Next
        .display
        SendKeys "%s", True
Rem OutMail.Display 
    Next
End With
Rem Set Inp = Nothing 
Rem Set OutMail = Nothing 
Set OutApp = Nothing
On Error GoTo 0
End Sub


Anzeige
AW: Kleine Fehler:
30.04.2008 20:03:00
Volti
Hallo Rene,
danke für Deine Tipps.
Das mit dem "SendKeys" ist ein guter Tipp. Auf der Heimfahrt im Zug kam mir eine ähnliche Idee über keyboard- bzw. mouseevent. Werde aber erst mal deinen Tipp ausprobieren. Kann ich aber erst am Montag, zuhause verwende ich kein Outlook.
Das auskommentierte "Importance" funktioniert durchaus. Mein ganzer code funktioniert bestens. Habe jetzt eine Beschreibung zu sämtlichen möglichen Mailparametern gefunden. Danach sollte ich eher den Sendername wegnehmen. Den kann man nämlich nur lesen und nicht setzen.
Dass Set bei Inp entfallen kann, glaube ich Dir gern; wunder mich aber schon, denn das ist doch ein Object, nämlich ein Sheetobject.
Das mit dem WITH hattte ich erst da stehen. Wusste aber nicht, ob innerhalb von WITH IF-Abfragen stehen dürfen und da habe ich alles so geschrieben
Warum hast das Bodyformat entfernt? Es soll doch ein HTML-Mail sein. Die Tags dazu stehen in der Textdatei.
Zu meiner zweiten Frage kann ich leider keine Antwort finden, da haben wir uns wohl falsch verstanden. Es geht weniger darum, die tags (so binde ich Bilder in HTML per php ein) einzubinden, sondern darum, dass die cid (content-id) auf das eingebettete Bild verweist. Die Binärdaten des Bildes müssen aber auch irgendwie in die Mail geladen werden und ein Bezug hergestellt werden. In php gibts code dafür.
Oder so ein Bild kann mit Outlook irgendwie anders an gewünschter Stelle eingefügt werden?
Nur nicht per Hand :-)
Auf jeden Fall vielen Dank für Deine Rückmeldung.
Gruß
KH

Anzeige
AW: Kleine Fehler:
30.04.2008 20:17:56
mumpel
OutMail.BodyFormat = olFormatHTMLcolor> habe ich entfernt, da es IMHO nicht notwendig ist. In VBA gibt es .htmlbodycolor> (für HTML-Mail) oder .bodycolor> (für Textmail).

Nachtrag:
30.04.2008 20:34:00
mumpel
Habe noch ein paar kleiner Fehler entdeckt und rausgenommen. Session.Logon ist IMHO ebenfalls nicht notwendig.
Sub Versende_Berichte_per_Email()
Rem Working in 2000-2007 
Rem This example send the last saved version of the Activeworkbook 
Dim olapp As Object
Dim Zeile As Integer
Dim Empf As Integer
Dim Pfad As String
Dim Text As String
Dim Inp As Object
Const olMailItem = 0
Const olFormatUnspecified = 0
Const olFormatPlain = 1
Const olFormatHTML = 2
Const olFormatRichText = 3
Const olImportanceLow = 0
Const olmportanceNormal = 1 '(Default) 
Const olImportanceHigh = 2
Pfad = "D:\PIV_ADD\Excel\"
Rem Set olApp = CreateObject("Outlook.Application") 
Rem OutApp.Session.Logon 
Inp = Sheets("Vorgaben")
On Error Resume Next
Empf = 10
Rem HTML-Vorlage einlesen 
Open "D:\PIV_ADD\Mailvorgabe.txt" For Binary As #1
Text = Input(LOF(1), #1)
Close #1
For Zeile = 3 To 100
    Set olapp = CreateObject("Outlook.Application")
    With olapp.CreateItem(0)
        .To = Inp.Cells(Zeile, Empf + 1).Value
        .CC = Inp.Cells(Zeile, Empf + 2).Value
        .BCC = ""
        .Subject = Inp.Cells(1, 12).Value
        .Sendername = "Volti" 'restlichen Body zufü gen (Textformat) 
Rem     .Importance = olImportanceHigh 
Rem     .Categories = "Kostenberichte" 
        If UCase$(Left$(Inp.Cells(Zeile, Empf), 4)) = "FRAU" Then
           Anrede = "Sehr geehrte "
    Else
        Anrede = "Sehr geehrter "
    End If
        Anrede = Anrede & Inp.Cells(1, 14) & Anrede & Inp.Cells(Zeile, Empf) & "," & vbCrLf & vbCrLf 'Anrede erstellen 
        Text = Replace(Text, "#Anrede#", Anrede) 'Anrede in Vorlagedaten ersetzen 
        Text = Replace(Text, "#Periode#", "Juli 2008")
        .HTMLBody = Text & "<br><br><img src=""cid:kb_hg.jpg"" width=""600"" height=""69"" border=""0"">"
    For X = Empf + 3 To Empf + 10
        If Inp.Cells(Zeile, X) = "" Then Exit For 'keine weiteren Anlagen mehr vorgegeben 
        .Attachments.Add Pfad & Inp.Cells(Zeile, X).Value 'Anlage beifügen 
    Next
        .display
        SendKeys "%s", True
    Next
End With
Set OutApp = Nothing
On Error GoTo 0
End Sub


Anzeige
AW: Nachtrag:
30.04.2008 20:43:38
Volti
Hallo Rene,
danke. Werde das rausnehmen. Wat nich mut, dat mut nich. :-)
Das mit den Bildern habe ich noch im PB-Forum platziert. mal gucken, ob da einer 'ne Idee hat.
PS: Was heißt imho?
Gruß
KH

AW: Nachtrag zum Nachtrag
30.04.2008 20:56:00
Volti
Ich habe hier einen COM-Browser, speziell von PowerBasic bereitgestellt.
Mit dem kann man alle Objektdateien und Libraries durchscannen und die vorhandenen Objekte und Items usw. entnehmen, also u.a. auch für Outlook.
Daher habe ich auch u.a den Eintrag "Bodyformat" und weiteres.
Könnte mir vorstellen, dass das weniger eine Sache von VBA ist, was es gibt sondern was die entsprechende Library anbietet und erwartet. Kann allerdings auch falsch liegen.
Gruß KH

Anzeige
AW: Nachtrag:
30.04.2008 21:09:00
mumpel
IMHO stammt aus dem englichen und bedeutet im deutschen soviel wie: Meiner unmaßgeblichen/bescheidenen/ehrlichen Meinung nach. Solche Abkürzungen werden in Foren und Chatrooms benutzt. Siehe Wikipedia: Abkürzungen in Foren und Chatrooms.

AW: Nachtrag:
30.04.2008 21:15:59
mumpel
Noch ein nachtrag: Du kannst in VBA auch im htmlbody lleinks zu Bildern anbringen. Dabei müssen wie bereits erwähnt Anführungszeichen gedoppelt werden. Alles muss im HTML-Format angegeben werden. ZumBeipsiel der br-Tag. Dieser muss in Anführungszeichen stehen. Outlook setzt diesen automatisch in ´HTML um, es wird also ein zeilenumbruch daraus.
Also nochmal in Kurzform. Immer HTML-Code verwenden: Zum Beispiel "&ltbr&gt" für Zeilenumbruch.

Anzeige
AW: Nachtrag:
30.04.2008 21:54:00
mumpel
Weil es so schön ist, hier ein Beispiel. Wenn Du das Makro auslöst, sollte eine Mail angezeigt werden, in welcher am Ende ein Bild angezeigt wird. Dieses wird von meiner Homepage heruntergeladen (ein Bildschirmfoto eines meiner Projekte).
Sub Versende_Berichte_per_Email()
Dim olapp As Object
Set olapp = CreateObject("Outlook.Application")
 With olapp.CreateItem(0)

 .To = ""
 .CC = ""
 .BCC = ""
 .Subject = ""
Rem  .Importance = olImportanceHigh 
Rem  .Categories = "Kostenberichte" 
 .htmlbody = "Sehr geehrte Damen und Herren,<br><br>Anbei ein Beispielbild von meiner Homepage" & _
 "<br><br>Mit freundlichen Grüßen,<br>Franz Mustermann<br><br>" & _
 "<img src="style='color:#FF0000'>"http://www.rholtz-office.de/AZTab1.gif"
style='color:#FF0000'>">"
 .display
 'SendKeys "%s", True 
End With
Set OutApp = Nothing
On Error GoTo 0
End Sub


Anzeige
AW: Nachtrag:
01.05.2008 10:50:00
Volti
Hallo Rene,
vielen Dank. Ich sehe schon, Du kannst Dich da richtig austoben. :-)
Aber, die Verlinkung auf eine Homepage zur Anzeige von Bildern möchte ich ja gerade nicht machen. Diese Methode ist mir bekannt, siehe Eingangsfrage. Ich habe diese Mails bisher mit php gemacht und möchte es nun einfach mit Excel machen.
Vorteil der Verlinkung: Man kann nachträglich Bilder ändern, die dann in allen ehemaligen Mails beim Öffnen aktualisiert erscheinen.
Nachteil: Man muss eine Homepage haben; wenn diese nicht online ist, sind auch die Bilder in den Mails weg, wenn sie nicht aus dem Cache geladen werden können und es entsteht verstärkt Traffic.
schönen 1.Mai.
KH

Anzeige
AW: Nachtrag:
01.05.2008 14:50:00
mumpel
Du kannst die Icons auf der Festplatte speichern. Dann verlinkst Du anstatt auf einen Server auf das Icon auf der Festplatte. Das Icon/Bild wird dann ebenfalls in die Mail eingefügt und verbleibt dann darin (irgendwo in einem versteckten Bereich der HTML-Mail), auch wenn Du das Bild anschließend löschen solltst. Habe das getestet und es funktioniert.
Sub Versende_Berichte_per_Email()
Dim olapp As Object
Set olapp = CreateObject("Outlook.Application")
    With olapp.CreateItem(0)
        .To = ""
        .CC = ""
        .BCC = ""
        .Subject = ""
Rem     .Importance = olImportanceHigh 
Rem     .Categories = "Kostenberichte" 
        .htmlbody = "Sehr geehrte Damen und Herren,<br><br>Anbei ein Beispielbild von meiner Homepage" & _
            "<br><br>Mit freundlichen Grüßen,<br>Franz Mustermann<br><br>" & _
            "<img src=""C:\AZTab1.gif"">"
        .display
        'SendKeys "%s", True 
End With
Set OutApp = Nothing
On Error GoTo 0
End Sub


Anzeige
AW: Nachtrag:
01.05.2008 20:33:44
Volti
Schön, wenn das so funktioniert und auch mit versendet wird, wäre es die Lösung.
Werde das am Montag testen.
Für das Ausschalten des unerwünschten Securitydialogs soll, (neben Deinem Vorschlag) auch folgendes funktionieren:

Sub Mail()
Set OutApp   = CreateObject("Outlook.Application")
Set OutMail   = OutApp.CreateItem(olMailItem)
Set SafeItem = CreateObject("Redemption.SafeMailItem")
With SafeItem
.Item = OutMail
.To = Inp.Cells(Zeile, Empf + 1).Value
.CC = Inp.Cells(Zeile, Empf + 2).Value
.BCC = ""
.Subject = Inp.Cells(1, 12).Value
.HTMLBody = Text
.Importance = olImportanceHigh
.send
End With
End Sub


'Code ist natürlich nicht komplett und exemplarisch!
viele Grüße
KH

AW: Nachtrag:
02.05.2008 14:06:23
mumpel
Falsch. Funktioniert nicht. Redemption ist keine Standardfunktion von MS-Office. Um diese Funktion nutzen zu können, benötigst Du ein teures externes Zusatztool.
Anmerkungen zu Redemtion-Tool:
1. Aus Sichereheitsgründen kann ich von der Verwendung derartiger Tools nur abraten.
2. Aus den selben Gründen dürften auf den wenigsten Firmennetzwerken dieses Tool installiert sein.
3. Ein derartiges Tool bietet einen neuen Angriffspunkt. Den Hackern dürfte dieses Tool bereits bekannt sein. Das bietet den Hackern die Möglichkeit, gezielt nach diesem Tool zu suchen und selbiges auszunutzen. Auch wenn es nervt, diese Sicherheitsmeldung hat ihre Daseinsberechtigung.

AW: Nachtrag:
05.05.2008 13:46:00
volti
Hallo Rene,
leider hat sich meine Annahme bzgl. des Inlinebildes wie befürchtet bestätigt. Bei der einfachen Referenzangabe &ltimg src="C:\hugo.gif"&gt wird das Bild zur Laufzeit vom Dateiursprung geholt und angezeigt; egal ob Server oder Festplatte und nicht in die Mail eingefügt.
Du hast bei Deinem Test Dir die Mail wahrscheinlich selbst zugesendet. Wenn ich mir selber die Mail zusende, enthält meine Mail natürlich auch das Bild, denn der Ursprung ist auf meinem Rechner unverändert. Sende ich sie meinem Kollegen, wird das Bild nicht angezeigt, denn der hat das Bild nirgendwo auf dem Rechner.
Füge ich mal händisch ein Bild ein, sende es mir zu und schau mir den Quelltext an, erscheint u.a. dieses hier:
&ltimg src="cid:935003111@05052008-31B3"&gt Also eine content-id, die auf das eingebettete Image verweist.
Leider habe ich aus dem anderen Forum gar keine Antwort erhalten. Mein letzter Versuch ist eine Übersetzung aus dem php-code. Habe aber wenig Hoffnung, dass das funktioniert.
viele Grüße
Karl-Heinz

AW: Nachtrag:
05.05.2008 14:12:00
mumpel
Bei mir funktioniert es. Ich habe zuerst die Mail versendet, dann das Bild von der Festplatte gelöscht und dann erst die Mail abgerufen. Das Bild war trotzdem da.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige