thomas1972
Goto Top

Access Mail per cdo als .htmlbody kommt teilweise bei Empfänger falsch an (HTML quelltexte)

Hallo,

ich versende aus Access Serienmails über unseren Exchange direkt per CDO ( direkt an den SMTP)
Hierbei lade ich den Richtext in eine Variable,

Sende ich Testmails am mein Postfach so stellt Outlook diese richtig dar.
Werden aber Serienmails versendet, welche ebenfalls per .To versendet werden kommt es vor, das anstatt des Textinhalts nur der HTML Text vorgeblendet wird.

Versendet habe ich sonst mit
    With objMessage
     .Subject = EMailbetreff
     .Sender = Sender   ' Absender  
     .From = SenderName ' Absendername  
     .To = rs.Fields("E-Mail")  
     .HTMLBody = Mailtext

Text aus E-Mail

<div><font face="Arial" size="2" color="black">Sehr geehrte Damen und Herren,</font></div>

<div><font face="Arial" size="2" color="black">&nbsp;</font></div>

<div><font face="Arial" size="2" color="black">bla bla bla </font></div>

<div><font face="Arial" size="3" color="black">&nbsp;</font></div>

<div><font face="Arial" size="2" color="black"><strong>xxxxxxxxx</strong></font></div>

<div><font face="Arial" size="3" color="black">&nbsp;</font></div>


Im CDO habe ich nun einen Header voran gestellt

    With objMessage
     .Subject = EMailbetreff
     .Sender = Sender   ' Absender  
     .From = SenderName ' Absendername  
     .To = rs.Fields("E-Mail")  
     
      strHTML = "<html>"  
      strHTML = strHTML & "<head>"  
      strHTML = strHTML & "<meta http-equiv=" & """Content-Type""" & " content=" & """text/html; charset=utf-8""" & ">" & "</head>"  
      strHTML = strHTML & Mailtext
      
     
      .HTMLBody = strHTML

...


Kann dieses die Ursache gewesen sein, dass einfach nur ein Header gefehlt hat oder kann es sein, dass der SMTP im Hintergrund einfach ins Strauchen kommt? (ggf eine Pause nach x Mails einbinden)
Welche Vorraussetzung muss ich schaffen, dass jedes Email Programm die Email richtig darstellt, reicht hier text/html; charset=utf-8 aus?

