Hallo Experten,
unser Firmenserver ist leider so eingestellt, dass jede externe Mail mit folgendem oben über der Anrede einkopierten Textblock angezeigt wird:
ACHTUNG: Diese Mail kommt von ausserhalb des Unternehmens. Bitte öffnen Sie keine Links oder Anlagen, wenn Sie den Absender nicht kennen... usw.
Für jemanden der täglich mit Mails umgeht, ist das eher nervig, zumal auch die Mailvorschau dadurch komplett sinnlos belegt wird.
Könnte man kein Makro hinterlegen, welches diesen Block mit einem Click löscht ? Oder noch besser alle Mails im Posteingang durchgeht und diesen Textblock löscht ? Der Textblock ist wie gesagt immer genau gleich, steht immer ganz oben und ist somit identifizierbar.
Danke und Gruss
neutrino
Hallo,
irgendwer wird ja wohl den Firmenserver (oder vielleicht den Mailserver) so "eingestellt" haben.
Es ist dringend angeraten, den dafür zuständigen Admin zu befragen, sonst könnte der Schuss nach hinten losgehen...
:) :) Danke für die Ermahnung, ist sicherlich richtig.. Eigentlich bin ich aber mehr an der technischen Lösung interessiert. Kann man einen immer gleichen Textblock per Makro erkennen und löschen ?
Zitat von: neutrino am März 19, 2020, 08:56:25Kann man einen immer gleichen Textblock per Makro erkennen und löschen ?
Eingehende Emails sind meines Wissens in Outlook schreibgeschützt.
Hallo,
Vorweg, mit Outlook Macros und VBA kenne ich mich NULL aus.
Deshalb mehr eine Frage als eine Antwort.
Gibt es in OL Ereignisse? Ich denke schon.
Könnte man dann bei einem geeigneten nicht einfach den Cursor hinter den
"Stör"text setzen, oder den Scrollbalken manipulieren?
gruss ekkehard
@Phils: man kann in Outlook Mails auch im Posteingang nachbearbeiten, dazu gibt es den Menüpunkt "Nachricht bearbeiten"
@Beaker: hab nicht verstanden, wie das mit dem Scrollbalken gemeint ist ? Man kann den Textbereich ja manuell markieren und löschen (wenn zuvor "Nachricht bearbeiten" aktiviert wurde). Da fand ich es naheliegend, dass dies auch per Makro möglich sein müsste. Aber in Outlook bin ich auch nicht so fit.
@Neutrino
Ausgehend von Philips Aussage bezügl. Editierbarkeit, die du ja inzwischen
widerlegt hast, meinte ich den sichtbaren Bereich der Vorschau auf den
Anfang der tatsächlichen Nachricht zu verschieben.
Wenn das Bearbeiten per Menupunkt möglich ist, sollte das auch mit VBA
funktionieren. Da musst du dich mal durch das Objektmodell von OL kämpfen.
Unterstützen kann ich dich dabei leider nicht, da ich es nicht habe.
gruss ekkehard
Zitat von: neutrino am März 19, 2020, 15:12:33
@Phils: man kann in Outlook Mails auch im Posteingang nachbearbeiten, dazu gibt es den Menüpunkt "Nachricht bearbeiten"
Interessant. Das ist ein relativ neues Feature und ich kannte das noch nicht.
In
ThisOutlookSession:
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim mi As MailItem
Set mi = Application.GetNamespace("MAPI").GetItemFromID(EntryIDCollection)
mi.Body = Replace(mi.Body, "ACHTUNG: Diese Mail kommt von ausserhalb ...", "")
mi.Save
End SubDas ist nur mal kurz runtergeschrieben und nicht groß getestet.
Der Code sah erstmal plausibel aus, Danke. Habe versucht, diesen als Makro einzusetzen, aber das Makro ist anschließend nicht auffindbar. Ich finde in Outlook auch keine programmierbare Schaltfläche (wie in Excel, Word oder Access), der man den Code anhängen könnte.
Und eine weiteres Problemchen. Der Text "Achtung..." ist in Wahrheit eine eingesetzte Tabelle (zumindest wird bei Rechtsclick im Kontextmenü der Menüpunkt "Eigenschaften Tabelle" angezeigt). Man kann diese anklicken und dann beliebig verschieben. Wie kann man ein solches Objekt adressieren ?
Ist wohl doch zu schwierig.. :(
Zitat von: neutrino am März 20, 2020, 17:42:44
Der Code sah erstmal plausibel aus, Danke.
"
nicht groß getestet" = Der Code funktioniert in einem einfachen, konstruierten Testfall.
Zitat von: neutrino am März 20, 2020, 17:42:44Habe versucht, diesen als Makro einzusetzen, aber das Makro ist anschließend nicht auffindbar.
Das solltest du genauer erklären. Normalerweise verschwindet VBA-Code nicht einfach.
Zitat von: neutrino am März 20, 2020, 17:42:44Ich finde in Outlook auch keine programmierbare Schaltfläche (wie in Excel, Word oder Access), der man den Code anhängen könnte.
Wenn du den Code manuell auf Klick einer Schaltfläche ausführen willst, musst du wahrscheinlich einen Ribbon-Button erstellen. - Aus dem Stegreif kann ich dazu keine Tipps geben, aber googeln hilft:
Create a button for a macro (https://www.howto-outlook.com/howto/macrobutton.htm)
Dafür solltest du im Zweifelsfall einen eigenen Thread aufmachen.
Zitat von: neutrino am März 20, 2020, 17:42:44Und eine weiteres Problemchen. Der Text "Achtung..." ist in Wahrheit eine eingesetzte Tabelle...
Dann solltest du anstelle der
Body-Eigenschaft des Mailitems
HTMLBody verwenden und den HTML-Quelltext deiner Tabelle suchen und ersetzen.
Habe versucht, Deinen Code über "Makro erstellen" in Outlook einzustellen. Es geht dann ein VBA-Fenster auf mit der Vorgabe:
Sub neu()
End Sub
Wie kann ich jetzt Deinen Code hier einfügen. Habe es schon mehrfach versucht aber ohne Erfolg. Es wird mir das neue Makro anschließend nicht angezeigt, weshalb ich es auch nicht starten kann. Es ist in der VBA-Umgebung unter "Modul1" gespeichert, aber nicht aufrufbar. Wo liegt der Unterschied zwischen Sub und Private Sub ? Ist das schon die Ursache ?
Mir fehlen hier einfach Grundkenntnisse.. :-\
Zitat von: neutrino am März 21, 2020, 15:13:00
Habe versucht, Deinen Code über "Makro erstellen" in Outlook einzustellen. Es geht dann ein VBA-Fenster auf mit der Vorgabe:
Sub neu()
End Sub
Wie kann ich jetzt Deinen Code hier einfügen.
Menu: Ansicht -> Projekt Explorer.Dann unter "Microsoft Outlook Objects", Doppelklick auf "ThisOutlookSession" und dann in das VBA-Fenster den kompletten Code von mir einfügen.
Damit wird das
NewMailEx-Ereignis des Application-Objektes behandelt (Ereignisprozedur). D.h. dieser Code wird immer ausgeführt, wenn eine neue Email ankommt. Der Code ist dann aber kein Makro im engeren Sinne und kann nicht manuell aufgerufen werden.
Du kannst nach dem gleichen Schema auch ein konventionelles Makro (Public Sub in einem normalen Modul) erstellen.In einem normalen Modul wird "Public" für alle Prozeduren automatisch angenommen, wenn nicht explizit "Private" angegeben wurde. Nur öffentliche (Public) Methoden können von ausserhalb des Moduls aufgerufen werden.
Allerdings musst du in einem normalen Makro selbst per Code ermitteln, auf welche Emails die Änderungen angewendet werden sollen. Dazu hilfreich ist die
Items-Auflistung des Inbox-Ordners:
Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items
SUUPER, habe es getestet, klappt perfekt ! Hatte erst gerätselt, weil Du Menü "Ansicht" geschrieben hast, es ist aber Menü "Entwicklertools"
Es wurde sogar der Text in der vermeintlich eingefügten Tabellenform gefunden und gelöscht. Allerdings hatte ich zum Test einen Einzeiler in dieser Tabelle (das Objekt hatte ich mir 1:1 aus einer Firmenmail kopiert) ausprobiert.
Problem ist, in der Originalmeldung (Tabelle) ist ein zweizeiliger Text mit einem Zeilenumbruch enthalten. Wenn ich die 2 Zeilen kopiere und in Deinen Code einfüge, ergibt sich zunächst ein Fehler (Code wird rot), weil der Zeilenumbruch den Code unterbricht. Wenn ich die Zeile2 an Zeile1 hinten anfüge, wird der Code angenommen, der Textblock wird aber durch diese Änderung nicht mehr erkannt.
Ist das auch lösbar ?
Schonmal Danke, fand ich bis hier schon sehr interessant !
Gruß
neutrino
Habe es heute nochmal getestet. Der Zeilenumbruch zwischen den beiden zu löschenden Textzeilen ist aus zuvor genanntem Grund nach wie vor das Hindernis. Ich kann entweder die 1. oder die 2. Zeile gezielt löschen, beide aber nicht. Habe auch versucht, 2 Makros (für jede Zeile eines) nacheinander in ThisOutlookSession einzukopieren. Ergebnis ist, dass dann gar nichts gelöscht wird.
Ansonsten ist dies eine Top-Lösung für das beschriebene Topic.
Zitat von: neutrino am März 21, 2020, 20:28:47
Problem ist, in der Originalmeldung (Tabelle) ist ein zweizeiliger Text mit einem Zeilenumbruch enthalten.
Als Erstes wäre zu klären, was hier genau ein Zeilenumbruch ist.
Wenn du in einer Email eine Tabelle hast, dann handelt es sich um eine HTML-Email. Da solltest du in den HTML-Text schauen, um was es sich für einen Zeilenumbruch handelt. - Macht eh Sinn, du solltest ja idealerweise die ganze Tabelle entfernen, wenn die nur den Hinweis enthält.
Zusätzlich könnte noch ein "echter" Zeilenumbruch vorhanden sein. Den kannst du in Form der Konstante
vbCrLf (ggfls auch nur CR oder LF) mit deinem Such-Text verketten.
Zitat von: neutrino am März 22, 2020, 13:24:16Ich kann entweder die 1. oder die 2. Zeile gezielt löschen, beide aber nicht. Habe auch versucht, 2 Makros (für jede Zeile eines) nacheinander in ThisOutlookSession einzukopieren.
Auch dieser etwas grobe Lösungsansatz könnte funktionieren. Du kannst aber nicht zweimal das NewMailEx-Ereignis behandeln; das wird sich nicht kompilieren lassen. Das ist auch nicht nötig. Du brauchst nur die
Replace-Operation verdoppelt. Einmal für jede Zeile.
Hallo PhilS
habe die "Tabelle" in die hier einkopierte anonymisierte Worddatei kopiert und auch den Text minimiert. Mit HTML kenne ich mich nicht aus, aber dies ist strukturell das Original..
Zitat von: neutrino am März 22, 2020, 18:44:10
habe die "Tabelle" in die hier einkopierte anonymisierte Worddatei kopiert
Das hilft nicht weiter.
In Outlook ein Rechtsklick auf die Email und dann "View Source" im Kontextmenü. Dann den relevanten Teil hier als Textdatei anhängen.
Habe unter "Quelle anzeigen" gefunden, was Du meinst. Den Text habe ich hier im Forum etwas anonymisiert mit Zeile1 und Zeile2
<table class=MsoNormalTable border=0 cellpadding=0><tr><td style='background:white;padding:.75pt .75pt .75pt .75pt'><table class=MsoNormalTable border=0 cellpadding=0><tr><td nowrap style='background:#FCF7B6;padding:.75pt .75pt .75pt .75pt'><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman",serif;color:orange'>ACHTUNG: </span><span style='font-size:12.0pt;font-family:"Times New Roman",serif;color:black'>Zeile1 <br>Zeile2
Somit ist der Zeilenumbruch <br> gefunden. Habe den Code entsprechend in Deinen kopiert.
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim mi As MailItem
Set mi = Application.GetNamespace("MAPI").GetItemFromID(EntryIDCollection)
mi.Body = Replace(mi.Body, "ACHTUNG: Zeile1. <br>Zeile2.", "")
mi.Save
End Sub
Wurde auch ohne zu meckern in Outlook angenommen (kein roter Code). Jetzt dachte ich, das war's. Aber leider doch nicht. Der Textblock bleibt komplett drin stehen. Das kann doch jetzt nur noch eine Kleinigkeit sein.
Hallo,
Wie gesagt, habe kein OL um mir das anzuschauen, und mit HTML ist es auch nicht weit her. Aber wenn ich recht verstehe ist "MailItem.Body" doch nur ein HTML-String. Da reicht es doch nicht, nur den angezeigten Text zu entfernen. IMO muss da der gesamte HTML-String für diesen Bereich entfernt werden.
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim mi As MailItem
Dim StringToReplace As String
Set mi = Application.GetNamespace("MAPI").GetItemFromID(EntryIDCollection)
StringToReplace = "<table class=MsoNormalTable border=0 cellpadding=0><tr><td style='background:white;padding:.75pt .75pt .75pt .75pt'><table class=MsoNormalTable border=0 cellpadding=0><tr><td nowrap style='background:#FCF7B6;padding:.75pt .75pt .75pt .75pt'><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman",serif;color:orange'>ACHTUNG: </span><span style='font-size:12.0pt;font-family:"Times New Roman",serif;color:black'>Zeile1 <br>Zeile2"
mi.Body = Replace(mi.Body, StringToReplace, "")
mi.Save
End Sub
gruss ekkehard
das hatte ich auch schon versucht. Die Formatierungsdetails (Schriftart usw) scheinen hier fehl am Platz zu sein. Aber leider bin ich Laie.. :-\
Hallo,
Hänge an der String mal den Ende-Tag für die Tabelle dran (der sollte im
Original eigentlich auch vorhanden sein)
... Zeile1 <br>Zeile2 </table>
Ansonsten musst du den HTML-Text noch mal genauer analysieren.
gruss ekkehard
Zitat von: neutrino am März 22, 2020, 21:35:54
das hatte ich auch schon versucht. Die Formatierungsdetails (Schriftart usw) scheinen hier fehl am Platz zu sein. Aber leider bin ich Laie.. :-\
In gewisser Hinsicht korrekt.
Ich hatte es bereits am Rande erwähnt: Es gibt zwei Eigenschaften,
Body und
HTMLBody, die den Text von Emails abbilden. Wenn du den original HTML-Quelltext durchsuchen/ändern willst, musst du
HTMLBody verwenden.
Hi Servus,
mach doch einfach mal einen Debug.Print auf den Body der Mail.
Debug.Print Asc(mi.Body)
Dann weisst du was du genau erstzen musst.
Vermutlich wird das vbcr oder vbcrlf sein.
Aber mit den Ascii Zeichen ist das kein Ding mehr.
Wenn du 2 Replace Befehle absetzt
Müsstest du das So derart anpassen:
mi.Body = Replace(mi.Body, "Text Zeile1" , "")
mi.Save
mi.Body = Replace(mi.Body, "Text Zeile2" , "")
mi.Save
Lg Sebi
Hier vielleicht auch eine Lösung, die auf jeden Fall rennen sollte:
Dim arr As Variant, i As Long
'Liste der zu entfernenden Begriffe
arr = Array("Text Zeile1 ", "Text Zeile2")
For i = 0 To UBound(arr)
mi.Body = Replace(mi.Body, arr(i), , "", , vbTextCompare)
Next
If mi.Saved = False Then
mi.Body = Trim$(mi.Body)
mi.Save
End If
Hallo Sebi,
das mit den 2 Replacebefehlen nacheinander hat geklappt ! Super ! So ähnlich hatte PhilS es ja auch beschrieben, aber ich war nicht schlau genug es umzusetzen.
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim mi As MailItem
Set mi = Application.GetNamespace("MAPI").GetItemFromID(EntryIDCollection)
mi.Body = Replace(mi.Body, "Text Zeile1", "")
mi.Save
mi.Body = Replace(mi.Body, "Text Zeile2", "")
mi.Save
End Sub
Einziges kleines Manko ist nun noch, dass ich an der Stelle der Mailnachricht jetzt eine mehrzeilige Lücke habe.
Habe dann Deinen 2. Code probiert (ist die 1. Zeile richtig "interpretiert" ??):
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim arr As Variant, i As Long
'Liste der zu entfernenden Begriffe
arr = Array("Text Zeile1 ", "Text Zeile2")
For i = 0 To UBound(arr)
mi.Body = Replace(mi.Body, arr(i), , "", , vbTextCompare)
Next
If mi.Saved = False Then
mi.Body = Trim$(mi.Body)
mi.Save
End If
End Sub
Hier meckert Outlook beim Kompilieren: Syntaxfehler in der roten Zeile.
Anmerkung:
So wirklich traue ich mich nicht, den funktionierenden ersten Code als festes Makro in "ThisOutlookSession" zu hinterlegen (weil Firma). Lieber würde ich es als lokales Makro unter eine Makro-Schaltfläche legen, um es nur bei Bedarf in einer geöffneten Mail zu nutzen. Ein Outlook Makro bedarf aber einer etwas anderen Syntax Sub()... Wäre das jetzt noch schwer zu lösen ?
VG
neutrino
Ich glaube am einfachste wäre wenn du einfach mal eine Mail an uns senden würdest.
Oder es als .eml speicherst. Dann kann ich
Kur gerne mal den Inhalt anschauen.
Wo finde ich denn Deine Mailadresse ?
Hallo,
Also das ganze ist ein wenig tricky. Ursache hier ist im Endeffekt der Aufbau der beiden Zeilen in Form einer HTML Tabelle.
Im VBA solche Werte zu ersetzen ist nicht ganz einfach.
hier werden ' und " verwendet die müsstest du dann alle im ersetzen berücksichtigen. Deswegen wird der Replace befehl noch nicht funktionieren.
Dieses Konstrukt musst du entfernen. Und das Problem wird sein, je nach sendendem System wird die Sprache sich unterscheiden und der Fontstyle.
Replace(result, "'", "''", , , vbBinaryCompare)
<div class=WordSection1><table class=MsoNormalTable border=0 cellpadding=0><tr><td style='background:white;padding:.75pt .75pt .75pt .75pt'><table class=MsoNormalTable border=0 cellpadding=0><tr><td nowrap style='background:#FCF7B6;padding:.75pt .75pt .75pt .75pt'><p class=MsoNormal><span lang=EN-US style='font-size:12.0pt;font-family:"Times New Roman",serif;color:orange'>ACHTUNG: </span><span lang=EN-US style='font-size:12.0pt;font-family:"Times New Roman",serif;color:black'>Zeile1. <br>Zeile2. </span><span lang=EN-US><o:p></o:p></span></p></td></tr></table></td></tr></table>
Zitat von: neutrino am März 24, 2020, 13:44:43
mi.Body = Replace(mi.Body, arr(i), , "", , vbTextCompare)
[...]
Hier meckert Outlook beim Kompilieren: Syntaxfehler in der roten Zeile.
Dort sind ein paar Kommas zu viel. - Das lässt sich einfach mit einem Blick auf die Dokumentation zur Replace-Funktion (https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/replace-function) beheben.
Zitat von: neutrino am März 24, 2020, 13:44:43
So wirklich traue ich mich nicht, den funktionierenden ersten Code als festes Makro in "ThisOutlookSession" zu hinterlegen (weil Firma). Lieber würde ich es als lokales Makro unter eine Makro-Schaltfläche legen, um es nur bei Bedarf in einer geöffneten Mail zu nutzen. Ein Outlook Makro bedarf aber einer etwas anderen Syntax Sub()... Wäre das jetzt noch schwer zu lösen ?
Ein VBA-Prozedur, die direkt als "Makro" aufgerufen werden kann, muss eine Public Sub ohne Argumente in einem normalen (nicht Klassen-) Modul sein.
Das Kernproblem ist aber, wie du an die Email kommst, die du bearbeiten willst. Bei dem von mir verwendeten Ereignis wird die
EntryId der neuen Email mitgegeben. Diesen Komfort hast du bei einem normalen Makro nicht. Du müsstest dich auf die aktuell selektierte Email in einer Listendarstellung (
Explorer) oder einem
Inspector beziehen. - Das ist sicherlich möglich, aber den Code kann ich mir nicht ad-hoc aus dem Ärmel schütteln.
PS: Hat es eigentlich irgendeinen rationalen Grund, dass hier jeder meine wiederholten Hinweise auf die HTMLBody-Eigenschaft ignoriert?
Hindi hat im Downloadbereich eine Outlookschnittstelle veröffentlicht.
Die ist nur in Access97 und müsste mal umgewandelt werden.
Da sind sicherlich nette Möglichkeiten enthalten und Mails von Access in Outlook zu handeln.
Lg Sebi
Hallo zusammen,
möchte mich nochmal bei allen herzlich bedanken, habe viel gelernt. Ich nutze den Code (Lösung mit Einzelschritt pro Zeile) zum Großteil erfolgreich. Es hat sich aber auch gezeigt, dass die Meldung in verschiedenen Formen bei mir ankommt. Dies hatte Sebi in einem Kommentar schonmal angesprochen. Offenbar hängt es auch davon ab, welche Mailsoftware der Sender nutzt.
Möchte damit das Thema abschließen
Gruß und Gesundheit an alle in diesem tollen Forum ! :)
neutrino