[{"data":1,"prerenderedAt":2202},["ShallowReactive",2],{"search-de":3,"content-de-developer\u002Femail-security":4,"surround-de-\u002Fdeveloper\u002Femail-security":2193},[],{"id":5,"title":6,"body":7,"description":2186,"extension":2187,"meta":2188,"navigation":1399,"path":2189,"seo":2190,"stem":2191,"__hash__":2192},"content_de\u002F3.developer\u002F13.email-security.md","E-Mail-Sicherheit",{"type":8,"value":9,"toc":2146},"minimark",[10,27,32,35,40,52,96,103,107,155,159,162,193,197,203,280,284,300,304,307,355,360,410,414,417,421,424,563,580,584,587,605,609,612,828,835,839,859,863,881,885,895,899,945,949,1003,1007,1061,1065,1072,1076,1085,1089,1099,1103,1113,1137,1141,1148,1152,1161,1251,1265,1269,1299,1302,1309,1313,1316,1320,1356,1363,1540,1553,1557,1584,1629,1633,1653,1696,1740,1744,1747,1803,1807,1913,1917,1923,1947,1951,2142],[11,12,13,14,18,19,22,23,26],"p",{},"Sämtliche ausgehende E-Mail durchläuft vor der Zustellung eine mehrschichtige Sicherheitsprüfung. Das Paket ",[15,16,17],"code",{},"@owlat\u002Femail-scanner"," stellt die gesamte Scan-Logik als gemeinsame Bibliothek bereit, die sowohl von ",[15,20,21],{},"apps\u002Fapi"," (Convex) als auch von ",[15,24,25],{},"apps\u002Fmta"," genutzt wird.",[28,29,31],"h2",{"id":30},"inhaltsprüfung","Inhaltsprüfung",[11,33,34],{},"Analysiert Betreff und HTML-Body einer E-Mail auf bösartige oder unerwünschte Inhalte. Alle Scanner sind reines TypeScript ohne Abhängigkeiten und damit sicher für die serverlose Convex-Laufzeitumgebung.",[36,37,39],"h3",{"id":38},"spam-schlüsselwörter","Spam-Schlüsselwörter",[11,41,42,43,46,47,51],{},"Rund 40 gewichtete Muster (",[15,44,45],{},"packages\u002Femail-scanner\u002Fsrc\u002Fcontent\u002FspamKeywords.ts",") erkennen gängige Spam-Formulierungen. Jedes Schlüsselwort trägt ein internes Gewicht, erzeugt aber nur dann ein eigenes Flag, wenn dieses Gewicht ",[48,49,50],"strong",{},"3 oder höher"," ist — hohe Schwere bei einem Gewicht ab 5, sonst mittlere. Leichtere Schlüsselwörter (Gewicht 1–2) werden nie einzeln geflaggt; sie summieren sich lediglich zu einem Gesamtwert auf.",[53,54,55,68],"table",{},[56,57,58],"thead",{},[59,60,61,65],"tr",{},[62,63,64],"th",{},"Schlüsselwortgewicht",[62,66,67],{},"Einzelnes Flag",[69,70,71,80,88],"tbody",{},[59,72,73,77],{},[74,75,76],"td",{},"5+ (z. B. \"free money\", \"congratulations you won\", \"viagra\")",[74,78,79],{},"Hoch",[59,81,82,85],{},[74,83,84],{},"3–4 (z. B. \"large money claim\", \"verify your account\", \"online gambling\")",[74,86,87],{},"Mittel",[59,89,90,93],{},[74,91,92],{},"1–2 (z. B. \"act now\", \"limited time\", \"click here\", \"buy now\")",[74,94,95],{},"Nicht einzeln geflaggt",[11,97,98,99,102],{},"Wurde kein einzelnes Schlüsselwort geflaggt, erreicht aber das kombinierte Gewicht aller Treffer ",[48,100,101],{},"8 oder mehr",", wird ein einzelnes Flag mittlerer Schwere ausgegeben, das auf die Erkennung mehrerer Spam-Muster geringer Schwere hinweist.",[36,104,106],{"id":105},"erkennung-von-phishing-urls","Erkennung von Phishing-URLs",[108,109,110,114,125,146],"ul",{},[111,112,113],"li",{},"Erkennung von URL-Kürzern (bit.ly, t.co, goo.gl usw.) — mittlere Schwere",[111,115,116,117,120,121,124],{},"Abweichung zwischen Anchor- und href-Domain (der Linktext lautet ",[15,118,119],{},"paypal.com",", verlinkt wird aber auf ",[15,122,123],{},"evil.com",") — hohe Schwere",[111,126,127,128,131,132,135,136,131,139,131,142,145],{},"Typosquatting bekannter Marken (",[15,129,130],{},"paypa1.net",", ",[15,133,134],{},"g00gle.io",") und verdächtige TLDs (",[15,137,138],{},".xyz",[15,140,141],{},".top",[15,143,144],{},".club"," usw.) — hohe Schwere",[111,147,148,149,131,152,124],{},"Gefährliche URI-Schemata (",[15,150,151],{},"data:",[15,153,154],{},"javascript:",[36,156,158],{"id":157},"homoglyphen-unicode-spoofing","Homoglyphen- \u002F Unicode-Spoofing",[11,160,161],{},"Erkennt Zeichen aus gemischten Schriftsystemen, die zur Nachahmung legitimer Domains verwendet werden:",[108,163,164,183,186],{},[111,165,166,167,170,171,174,175,178,179,182],{},"Rund 50 Zuordnungen verwechselbarer Zeichen (kyrillisches ",[15,168,169],{},"а"," U+0430 vs. lateinisches ",[15,172,173],{},"a"," U+0061, griechisches ",[15,176,177],{},"ο"," U+03BF vs. lateinisches ",[15,180,181],{},"o"," usw.)",[111,184,185],{},"Erkennung gemischter Schriftsysteme in Linktexten und URL-Hostnamen",[111,187,188,189,192],{},"Schwere: ",[48,190,191],{},"hoch"," (20 Punkte) — Homoglyphen-Spoofing ist ein starker Phishing-Indikator",[36,194,196],{"id":195},"verbotene-inhalte","Verbotene Inhalte",[11,198,199,200,202],{},"Mustererkennung für Betrugsinhalte hoher Schwere (jeder Treffer hat die Schwere ",[48,201,191],{},"):",[108,204,205,218,241,255],{},[111,206,207,208,131,211,131,214,217],{},"Muster des Vorschussbetrugs (",[15,209,210],{},"nigerian prince",[15,212,213],{},"advance fee",[15,215,216],{},"419 scam",")",[111,219,220,221,224,225,224,228,231,232,224,235,224,238,217],{},"Dringende Aufforderungen zu Geldtransfers (",[15,222,223],{},"wire transfer","\u002F",[15,226,227],{},"western union",[15,229,230],{},"moneygram"," + ",[15,233,234],{},"immediately",[15,236,237],{},"urgently",[15,239,240],{},"today",[111,242,243,244,247,248,247,251,254],{},"Anfragen nach sensiblen persönlichen Daten (",[15,245,246],{},"social security","-\u002F",[15,249,250],{},"ssn",[15,252,253],{},"credit card","-Nummern)",[111,256,257,258,224,261,224,264,224,267,270,271,224,274,224,277,217],{},"Credential-Phishing (",[15,259,260],{},"confirm",[15,262,263],{},"verify",[15,265,266],{},"update",[15,268,269],{},"reset"," in Kombination mit ",[15,272,273],{},"password",[15,275,276],{},"login",[15,278,279],{},"credential",[36,281,283],{"id":282},"analyse-der-betreffzeile","Analyse der Betreffzeile",[108,285,286,289],{},[111,287,288],{},"Missbrauch von GROSSSCHREIBUNG (>50 % Großbuchstaben)",[111,290,291,292,295,296,299],{},"Übermäßige Interpunktion (3 oder mehr ",[15,293,294],{},"!","-Zeichen bzw. 3 oder mehr ",[15,297,298],{},"?","-Zeichen im Betreff)",[36,301,303],{"id":302},"bewertung","Bewertung",[11,305,306],{},"Alle Flags fließen in einen Gesamtwert ein:",[53,308,309,322],{},[56,310,311],{},[59,312,313,316,319],{},[62,314,315],{},"Schwere",[62,317,318],{},"Punkte",[62,320,321],{},"Beispiel",[69,323,324,334,344],{},[59,325,326,328,331],{},[74,327,79],{},[74,329,330],{},"20",[74,332,333],{},"Homoglyphen-Spoofing, Credential-Phishing, hoch gewichtete Spam-Schlüsselwörter",[59,335,336,338,341],{},[74,337,87],{},[74,339,340],{},"10",[74,342,343],{},"URL-Kürzer, mittelgewichtete Spam-Schlüsselwörter, Summe kombinierter schwacher Muster",[59,345,346,349,352],{},[74,347,348],{},"Niedrig",[74,350,351],{},"3",[74,353,354],{},"Übermäßige Interpunktion, Betreff in GROSSBUCHSTABEN",[11,356,357],{},[48,358,359],{},"Schwellenwerte:",[53,361,362,375],{},[56,363,364],{},[59,365,366,369,372],{},[62,367,368],{},"Punktzahl",[62,370,371],{},"Stufe",[62,373,374],{},"Aktion",[69,376,377,388,399],{},[59,378,379,382,385],{},[74,380,381],{},"0–14",[74,383,384],{},"Sauber",[74,386,387],{},"Erlaubt",[59,389,390,393,396],{},[74,391,392],{},"15–39",[74,394,395],{},"Verdächtig",[74,397,398],{},"Erlaubt, Warnung wird gespeichert",[59,400,401,404,407],{},[74,402,403],{},"40+",[74,405,406],{},"Blockiert",[74,408,409],{},"Versand abgelehnt",[28,411,413],{"id":412},"dateivalidierung","Dateivalidierung",[11,415,416],{},"Validiert Anhänge und Medien-Uploads vor Speicherung oder Versand. Reines TypeScript, keine externen Abhängigkeiten.",[36,418,420],{"id":419},"erkennung-über-magic-bytes","Erkennung über Magic Bytes",[11,422,423],{},"Ermittelt den tatsächlichen Dateityp aus dem Binärheader (erste 16 Bytes), unabhängig von der Dateiendung:",[53,425,426,436],{},[56,427,428],{},[59,429,430,433],{},[62,431,432],{},"Dateityp",[62,434,435],{},"Magic Bytes",[69,437,438,452,465,488,501,521,532,542,552],{},[59,439,440,443],{},[74,441,442],{},"PE-Executable (.exe, .dll)",[74,444,445,448,449],{},[15,446,447],{},"4D 5A"," (MZ) — ",[48,450,451],{},"gefährlich, blockiert",[59,453,454,457],{},[74,455,456],{},"ELF-Binary",[74,458,459,462,463],{},[15,460,461],{},"7F 45 4C 46"," — ",[48,464,451],{},[59,466,467,470],{},[74,468,469],{},"Mach-O-Executable (macOS)",[74,471,472,475,476,475,479,475,482,485,486],{},[15,473,474],{},"FE ED FA CE"," \u002F ",[15,477,478],{},"FE ED FA CF",[15,480,481],{},"CF FA ED FE",[15,483,484],{},"CA FE BA BE"," (32 Bit, 64 Bit, 64 Bit LE, universal) — ",[48,487,451],{},[59,489,490,493],{},[74,491,492],{},"MSI-Installer",[74,494,495,498,499],{},[15,496,497],{},"D0 CF 11 E0"," (OLE Compound) — ",[48,500,451],{},[59,502,503,506],{},[74,504,505],{},"ISO-9660-Datenträgerabbild",[74,507,508,511,512,515,516,462,519],{},[15,509,510],{},"43 44 30 30 31"," (",[15,513,514],{},"CD001",") an Offset ",[15,517,518],{},"0x8001",[48,520,451],{},[59,522,523,526],{},[74,524,525],{},"PDF",[74,527,528,531],{},[15,529,530],{},"25 50 44 46"," (%PDF)",[59,533,534,537],{},[74,535,536],{},"PNG",[74,538,539],{},[15,540,541],{},"89 50 4E 47",[59,543,544,547],{},[74,545,546],{},"JPEG",[74,548,549],{},[15,550,551],{},"FF D8 FF",[59,553,554,557],{},[74,555,556],{},"ZIP\u002FDOCX\u002FXLSX",[74,558,559,562],{},[15,560,561],{},"50 4B 03 04"," (PK)",[11,564,565,566,568,569,572,573,475,576,579],{},"Der Volume Descriptor von ISO 9660 liegt jenseits des Fensters der ersten Bytes und wird daher über eine optionale Tiefenprüfung erfasst: Aufrufer übergeben die fünf Bytes an Offset ",[15,567,518],{}," als Argument ",[15,570,571],{},"isoProbe"," an ",[15,574,575],{},"detectFileType",[15,577,578],{},"validateFile",", um umbenannte Datenträgerabbilder zu flaggen.",[36,581,583],{"id":582},"erkennung-doppelter-dateiendungen","Erkennung doppelter Dateiendungen",[11,585,586],{},"Fängt Angriffe ab, die ausführbare Endungen hinter Dokumentendungen verstecken:",[108,588,589,595,600],{},[111,590,591,594],{},[15,592,593],{},"invoice.pdf.exe"," — erkannt und blockiert",[111,596,597,594],{},[15,598,599],{},"report.docx.js",[111,601,602,594],{},[15,603,604],{},"photo.jpg.scr",[36,606,608],{"id":607},"erlaubte-dateiendungen","Erlaubte Dateiendungen",[11,610,611],{},"Zulässige Dateitypen (alles andere wird blockiert):",[53,613,614,624],{},[56,615,616],{},[59,617,618,621],{},[62,619,620],{},"Kategorie",[62,622,623],{},"Endungen",[69,625,626,660,691,710,726,745,767,786,805,818],{},[59,627,628,631],{},[74,629,630],{},"Bilder",[74,632,633,131,636,131,639,131,642,131,645,131,648,131,651,131,654,131,657],{},[15,634,635],{},".jpg",[15,637,638],{},".jpeg",[15,640,641],{},".png",[15,643,644],{},".gif",[15,646,647],{},".webp",[15,649,650],{},".ico",[15,652,653],{},".bmp",[15,655,656],{},".tiff",[15,658,659],{},".tif",[59,661,662,665],{},[74,663,664],{},"Dokumente",[74,666,667,131,670,131,673,131,676,131,679,131,682,131,685,131,688],{},[15,668,669],{},".pdf",[15,671,672],{},".doc",[15,674,675],{},".docx",[15,677,678],{},".odt",[15,680,681],{},".rtf",[15,683,684],{},".txt",[15,686,687],{},".html",[15,689,690],{},".htm",[59,692,693,696],{},[74,694,695],{},"Tabellen",[74,697,698,131,701,131,704,131,707],{},[15,699,700],{},".xls",[15,702,703],{},".xlsx",[15,705,706],{},".csv",[15,708,709],{},".ods",[59,711,712,715],{},[74,713,714],{},"Präsentationen",[74,716,717,131,720,131,723],{},[15,718,719],{},".ppt",[15,721,722],{},".pptx",[15,724,725],{},".odp",[59,727,728,731],{},[74,729,730],{},"Archive",[74,732,733,131,736,131,739,131,742],{},[15,734,735],{},".zip",[15,737,738],{},".gz",[15,740,741],{},".tar",[15,743,744],{},".tgz",[59,746,747,750],{},[74,748,749],{},"Audio\u002FVideo",[74,751,752,131,755,131,758,131,761,131,764],{},[15,753,754],{},".mp3",[15,756,757],{},".wav",[15,759,760],{},".ogg",[15,762,763],{},".mp4",[15,765,766],{},".webm",[59,768,769,772],{},[74,770,771],{},"Daten",[74,773,774,131,777,131,780,131,783],{},[15,775,776],{},".json",[15,778,779],{},".xml",[15,781,782],{},".yaml",[15,784,785],{},".yml",[59,787,788,791],{},[74,789,790],{},"Schriftarten",[74,792,793,131,796,131,799,131,802],{},[15,794,795],{},".woff",[15,797,798],{},".woff2",[15,800,801],{},".ttf",[15,803,804],{},".otf",[59,806,807,810],{},[74,808,809],{},"Kalender",[74,811,812,131,815],{},[15,813,814],{},".ics",[15,816,817],{},".ical",[59,819,820,823],{},[74,821,822],{},"vCard",[74,824,825],{},[15,826,827],{},".vcf",[11,829,830,831,834],{},"SVG ist standardmäßig bewusst ausgeschlossen, weil es skriptfähig ist und Code ausführen kann, wenn ein Empfänger den Anhang direkt öffnet; pro Aufrufstelle lässt es sich über ",[15,832,833],{},"mergePolicy"," wieder zulassen.",[36,836,838],{"id":837},"erlaubte-mime-typen","Erlaubte MIME-Typen",[11,840,841,842,131,845,131,848,131,851,854,855,858],{},"Validiert deklarierte Content-Types gegen eine explizit aufgezählte Positivliste sicherer MIME-Typen (z. B. ",[15,843,844],{},"image\u002Fjpeg",[15,846,847],{},"image\u002Fpng",[15,849,850],{},"application\u002Fpdf",[15,852,853],{},"text\u002Fplain","). Die Liste enthält keine Platzhalter — ",[15,856,857],{},"image\u002Fsvg+xml"," etwa ist ausgeschlossen.",[36,860,862],{"id":861},"integrationspunkte","Integrationspunkte",[108,864,865,873],{},[111,866,867,872],{},[48,868,869],{},[15,870,871],{},"delivery\u002Fworker.ts"," — validiert jeden Anhangs-Buffer vor dem Versand",[111,874,875,880],{},[48,876,877],{},[15,878,879],{},"mediaAssets.ts"," — validiert Uploads vor der Speicherung im Convex-Dateispeicher",[28,882,884],{"id":883},"url-reputation","URL-Reputation",[11,886,887,888,894],{},"Prüft URLs im E-Mail-Inhalt gegen die ",[173,889,893],{"href":890,"rel":891},"https:\u002F\u002Fdevelopers.google.com\u002Fsafe-browsing\u002Fv4\u002Flookup-api",[892],"nofollow","Google Safe Browsing API v4",".",[36,896,898],{"id":897},"funktionsweise","Funktionsweise",[900,901,902,905,908,915,918,921],"ol",{},[111,903,904],{},"Alle URLs aus dem HTML-Inhalt der E-Mail extrahieren",[111,906,907],{},"URLs normalisieren und hashen (SHA-256)",[111,909,910,911,914],{},"Cache (Tabelle ",[15,912,913],{},"urlReputationCache",") auf bekannte Verdikte prüfen",[111,916,917],{},"Nicht gecachte URLs im Batch gegen die Safe Browsing API prüfen (bis zu 500 pro Anfrage)",[111,919,920],{},"Ergebnisse cachen (24 h für sauber, 1 h für geflaggt)",[111,922,923,924,927,928,931,932,131,934,937,938,941,942,217],{},"Geflaggte URLs in ",[15,925,926],{},"ContentFlag","-Einträge umwandeln — ",[15,929,930],{},"malicious","-Verdikte werden auf die Schwere ",[48,933,191],{},[15,935,936],{},"suspicious","-Verdikte auf ",[48,939,940],{},"mittel"," abgebildet (",[15,943,944],{},"urlReputationToFlags",[36,946,948],{"id":947},"bedrohungstypen","Bedrohungstypen",[53,950,951,961],{},[56,952,953],{},[59,954,955,958],{},[62,956,957],{},"Bedrohung",[62,959,960],{},"Beschreibung",[69,962,963,973,983,993],{},[59,964,965,970],{},[74,966,967],{},[15,968,969],{},"MALWARE",[74,971,972],{},"Seiten, die Schadsoftware hosten",[59,974,975,980],{},[74,976,977],{},[15,978,979],{},"SOCIAL_ENGINEERING",[74,981,982],{},"Phishing- und Täuschungsseiten",[59,984,985,990],{},[74,986,987],{},[15,988,989],{},"UNWANTED_SOFTWARE",[74,991,992],{},"Seiten, die unerwünschte Software verbreiten",[59,994,995,1000],{},[74,996,997],{},[15,998,999],{},"POTENTIALLY_HARMFUL_APPLICATION",[74,1001,1002],{},"Bedrohungen durch mobile Apps",[36,1004,1006],{"id":1005},"kampagne-vs-transaktional","Kampagne vs. transaktional",[53,1008,1009,1019],{},[56,1010,1011],{},[59,1012,1013,1016],{},[62,1014,1015],{},"E-Mail-Typ",[62,1017,1018],{},"Verhalten",[69,1020,1021,1039],{},[59,1022,1023,1026],{},[74,1024,1025],{},"Kampagnenversand",[74,1027,1028,462,1031,1034,1035,1038],{},[48,1029,1030],{},"Blockierendes Gate",[15,1032,1033],{},"checkUrlReputation"," läuft in ",[15,1036,1037],{},"campaigns\u002Fsend.ts",", und geflaggte URLs verhindern den Versand der Kampagne",[59,1040,1041,1044],{},[74,1042,1043],{},"Transaktionaler Versand",[74,1045,1046,1049,1050,1053,1054,1057,1058,1060],{},[48,1047,1048],{},"Wird nicht ausgeführt"," — der transaktionale Reducer in ",[15,1051,1052],{},"transactional\u002Flifecycle.ts"," führt nur ",[15,1055,1056],{},"scanContent"," aus und ruft ",[15,1059,1033],{}," nie auf",[36,1062,1064],{"id":1063},"konfiguration","Konfiguration",[11,1066,1067,1068,1071],{},"Erfordert die im Convex-Dashboard gesetzte Umgebungsvariable ",[15,1069,1070],{},"GOOGLE_SAFE_BROWSING_API_KEY",". Die kostenlose Stufe erlaubt 10.000 Anfragen pro Tag. Ist kein API-Schlüssel konfiguriert, wird die Prüfung der URL-Reputation stillschweigend übersprungen.",[28,1073,1075],{"id":1074},"clamav-malware-scan","ClamAV-Malware-Scan",[11,1077,1078,1079,1084],{},"Prüft die Binärdaten von Anhängen mit ",[173,1080,1083],{"href":1081,"rel":1082},"https:\u002F\u002Fwww.clamav.net\u002F",[892],"ClamAV"," auf bekannte Malware-Signaturen; ClamAV läuft als Docker-Sidecar neben dem MTA.",[36,1086,1088],{"id":1087},"architektur","Architektur",[1090,1091,1096],"pre",{"className":1092,"code":1094,"language":1095},[1093],"language-text","Convex delivery\u002Fworker.ts\n    │\n    │  POST \u002Fscan\u002Fattachment\n    │  (binary data + X-Filename header)\n    ▼\nMTA scan endpoint (src\u002Froutes\u002Fscan.ts)\n    │\n    ├─ File type validation (magic bytes, extensions)\n    │\n    └─ ClamAV scan (TCP INSTREAM protocol)\n        │\n        ▼\n    clamd (port 3310)\n","text",[15,1097,1094],{"__ignoreMap":1098},"",[36,1100,1102],{"id":1101},"instream-protokoll","INSTREAM-Protokoll",[11,1104,1105,1106,1108,1109,1112],{},"Der ClamAV-Client von ",[15,1107,17],{}," kommuniziert über TCP mit ",[15,1110,1111],{},"clamd"," und verwendet dabei das INSTREAM-Protokoll:",[900,1114,1115,1121,1124,1127],{},[111,1116,1117,1120],{},[15,1118,1119],{},"zINSTREAM\\0"," senden",[111,1122,1123],{},"Binärdaten in Chunks senden (4-Byte-Längenpräfix in Big Endian + Daten)",[111,1125,1126],{},"Terminator der Länge null senden",[111,1128,1129,1130,1133,1134],{},"Verdikt lesen: ",[15,1131,1132],{},"stream: OK\\0"," oder ",[15,1135,1136],{},"stream: \u003Cvirus_name> FOUND\\0",[36,1138,1140],{"id":1139},"fail-open-design","Fail-Open-Design",[11,1142,1143,1144,1147],{},"Ist ClamAV nicht verfügbar (Container läuft nicht, Netzwerkfehler, Timeout), liefert der Scan ",[15,1145,1146],{},"{ clean: true, skipped: true }"," und protokolliert eine Warnung. Das verhindert, dass ClamAV-Ausfälle die gesamte E-Mail-Zustellung blockieren.",[36,1149,1151],{"id":1150},"health-check","Health Check",[11,1153,1154,511,1157,1160],{},[15,1155,1156],{},"GET \u002Fscan\u002Fhealth",[15,1158,1159],{},"apps\u002Fmta\u002Fsrc\u002Froutes\u002Fscan.ts",") liefert den Status des ClamAV-Clients und die Warteschlangentiefe:",[1090,1162,1166],{"className":1163,"code":1164,"language":1165,"meta":1098,"style":1098},"language-json shiki shiki-themes github-light github-dark-dimmed","{\n  \"clamav\": {\n    \"healthy\": true,\n    \"pingOk\": true,\n    \"activeScanCount\": 0,\n    \"pendingCount\": 0\n  }\n}\n","json",[15,1167,1168,1177,1187,1203,1215,1228,1239,1245],{"__ignoreMap":1098},[1169,1170,1173],"span",{"class":1171,"line":1172},"line",1,[1169,1174,1176],{"class":1175},"sYgZi","{\n",[1169,1178,1180,1184],{"class":1171,"line":1179},2,[1169,1181,1183],{"class":1182},"snmFh","  \"clamav\"",[1169,1185,1186],{"class":1175},": {\n",[1169,1188,1190,1193,1196,1200],{"class":1171,"line":1189},3,[1169,1191,1192],{"class":1182},"    \"healthy\"",[1169,1194,1195],{"class":1175},": ",[1169,1197,1199],{"class":1198},"sviXB","true",[1169,1201,1202],{"class":1175},",\n",[1169,1204,1206,1209,1211,1213],{"class":1171,"line":1205},4,[1169,1207,1208],{"class":1182},"    \"pingOk\"",[1169,1210,1195],{"class":1175},[1169,1212,1199],{"class":1198},[1169,1214,1202],{"class":1175},[1169,1216,1218,1221,1223,1226],{"class":1171,"line":1217},5,[1169,1219,1220],{"class":1182},"    \"activeScanCount\"",[1169,1222,1195],{"class":1175},[1169,1224,1225],{"class":1198},"0",[1169,1227,1202],{"class":1175},[1169,1229,1231,1234,1236],{"class":1171,"line":1230},6,[1169,1232,1233],{"class":1182},"    \"pendingCount\"",[1169,1235,1195],{"class":1175},[1169,1237,1238],{"class":1198},"0\n",[1169,1240,1242],{"class":1171,"line":1241},7,[1169,1243,1244],{"class":1175},"  }\n",[1169,1246,1248],{"class":1171,"line":1247},8,[1169,1249,1250],{"class":1175},"}\n",[11,1252,1253,1256,1257,1260,1261,1264],{},[15,1254,1255],{},"healthy"," gibt den zuletzt bekannten Zustand des gepoolten Clients wieder, ",[15,1258,1259],{},"pingOk"," ist ein live durchgeführter ",[15,1262,1263],{},"PING","-Umlauf, und die beiden Zähler legen die laufende und die eingereihte Arbeit des Connection Pools offen.",[36,1266,1268],{"id":1267},"scan-eingehender-anhänge","Scan eingehender Anhänge",[11,1270,1271,1272,511,1275,1278,1279,1282,1283,1286,1287,1290,1291,1294,1295,1298],{},"ClamAV wirkt nicht nur ausgehend. Auch jede empfangene Postbox-Nachricht wird als Defense-in-Depth geprüft: ",[15,1273,1274],{},"scanInboundAttachments",[15,1276,1277],{},"apps\u002Fapi\u002Fconvex\u002Fmail\u002Fdelivery.ts",") extrahiert jedes nicht eingebettete Anhangs-Blatt aus dem rohen MIME und POSTet es an denselben MTA-Endpunkt ",[15,1280,1281],{},"\u002Fscan\u002Fattachment",". Ein bestätigter Infektionsbefund setzt ",[15,1284,1285],{},"virusVerdict: 'infected'"," und routet die Nachricht nach Spam\u002FQuarantäne; ein Ausfall des Scanners führt zu Fail-Open mit ",[15,1288,1289],{},"virusVerdict: 'skipped'"," (die Nachricht wird dennoch zugestellt und über ",[15,1292,1293],{},"scannerHealth.warnScanSkipped"," sichtbar gemacht). Die Zahl der Scans pro Blatt ist gedeckelt (passend zum Anhangslimit beim Verfassen), damit eine präparierte ",[15,1296,1297],{},".eml"," die Scan-Kosten nicht aufblähen kann.",[36,1300,1064],{"id":1301},"konfiguration-1",[11,1303,1304,1305,894],{},"Docker-Einrichtung und Umgebungsvariablen finden Sie unter ",[173,1306,1308],{"href":1307},"\u002Fdeveloper\u002Fmta-system#clamav-sidecar-docker","MTA-System > ClamAV-Sidecar",[28,1310,1312],{"id":1311},"erweiterbarkeit","Erweiterbarkeit",[11,1314,1315],{},"Der Scanner ist um drei austauschbare Nahtstellen herum gebaut, sodass Sie Regeln ergänzen oder Backends wechseln können, ohne das Paket zu forken.",[36,1317,1319],{"id":1318},"registry-für-inhaltsregeln","Registry für Inhaltsregeln",[11,1321,1322,1325,1326,1329,1330,511,1333,1336,1337,131,1340,131,1343,131,1346,131,1349,131,1352,1355],{},[15,1323,1324],{},"scanContent()"," ruft die einzelnen Scanner nicht mehr fest verdrahtet auf. Stattdessen verarbeitet es die E-Mail einmal vor (HTML entfernen, URLs extrahieren) zu einem ",[15,1327,1328],{},"ScanInput"," und iteriert über jede Regel, die in der Registry ",[15,1331,1332],{},"contentRules",[15,1334,1335],{},"packages\u002Femail-scanner\u002Fsrc\u002Fcontent\u002Frule.ts",") installiert ist. Die eingebauten Regeln — ",[15,1338,1339],{},"spam-keywords",[15,1341,1342],{},"phishing-urls",[15,1344,1345],{},"homoglyphs",[15,1347,1348],{},"caps-abuse",[15,1350,1351],{},"excessive-punctuation",[15,1353,1354],{},"prohibited-content"," — registrieren sich beim Laden des Moduls in dieser Reihenfolge, die zugleich die Iterationsreihenfolge der Flags ist.",[11,1357,1358,1359,1362],{},"Eine ",[15,1360,1361],{},"ContentScanRule"," ist eine reine, synchrone Funktion mit stabiler ID:",[1090,1364,1368],{"className":1365,"code":1366,"language":1367,"meta":1098,"style":1098},"language-typescript shiki shiki-themes github-light github-dark-dimmed","import { registerContentRule, type ScanInput } from '@owlat\u002Femail-scanner';\n\nregisterContentRule({\n  id: 'block-competitor-domains',\n  scan(input: ScanInput) {\n    const hit = input.urls.find((u) => u.href.includes('competitor.example'));\n    return hit\n      ? [{ type: 'suspicious_pattern', severity: 'medium', description: 'Competitor link', match: hit.href }]\n      : [];\n  },\n});\n","typescript",[15,1369,1370,1395,1401,1410,1420,1442,1485,1493,1519,1528,1534],{"__ignoreMap":1098},[1169,1371,1372,1376,1379,1382,1385,1388,1392],{"class":1171,"line":1172},[1169,1373,1375],{"class":1374},"s7YZ4","import",[1169,1377,1378],{"class":1175}," { registerContentRule, ",[1169,1380,1381],{"class":1374},"type",[1169,1383,1384],{"class":1175}," ScanInput } ",[1169,1386,1387],{"class":1374},"from",[1169,1389,1391],{"class":1390},"s-HuK"," '@owlat\u002Femail-scanner'",[1169,1393,1394],{"class":1175},";\n",[1169,1396,1397],{"class":1171,"line":1179},[1169,1398,1400],{"emptyLinePlaceholder":1399},true,"\n",[1169,1402,1403,1407],{"class":1171,"line":1189},[1169,1404,1406],{"class":1405},"sPO5f","registerContentRule",[1169,1408,1409],{"class":1175},"({\n",[1169,1411,1412,1415,1418],{"class":1171,"line":1205},[1169,1413,1414],{"class":1175},"  id: ",[1169,1416,1417],{"class":1390},"'block-competitor-domains'",[1169,1419,1202],{"class":1175},[1169,1421,1422,1425,1428,1432,1435,1439],{"class":1171,"line":1217},[1169,1423,1424],{"class":1405},"  scan",[1169,1426,1427],{"class":1175},"(",[1169,1429,1431],{"class":1430},"stnAF","input",[1169,1433,1434],{"class":1374},":",[1169,1436,1438],{"class":1437},"sOLd2"," ScanInput",[1169,1440,1441],{"class":1175},") {\n",[1169,1443,1444,1447,1450,1453,1456,1459,1462,1465,1468,1471,1474,1477,1479,1482],{"class":1171,"line":1230},[1169,1445,1446],{"class":1374},"    const",[1169,1448,1449],{"class":1198}," hit",[1169,1451,1452],{"class":1374}," =",[1169,1454,1455],{"class":1175}," input.urls.",[1169,1457,1458],{"class":1405},"find",[1169,1460,1461],{"class":1175},"((",[1169,1463,1464],{"class":1430},"u",[1169,1466,1467],{"class":1175},") ",[1169,1469,1470],{"class":1374},"=>",[1169,1472,1473],{"class":1175}," u.href.",[1169,1475,1476],{"class":1405},"includes",[1169,1478,1427],{"class":1175},[1169,1480,1481],{"class":1390},"'competitor.example'",[1169,1483,1484],{"class":1175},"));\n",[1169,1486,1487,1490],{"class":1171,"line":1241},[1169,1488,1489],{"class":1374},"    return",[1169,1491,1492],{"class":1175}," hit\n",[1169,1494,1495,1498,1501,1504,1507,1510,1513,1516],{"class":1171,"line":1247},[1169,1496,1497],{"class":1374},"      ?",[1169,1499,1500],{"class":1175}," [{ type: ",[1169,1502,1503],{"class":1390},"'suspicious_pattern'",[1169,1505,1506],{"class":1175},", severity: ",[1169,1508,1509],{"class":1390},"'medium'",[1169,1511,1512],{"class":1175},", description: ",[1169,1514,1515],{"class":1390},"'Competitor link'",[1169,1517,1518],{"class":1175},", match: hit.href }]\n",[1169,1520,1522,1525],{"class":1171,"line":1521},9,[1169,1523,1524],{"class":1374},"      :",[1169,1526,1527],{"class":1175}," [];\n",[1169,1529,1531],{"class":1171,"line":1530},10,[1169,1532,1533],{"class":1175},"  },\n",[1169,1535,1537],{"class":1171,"line":1536},11,[1169,1538,1539],{"class":1175},"});\n",[11,1541,1542,1543,1546,1547,1549,1550,1552],{},"Mit ",[15,1544,1545],{},"unregisterContentRule(id)"," entfernen Sie eine Regel (liefert ",[15,1548,1199],{},", wenn eine Regel entfernt wurde). Beide Helfer werden aus dem Paket-Einstiegspunkt exportiert. Eine Regel, die eine Exception wirft, bricht den Scan nicht ab — ",[15,1551,1056],{}," fängt sie ab, überspringt diese Regel und hängt ein Flag geringer Schwere an, das die ID der fehlerhaften Regel benennt, damit ein fehlverhaltendes Plugin nicht stillschweigend legitime Flags gesunder Regeln unterdrücken kann.",[36,1554,1556],{"id":1555},"antivirus-provider","Antivirus-Provider",[11,1558,1559,1562,1563,1566,1567,131,1570,131,1573,1576,1577,1580,1581,1434],{},[15,1560,1561],{},"packages\u002Femail-scanner\u002Fsrc\u002Fclamav\u002Fprovider.ts"," definiert eine ",[15,1564,1565],{},"AntivirusProvider","-Fassade (",[15,1568,1569],{},"scan",[15,1571,1572],{},"ping",[15,1574,1575],{},"getProviderName",") über dem bestehenden ClamAV-Client. ",[15,1578,1579],{},"getAntivirusProvider()"," liest die Umgebungsvariable ",[15,1582,1583],{},"ANTIVIRUS_PROVIDER",[53,1585,1586,1595],{},[56,1587,1588],{},[59,1589,1590,1593],{},[62,1591,1592],{},"Wert",[62,1594,1018],{},[69,1596,1597,1614],{},[59,1598,1599,1605],{},[74,1600,1601,1604],{},[15,1602,1603],{},"clamav"," (Standard)",[74,1606,1607,1610,1611,1613],{},[15,1608,1609],{},"createClamAvProvider()"," — kapselt den gepoolten ",[15,1612,1111],{},"-TCP-Client",[59,1615,1616,1621],{},[74,1617,1618],{},[15,1619,1620],{},"noop",[74,1622,1623,1626,1627],{},[15,1624,1625],{},"createNoopAntivirusProvider()"," — jeder Scan liefert ",[15,1628,1146],{},[36,1630,1632],{"id":1631},"provider-für-url-reputation","Provider für URL-Reputation",[11,1634,1635,1562,1638,1566,1641,131,1644,1646,1647,1580,1650,1434],{},[15,1636,1637],{},"packages\u002Femail-scanner\u002Fsrc\u002Furls\u002Fprovider.ts",[15,1639,1640],{},"UrlReputationProvider",[15,1642,1643],{},"check",[15,1645,1575],{},"). ",[15,1648,1649],{},"getUrlReputationProvider()",[15,1651,1652],{},"URL_REPUTATION_PROVIDER",[53,1654,1655,1663],{},[56,1656,1657],{},[59,1658,1659,1661],{},[62,1660,1592],{},[62,1662,1018],{},[69,1664,1665,1682],{},[59,1666,1667,1672],{},[74,1668,1669,1604],{},[15,1670,1671],{},"safe-browsing",[74,1673,1674,1677,1678,1681],{},[15,1675,1676],{},"createSafeBrowsingProvider()"," — Google Safe Browsing v4; ohne API-Schlüssel wird jede URL als ",[15,1679,1680],{},"safe"," zurückgegeben",[59,1683,1684,1688],{},[74,1685,1686],{},[15,1687,1620],{},[74,1689,1690,1693,1694],{},[15,1691,1692],{},"createNoopUrlReputationProvider()"," — jede URL liefert ",[15,1695,1680],{},[1697,1698,1701],"callout",{"title":1699,"type":1700},"noop-Provider sind fail-open","info",[11,1702,1703,1704,1706,1707,1709,1710,1713,1714,1716,1717,224,1719,224,1722,1724,1725,1728,1729,1732,1733,1728,1736,1739],{},"Die ",[15,1705,1620],{},"-Provider für Antivirus und URL-Reputation existieren für lokale Entwicklung und Tests, wo der Betrieb von ",[15,1708,1111],{}," oder das Vorhalten eines Safe-Browsing-Schlüssels unpraktisch ist. Sie melden immer „sauber“, wählen Sie sie daher niemals in der Produktion. Die Provider-Factories sind ",[48,1711,1712],{},"kein"," Teil der öffentlichen Exportfläche des Pakets — das Barrel (",[15,1715,17],{},") re-exportiert die Helfer für Inhaltsregeln (",[15,1718,1406],{},[15,1720,1721],{},"unregisterContentRule",[15,1723,1332],{},"), nicht jedoch die Provider-Factories, und die Subpath-Einstiegspunkte ",[15,1726,1727],{},".\u002Fclamav"," und ",[15,1730,1731],{},".\u002Furls"," re-exportieren nur die zugrunde liegenden Clients\u002FUtilities. Importieren Sie die Provider über relative Pfade aus den Modulen ",[15,1734,1735],{},"clamav\u002Fprovider.ts",[15,1737,1738],{},"urls\u002Fprovider.ts"," (so wie es die paketeigenen Tests tun).",[28,1741,1743],{"id":1742},"feedback-loops","Feedback Loops",[11,1745,1746],{},"Spam-Beschwerden aus Provider-Feedback-Loops werden auf die Ergebnisse der Inhaltsprüfung der Kampagne zurückgeführt:",[900,1748,1749,1756,1778,1797],{},[111,1750,1751,1752,1755],{},"Ein Zustell-Webhook liefert ein ",[15,1753,1754],{},"complaint","-Event für einen Kampagnenversand",[111,1757,1758,1759,1762,1763,1766,1767,1770,1771,1774,1775,217],{},"Der Complaint-Reducer in ",[15,1760,1761],{},"apps\u002Fapi\u002Fconvex\u002Fdelivery\u002FsendLifecycle\u002FfeedbackReducers.ts"," gibt einen ",[15,1764,1765],{},"content_scan_complaint","-Effekt aus, dessen Handler in ",[15,1768,1769],{},"apps\u002Fapi\u002Fconvex\u002Fdelivery\u002FsendLifecycle\u002Feffects.ts"," die ",[15,1772,1773],{},"contentScanResults","-Zeile der Kampagne nachschlägt (gematcht über ",[15,1776,1777],{},"resourceType: 'campaign'",[111,1779,1780,1781,1784,1785,1788,1789,1792,1793,1796],{},"An das ",[15,1782,1783],{},"flags","-Array dieser Zeile wird ein ",[15,1786,1787],{},"suspicious_pattern","-Flag geringer Schwere angehängt — Beschreibung ",[15,1790,1791],{},"\"Spam complaint received (feedback loop)\""," —, wobei die beschwerdeführende Adresse im Feld ",[15,1794,1795],{},"match"," des Flags festgehalten wird",[111,1798,1799,1800,1802],{},"Weil die Verknüpfung auf ",[15,1801,1777],{}," beruht, erhalten nur Inhaltsprüfungsergebnisse von Kampagnen Beschwerde-Flags; transaktionale Scans werden auf diese Weise nicht annotiert",[28,1804,1806],{"id":1805},"integrationsübersicht","Integrationsübersicht",[53,1808,1809,1825],{},[56,1810,1811],{},[59,1812,1813,1816,1819,1822],{},[62,1814,1815],{},"Scanner",[62,1817,1818],{},"Aufrufort",[62,1820,1821],{},"Blockierend?",[62,1823,1824],{},"Bei Fehlschlag",[69,1826,1827,1844,1860,1875,1892],{},[59,1828,1829,1832,1838,1841],{},[74,1830,1831],{},"Inhalt (Spam + Homoglyphen)",[74,1833,1834,131,1836],{},[15,1835,1037],{},[15,1837,1052],{},[74,1839,1840],{},"Ja",[74,1842,1843],{},"Entfällt (reines TS, läuft immer)",[59,1845,1846,1849,1855,1857],{},[74,1847,1848],{},"Dateityp-Validierung",[74,1850,1851,131,1853],{},[15,1852,871],{},[15,1854,879],{},[74,1856,1840],{},[74,1858,1859],{},"Blockieren (sicherer Standard)",[59,1861,1862,1865,1869,1872],{},[74,1863,1864],{},"URL-Reputation (Safe Browsing)",[74,1866,1867],{},[15,1868,1037],{},[74,1870,1871],{},"Kampagnen: ja, transaktional: nein",[74,1873,1874],{},"Erlauben, stillschweigend überspringen",[59,1876,1877,1880,1887,1889],{},[74,1878,1879],{},"ClamAV-Malware-Scan (ausgehend)",[74,1881,1882,1884,1885],{},[15,1883,871],{}," über MTA ",[15,1886,1281],{},[74,1888,1840],{},[74,1890,1891],{},"Erlauben, Warnung protokollieren (fail-open)",[59,1893,1894,1897,1907,1910],{},[74,1895,1896],{},"ClamAV-Malware-Scan (eingehend)",[74,1898,1899,511,1902,1904,1905],{},[15,1900,1901],{},"mail\u002Fdelivery.ts",[15,1903,1274],{},") über MTA ",[15,1906,1281],{},[74,1908,1909],{},"Infiziert → nach Spam geroutet",[74,1911,1912],{},"Überspringen + warnen (fail-open)",[28,1914,1916],{"id":1915},"paketstruktur","Paketstruktur",[1090,1918,1921],{"className":1919,"code":1920,"language":1095},[1093],"packages\u002Femail-scanner\u002Fsrc\u002F\n├── content\u002F              # Content analysis (pure TS, Convex-safe)\n│   ├── index.ts          # scanContent() — iterates the rule registry\n│   ├── rule.ts           # contentRules registry + ScanInput\u002FContentScanRule types\n│   ├── spamKeywords.ts   # ~40 weighted spam patterns\n│   ├── phishingUrls.ts   # URL shorteners, anchor\u002Fhref mismatch\n│   ├── homoglyphs.ts     # Unicode spoofing detection\n│   ├── prohibitedContent.ts  # Advance fee fraud, credential phishing\n│   └── subjectAnalysis.ts    # ALL CAPS, excessive punctuation\n├── files\u002F                # File type validation (pure TS)\n│   ├── index.ts          # validateFile() orchestrator\n│   ├── magicBytes.ts     # Binary header detection\n│   ├── doubleExtension.ts    # invoice.pdf.exe detection\n│   └── filePolicy.ts     # Allowlist\u002Fblocklist engine\n├── urls\u002F                 # URL reputation (uses fetch)\n│   ├── index.ts          # checkUrlReputation() orchestrator\n│   ├── provider.ts       # UrlReputationProvider abstraction (URL_REPUTATION_PROVIDER)\n│   ├── safeBrowsing.ts   # Google Safe Browsing API v4 client\n│   └── cache.ts          # Abstract cache interface\n├── clamav\u002F               # ClamAV TCP client (Node.js net, MTA only)\n│   ├── index.ts          # createClamClient() factory\n│   ├── provider.ts       # AntivirusProvider abstraction (ANTIVIRUS_PROVIDER)\n│   ├── client.ts         # clamd INSTREAM protocol implementation\n│   └── pool.ts           # Connection pooling\n├── types.ts              # Shared types (ContentFlag, ScanResult, etc.)\n└── index.ts              # Barrel export (excludes clamav\u002F)\n",[15,1922,1920],{"__ignoreMap":1098},[1697,1924,1926],{"title":1925,"type":1700},"ClamAV läuft nur unter Node.js",[11,1927,1928,1929,1932,1933,1936,1937,131,1940,1728,1943,1946],{},"Das Modul ",[15,1930,1931],{},"clamav\u002F"," nutzt Node.js ",[15,1934,1935],{},"net"," für TCP-Verbindungen und ist nur aus dem MTA heraus importierbar. Die Module ",[15,1938,1939],{},"content\u002F",[15,1941,1942],{},"files\u002F",[15,1944,1945],{},"urls\u002F"," sind reines TS und funktionieren sowohl in Convex- als auch in Node.js-Umgebungen.",[28,1948,1950],{"id":1949},"wichtige-dateien","Wichtige Dateien",[53,1952,1953,1963],{},[56,1954,1955],{},[59,1956,1957,1960],{},[62,1958,1959],{},"Datei",[62,1961,1962],{},"Zweck",[69,1964,1965,1977,1990,2003,2016,2033,2049,2059,2070,2080,2094,2106,2118,2132],{},[59,1966,1967,1972],{},[74,1968,1969],{},[15,1970,1971],{},"packages\u002Femail-scanner\u002Fsrc\u002Fcontent\u002Findex.ts",[74,1973,1974,1976],{},[15,1975,1324],{}," — Hauptorchestrator der Inhaltsprüfung",[59,1978,1979,1984],{},[74,1980,1981],{},[15,1982,1983],{},"packages\u002Femail-scanner\u002Fsrc\u002Ffiles\u002Findex.ts",[74,1985,1986,1989],{},[15,1987,1988],{},"validateFile()"," — Orchestrator der Dateivalidierung",[59,1991,1992,1997],{},[74,1993,1994],{},[15,1995,1996],{},"packages\u002Femail-scanner\u002Fsrc\u002Furls\u002Findex.ts",[74,1998,1999,2002],{},[15,2000,2001],{},"checkUrlReputation()"," — Orchestrator der URL-Reputation",[59,2004,2005,2010],{},[74,2006,2007],{},[15,2008,2009],{},"packages\u002Femail-scanner\u002Fsrc\u002Fclamav\u002Findex.ts",[74,2011,2012,2015],{},[15,2013,2014],{},"createClamClient()"," — Factory des ClamAV-Clients",[59,2017,2018,2023],{},[74,2019,2020],{},[15,2021,2022],{},"apps\u002Fapi\u002Fconvex\u002Fcampaigns\u002Fsend.ts",[74,2024,2025,2026,224,2028,2030,2031,217],{},"Inhaltsprüfung + URL-Reputation im Kampagnenversand (importiert ",[15,2027,1056],{},[15,2029,1033],{}," direkt aus ",[15,2032,17],{},[59,2034,2035,2040],{},[74,2036,2037],{},[15,2038,2039],{},"apps\u002Fapi\u002Fconvex\u002Ftransactional\u002Flifecycle.ts",[74,2041,2042,2043,2046,2047,217],{},"Inhaltsprüfung beim transaktionalen Übergang nach ",[15,2044,2045],{},"published"," (nur ",[15,2048,1056],{},[59,2050,2051,2056],{},[74,2052,2053],{},[15,2054,2055],{},"apps\u002Fapi\u002Fconvex\u002Fdelivery\u002Fworker.ts",[74,2057,2058],{},"Anhangsvalidierung + ClamAV-Scan vor dem Versand",[59,2060,2061,2065],{},[74,2062,2063],{},[15,2064,1277],{},[74,2066,2067,2068,217],{},"ClamAV-Scan eingehender (Postbox-)Anhänge bei empfangener Mail (",[15,2069,1274],{},[59,2071,2072,2077],{},[74,2073,2074],{},[15,2075,2076],{},"apps\u002Fapi\u002Fconvex\u002FmediaAssets.ts",[74,2078,2079],{},"Dateivalidierung beim Upload (Endung + MIME-Typ)",[59,2081,2082,2087],{},[74,2083,2084],{},[15,2085,2086],{},"apps\u002Fapi\u002Fconvex\u002Fschema\u002Fdelivery.ts",[74,2088,2089,2090,231,2092],{},"Tabellendefinitionen für ",[15,2091,913],{},[15,2093,1773],{},[59,2095,2096,2100],{},[74,2097,2098],{},[15,2099,1761],{},[74,2101,2102,2103,2105],{},"Beschwerde-Feedback-Loop (gibt den ",[15,2104,1765],{},"-Effekt aus)",[59,2107,2108,2112],{},[74,2109,2110],{},[15,2111,1769],{},[74,2113,2114,2115,2117],{},"Beschwerde-Feedback-Loop (Handler des ",[15,2116,1765],{},"-Effekts)",[59,2119,2120,2124],{},[74,2121,2122],{},[15,2123,1159],{},[74,2125,2126,2127,1728,2129],{},"MTA-Endpunkte ",[15,2128,1281],{},[15,2130,2131],{},"\u002Fscan\u002Fhealth",[59,2133,2134,2139],{},[74,2135,2136],{},[15,2137,2138],{},"apps\u002Fmta\u002Fdocker-compose.yml",[74,2140,2141],{},"Konfiguration des ClamAV-Sidecars",[2143,2144,2145],"style",{},"html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .snmFh, html code.shiki .snmFh{--shiki-default:#005CC5;--shiki-dark:#8DDB8C}html pre.shiki code .sviXB, html code.shiki .sviXB{--shiki-default:#005CC5;--shiki-dark:#6CB6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7YZ4, html code.shiki .s7YZ4{--shiki-default:#D73A49;--shiki-dark:#F47067}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}html pre.shiki code .sPO5f, html code.shiki .sPO5f{--shiki-default:#6F42C1;--shiki-dark:#DCBDFB}html pre.shiki code .stnAF, html code.shiki .stnAF{--shiki-default:#E36209;--shiki-dark:#F69D50}html pre.shiki code .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--shiki-dark:#F69D50}",{"title":1098,"searchDepth":1179,"depth":1179,"links":2147},[2148,2156,2163,2169,2177,2182,2183,2184,2185],{"id":30,"depth":1179,"text":31,"children":2149},[2150,2151,2152,2153,2154,2155],{"id":38,"depth":1189,"text":39},{"id":105,"depth":1189,"text":106},{"id":157,"depth":1189,"text":158},{"id":195,"depth":1189,"text":196},{"id":282,"depth":1189,"text":283},{"id":302,"depth":1189,"text":303},{"id":412,"depth":1179,"text":413,"children":2157},[2158,2159,2160,2161,2162],{"id":419,"depth":1189,"text":420},{"id":582,"depth":1189,"text":583},{"id":607,"depth":1189,"text":608},{"id":837,"depth":1189,"text":838},{"id":861,"depth":1189,"text":862},{"id":883,"depth":1179,"text":884,"children":2164},[2165,2166,2167,2168],{"id":897,"depth":1189,"text":898},{"id":947,"depth":1189,"text":948},{"id":1005,"depth":1189,"text":1006},{"id":1063,"depth":1189,"text":1064},{"id":1074,"depth":1179,"text":1075,"children":2170},[2171,2172,2173,2174,2175,2176],{"id":1087,"depth":1189,"text":1088},{"id":1101,"depth":1189,"text":1102},{"id":1139,"depth":1189,"text":1140},{"id":1150,"depth":1189,"text":1151},{"id":1267,"depth":1189,"text":1268},{"id":1301,"depth":1189,"text":1064},{"id":1311,"depth":1179,"text":1312,"children":2178},[2179,2180,2181],{"id":1318,"depth":1189,"text":1319},{"id":1555,"depth":1189,"text":1556},{"id":1631,"depth":1189,"text":1632},{"id":1742,"depth":1179,"text":1743},{"id":1805,"depth":1179,"text":1806},{"id":1915,"depth":1179,"text":1916},{"id":1949,"depth":1179,"text":1950},"Inhaltsprüfung, Anhangsvalidierung, Prüfung der URL-Reputation und Malware-Erkennung für ausgehende E-Mails.","md",{},"\u002Fdeveloper\u002Femail-security",{"title":6,"description":2186},"3.developer\u002F13.email-security","06zSCAPaVdoWhpflTm3liGGmjLRzJtg_Pexu7niDjdc",[2194,2198],{"title":2195,"path":2196,"stem":2197,"children":-1},"Wie E-Mail funktioniert","\u002Fdeveloper\u002Fhow-email-works","3.developer\u002F12.how-email-works",{"title":2199,"path":2200,"stem":2201,"children":-1},"Postbox-Architektur","\u002Fdeveloper\u002Fpostbox-architecture","3.developer\u002F14.postbox-architecture",1786915108360]