Test an externe Emailadressen waren bisher erfolgreich (sei es per Outlook, Handy (Android) oder WebBasierten Anzeigen der Emails.
Vielleicht hat jemand bereits ein ähnliches Problem.

Content-Key: 222481

Url: https://administrator.de/contentid/222481

Printed on: April 18, 2024 at 23:04 o'clock

Member: colinardo
colinardo Nov 20, 2013 updated at 09:34:52 (UTC)
Goto Top
Hallo Thomas,
wenn du eine universelle Mail gestalten willst solltest du zusätzlich den normalen "Body" auch mit Text(ohne Formatierung) füllen denn nicht jeder ließt seine Mails in HTML sondern hat z.B. seinen Mailclient so eingestellt das er nur "Text" anzeigt. Dann greift der Mailclient auf den Plain-Text-Body der Mail zurück, und ist dieser nicht vorhanden, wird der HTML-Teil in vermutlich in Plaintext umgewandelt.
Ich selber formatiere HTML-Mails immer mit CSS-Anweisungen am Anfang(das unterstützen inzwischen die meisten Clients). Ich gebe dann z.B. dem Body eine fest eingestellte Textgröße, so das nicht formatierte Elemente mit Ihrer Schrift nicht aus dem Rahmen fallen. Das funktionierte bisher soweit einwandfrei (AppleMail ist hier eine Ausnahme, das tanzt immer mal wieder aus der Reihe, wie so oft).
Siehe auch folgenden Beitrag: Memofeld Schriften Formatieren (Einfluss auf den HTML Code nehmen) per VBA
Beispiel:
.HTMLBody = "<style type=""text/css"">td,th,body {font-family:Arial, Helvetica, sans-serif; font-size:10pt;}</style><body><div>Hallo das ist ein Test</div></body>"  
.TextBody = "Hallo das ist ein Test"  

Eventuell hilft dir das weiter...
Grüße Uwe
Member: thomas1972
thomas1972 Nov 20, 2013 updated at 09:44:54 (UTC)
Goto Top
Hallo Uwe,

danke für die Rückmeldung.
Wie bekomme ich es den hin, dass im Textfeld, welche ich per Variable einlese
keine Schriftarten/grössen mit übergeben werden,
so dass ich diese direkt mit deinem String verbinden kann?
Kann ich diese ver VBA heraus löschen?

Gruß
Thomas
Member: colinardo
colinardo Nov 20, 2013 updated at 09:47:49 (UTC)
Goto Top
Zitat von @thomas1972:
Wie bekomme ich es den hin, dass im Textfeld, welche ich per Variable einlese
keine Schriftarten/grössen mit übergeben werden,
wie sieht den der RAW-Output aus deinem Textfeld beispielsweise aus, ist dieser HTML oder RTF formatiert ?
Member: colinardo
colinardo Nov 20, 2013 updated at 09:57:26 (UTC)
Goto Top
Wenn du HTML-Tags aus dem Text ausfiltern willst kannst du dies z.B. so machen:
HTMLSTRING = "<body><div>Das ist ein Test</div></body>" & vbNewLine & "<table id=""test""><tr><td>Ich war in einer Tabelle</td></tr></table>"  
Set regex = CreateObject("vbscript.regexp")  
regex.Pattern = "<[^>]*>"  
regex.Global = True
PLAINTEXT = regex.Replace(HTMLSTRING,"")  
MsgBox PLAINTEXT
Member: thomas1972
thomas1972 Nov 20, 2013 at 10:01:32 (UTC)
Goto Top
Hallo Uwe,

Es ist ein Feld einer Tabelle welche auf einen MSSQL liegt. als NVARCHAR(255) formatiert.
Die Tabelle wird mit den vorlagen befüllt per Textfeld welche als Rich-Text formatiert ist

<div><font face=Arial size=2 color=black>Sehr geehrte Damen und Herren,</font></div>

<div><font face=Arial size=2 color=black>&nbsp;</font></div>

<div><font face=Arial size=2 color=black>Es sind Meldungen vorhanden </font></div>
ect...

Vielleicht hast du noch einen Ansatz
Member: thomas1972
thomas1972 Nov 20, 2013 updated at 10:10:02 (UTC)
Goto Top
Hallo _Use,
habe ich versucht zu Filtern

HTMLSTRING = Mailtext 'Variable  
Set regex = CreateObject("vbscript.regexp")  
regex.Pattern = "<[^>]*>"  
regex.global = True
PlainText = regex.Replace(HTMLSTRING, "")  
MsgBox PlainText

ergibt aber den Fehler

Microsoft Visual Basic for Applications
Fehler beim Kompilieren:

Funktionsaufruf auf der linken Seite der Zuweisung muß den Typ Variant oder Object zurückgeben

Gruß
Thomas
Member: colinardo
colinardo Nov 20, 2013 updated at 10:12:23 (UTC)
Goto Top
Zitat von @thomas1972:
sorry, in Access ist das Wort PlainText schon ein reserviertes Wort (blöder Zufall face-wink ), du musst ein anderen Namen für die Variable nehmen:
HTMLSTRING = Mailtext
Set regex = CreateObject("vbscript.regexp")  
regex.Pattern = "<[^>]*>"  
regex.global = True
strPlainText = regex.Replace(HTMLSTRING, "")  
MsgBox strPlainText
Member: thomas1972
thomas1972 Nov 20, 2013 updated at 10:22:53 (UTC)
Goto Top
Hallo Uwe,
vielen Dank, für die Rückmeldung.
Nun funktioniert die Konvertierung.
bis auf die Passage

Sehr geehrte Damen und Herren,

&nbsp;

bald und Test, .......

Wie kann der "Umbruch" gefiltert werden.

Grüße aus München
Thomas
Member: colinardo
colinardo Nov 20, 2013 updated at 10:30:05 (UTC)
Goto Top
Der obige Code filter nur HTML-Tags aus also die zwischen zwei "< >" stehen.
Zusätzliche Dinge kannst du mit aufnehmen wenn du den RegEx Pattern änderst:
regex.Pattern = "<[^>]*>|&nbsp;"
Member: thomas1972
thomas1972 Nov 20, 2013 updated at 10:30:23 (UTC)
Goto Top
Hallo Use,
der normale umbruch sollte erhalten bleiben

Sehr geehrte Damen und Herren,

;

Test bla

eingeplant .....

;

Hierzu ....vorverlegt.

Wollen wir testenn. 

;

sollte sein

Sehr geehrte Damen und Herren,

Test bla
eingeplant .....


Hierzu ....vorverlegt.
Wollen wir testenn. 

danke für deine Hilfe
Member: colinardo
colinardo Nov 20, 2013, updated at May 29, 2019 at 10:14:59 (UTC)
Goto Top
regex.Pattern = "<[^>]*>|&nbsp;\s*"

Regular Expressions Tutorial
Member: thomas1972
thomas1972 Nov 20, 2013 updated at 10:35:38 (UTC)
Goto Top
Hallo Uwe,

Hmm ergibt nun

Sehr geehrte Damen und Herren,

&nbsp;

Test bla

eingeplant ist...

&nbsp;

Hierzu .... vorverlegt.

Wollen wir testenn. &nbsp;

&nbsp;
Member: colinardo
colinardo Nov 20, 2013 at 10:37:47 (UTC)
Goto Top
hatte es kurz nochmal geändert, war ein kleiner Typo drin ...s.o.
Member: thomas1972
thomas1972 Nov 20, 2013 updated at 10:41:05 (UTC)
Goto Top
Hallo Use,

danke nochmal für deine schnelle Hilfe,

nun bleiben nur noch "doppelte" umbrüche drin, sonst ist es perfekt

Sehr geehrte Damen und Herren,



Test bla

eingeplant ist...



Hierzu  vorverlegt.

Wollen wir testenn
Member: colinardo
colinardo Nov 20, 2013 updated at 10:50:14 (UTC)
Goto Top
Zitat von @thomas1972:
nun bleiben nur noch "doppelte" umbrüche drin, sonst ist es perfekt
Leere Zeilen zusätzlich weg...
regex.Pattern = "<[^>]*>|&nbsp;\s*|^\s*$"
aber dann gehen auch die leeren Zeilen weg die du wahrscheinlich erhalten willst
Member: thomas1972
thomas1972 Nov 20, 2013 updated at 11:02:27 (UTC)
Goto Top
Ich hoffe nun zum letzten mal,

aber leider keine Änderung.
Ergebnis wie im letzten Beitrag 11:40

Ich hab mir den Text nochmalig angesehen
Es stehen entweder 3 Umbrüche
oder 1 Umbruch.

Besteht nicht die Möglichkeit
Prüfe ob zwischen dem Text nur 1 Umbruch vorhanden dann entferne diesen
Prüfe ob 3 Umbrüche vorhanden dann entfernen zwei davon

Gruß
Thomas
Member: colinardo
colinardo Nov 20, 2013 updated at 11:03:19 (UTC)
Goto Top
teste das mal an deinem String
HTMLSTRING = "<div><font face=""Arial"" size=""2"" color=""black"">Sehr geehrte Damen und Herren,</font></div>" & vbNewLine & vbNewLine & "<div><font face=""Arial"" size=""2"" color=""black"">&nbsp;</font></div>" & vbNewLine & vbNewLine & "<div><font face=""Arial"" size=""3"" color=""black"">Das ist ein Test</font></div>"  
Set regex = CreateObject("vbscript.regexp")  
regex.Pattern = "<[^>]*>|&nbsp;\s*|^\s*$"  
regex.Global = True
regex.MultiLine = True
strPlainText = regex.Replace(HTMLSTRING,"")  
MsgBox strPlainText
Member: thomas1972
thomas1972 Nov 20, 2013 at 11:12:08 (UTC)
Goto Top
Hallo Uwe,

vielen lieben dank für deine Hlfe,
das hat mir sehr weitergeholfen und konnte mein Problem mit der Formatierung lösen.
Nun lasse ich den ersteller der Email entscheiden, ob er formatiert versenden möchte oder nicht.

Grüße aus München.
Thomas