suchen
HeimBackend-EntwicklungPython-TutorialWird Ihre Marketing-E-Mail im Spam landen? Wir haben ein Tool entwickelt, um das herauszufinden

Bei der Durchführung von E-Mail-Marketingkampagnen besteht eine der größten Herausforderungen darin, sicherzustellen, dass Ihre Nachrichten den Posteingang und nicht den Spam-Ordner erreichen.

In diesem Beitrag erstellen wir ein Tool, das überprüfen kann, ob Ihre E-Mail als Spam markiert wird und warum sie so markiert ist.
Dieses Tool liegt im API-Format vor und wird online bereitgestellt, sodass es in Ihren Workflow integriert werden kann.

Das Geheimnis hinter der Spam-Validierung

Apache SpamAssassin ist eine Open-Source-Spam-Erkennungsplattform, die von der Apache Software Foundation verwaltet wird und ein weit verbreitetes Tool für viele E-Mail-Clients und E-Mail-Filtertools ist, um Nachrichten als Spam zu klassifizieren.

Es verwendet eine Vielzahl von Regeln, Bayes'sche Filterung und Netzwerktests, um einer bestimmten E-Mail einen Spam-„Score“ zuzuweisen. Im Allgemeinen besteht bei einer E-Mail mit einem Wert von 5 oder höher ein hohes Risiko, als Spam gekennzeichnet zu werden.

Da es sich bei Apache SpamAssassin um eine Spam-Erkennungssoftware handelt, kann es auch verwendet werden, um festzustellen, ob Ihre E-Mail als Spam gekennzeichnet würde.

Die Bewertung von SpamAssassin ist transparent und gut dokumentiert. Sie können damit sicher genau identifizieren, welche Aspekte Ihrer E-Mail hohe Spam-Bewertungen verursachen, und Ihr Schreiben verbessern.

So validieren Sie Ihre E-Mail mit SpamAssassin

SpamAssassin ist für die Ausführung auf Linux-Systemen konzipiert. Sie benötigen ein Linux-Betriebssystem oder erstellen einen Docker-Container, um es zu installieren und auszuführen.

Auf Debian- oder Ubuntu-Systemen installieren Sie SpamAssassin mit:

apt-get update && apt-get install -y spamassassin
sa-update

Der Befehl sa-update stellt sicher, dass die Regeln von SpamAssassin auf dem neuesten Stand sind.

Nach der Installation können Sie eine E-Mail-Nachricht an das Befehlszeilentool von SpamAssassin weiterleiten. Die Ausgabe enthält eine kommentierte Version der E-Mail mit Spam-Scores und erklärt, welche Regeln ausgelöst werden.

Eine typische Verwendung könnte so aussehen:

spamassassin -t  results.txt

results.txt enthält dann die verarbeitete E-Mail mit den Headern und Bewertungen von SpamAssassin, wie unten:

X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-13) on 254.254.254.254
X-Spam-Level: 
X-Spam-Status: No, score=0.2 required=5.0 tests=HTML_MESSAGE,
    MIME_HTML_ONLY,MISSING_MID,NO_RECEIVED,
    NO_RELAYS autolearn=no autolearn_force=no version=4.0.0

// ...

Content analysis details:   (0.2 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
 0.1 MISSING_MID            Missing Message-Id: header
-0.0 NO_RECEIVED            Informational: message has no Received headers
-0.0 NO_RELAYS              Informational: message was not relayed via SMTP
 0.0 HTML_MESSAGE           BODY: HTML included in message
 0.1 MIME_HTML_ONLY         BODY: Message only has text/html MIME parts

Wickeln Sie SpamAssassin als API ein

SpamAssassin erreicht sein maximales Potenzial nur, wenn es als API gekapselt ist, da diese Form es flexibler macht und die Integration in verschiedene Arbeitsabläufe ermöglicht.

Stellen Sie sich Folgendes vor: Bevor Sie in Ihrer E-Mail auf „Senden“ klicken, wird der Inhalt zunächst an die SpamAssassin-API gesendet. Nur wenn festgestellt wird, dass die E-Mail nicht den Spam-Kriterien entspricht, kann der Vorgang fortgesetzt werden.

Lassen Sie uns eine einfache API erstellen, die diese E-Mail-Felder akzeptiert: Betreff, html_body und text_body. Die Felder werden an SpamAssassin übergeben und das Validierungsergebnis zurückgegeben.

API-Beispiel

from fastapi import FastAPI
from datetime import datetime, timezone
from email.utils import format_datetime
from pydantic import BaseModel
import subprocess

def extract_analysis_details(text):
    lines = text.splitlines()

    start_index = None
    for i, line in enumerate(lines):
        if line.strip().startswith("pts rule"):
            start_index = i
            break

    if start_index is None:
        print("No content analysis details found.")
        return []

    data_lines = lines[start_index+2:]
    parsed_lines = []
    for line in data_lines:
        if line.strip() == "":
            break
        parsed_lines.append(line)

    results = []
    current_entry = None

    split_line = lines[start_index+1]
    pts_split, rule_split, *rest = split_line.strip().split(" ")

    pts_start = 0
    pts_end = pts_start + len(pts_split)

    rule_start = pts_end + 1
    rule_end = rule_start + len(rule_split)

    desc_start = rule_end + 1

    for line in parsed_lines:
        pts_str = line[pts_start:pts_end].strip()
        rule_name_str = line[rule_start:rule_end].strip()
        description_str = line[desc_start:].strip()

        if pts_str == "" and rule_name_str == "" and description_str:
            if current_entry:
                current_entry["description"] += " " + description_str
        else:
            current_entry = {
                "pts": pts_str,
                "rule_name": rule_name_str,
                "description": description_str
            }
            results.append(current_entry)

    return results

app = FastAPI()

class Email(BaseModel):
    subject: str
    html_body: str
    text_body: str

@app.post("/spam_check")
def spam_check(email: Email):
    # assemble the full email
    message = f"""From: example@example.com
To: recipient@example.com
Subject: {email.subject}
Date: {format_datetime(datetime.now(timezone.utc))}
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="__SPAM_ASSASSIN_BOUNDARY__"

--__SPAM_ASSASSIN_BOUNDARY__
Content-Type: text/plain; charset="utf-8"

{email.text_body}

--__SPAM_ASSASSIN_BOUNDARY__
Content-Type: text/html; charset="utf-8"

{email.html_body}

--__SPAM_ASSASSIN_BOUNDARY__--"""

    # Run SpamAssassin and capture the output directly
    output = subprocess.run(["spamassassin", "-t"],
                            input=message.encode('utf-8'),
                            capture_output=True)

    output_str = output.stdout.decode('utf-8', errors='replace')
    details = extract_analysis_details(output_str)
    return {"result": details}

Im obigen Code haben wir eine Hilfsfunktion, extract_analysis_details, definiert, um nur die Bewertungsgründe aus dem vollständigen Ergebnisbericht zu extrahieren. Sie können diese Funktion noch weiter verbessern, indem Sie beispielsweise bestimmte Regeln aus dem Ergebnis herausfiltern.

Die Antwort enthält die Analysedetails der SpamAssassin-Ergebnisse.

Nehmen wir diese Eingabe als Beispiel:

Betreff

apt-get update && apt-get install -y spamassassin
sa-update

html_body

spamassassin -t  results.txt

text_body

X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-13) on 254.254.254.254
X-Spam-Level: 
X-Spam-Status: No, score=0.2 required=5.0 tests=HTML_MESSAGE,
    MIME_HTML_ONLY,MISSING_MID,NO_RECEIVED,
    NO_RELAYS autolearn=no autolearn_force=no version=4.0.0

// ...

Content analysis details:   (0.2 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
 0.1 MISSING_MID            Missing Message-Id: header
-0.0 NO_RECEIVED            Informational: message has no Received headers
-0.0 NO_RELAYS              Informational: message was not relayed via SMTP
 0.0 HTML_MESSAGE           BODY: HTML included in message
 0.1 MIME_HTML_ONLY         BODY: Message only has text/html MIME parts

Die Antwort wäre so:

from fastapi import FastAPI
from datetime import datetime, timezone
from email.utils import format_datetime
from pydantic import BaseModel
import subprocess

def extract_analysis_details(text):
    lines = text.splitlines()

    start_index = None
    for i, line in enumerate(lines):
        if line.strip().startswith("pts rule"):
            start_index = i
            break

    if start_index is None:
        print("No content analysis details found.")
        return []

    data_lines = lines[start_index+2:]
    parsed_lines = []
    for line in data_lines:
        if line.strip() == "":
            break
        parsed_lines.append(line)

    results = []
    current_entry = None

    split_line = lines[start_index+1]
    pts_split, rule_split, *rest = split_line.strip().split(" ")

    pts_start = 0
    pts_end = pts_start + len(pts_split)

    rule_start = pts_end + 1
    rule_end = rule_start + len(rule_split)

    desc_start = rule_end + 1

    for line in parsed_lines:
        pts_str = line[pts_start:pts_end].strip()
        rule_name_str = line[rule_start:rule_end].strip()
        description_str = line[desc_start:].strip()

        if pts_str == "" and rule_name_str == "" and description_str:
            if current_entry:
                current_entry["description"] += " " + description_str
        else:
            current_entry = {
                "pts": pts_str,
                "rule_name": rule_name_str,
                "description": description_str
            }
            results.append(current_entry)

    return results

app = FastAPI()

class Email(BaseModel):
    subject: str
    html_body: str
    text_body: str

@app.post("/spam_check")
def spam_check(email: Email):
    # assemble the full email
    message = f"""From: example@example.com
To: recipient@example.com
Subject: {email.subject}
Date: {format_datetime(datetime.now(timezone.utc))}
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="__SPAM_ASSASSIN_BOUNDARY__"

--__SPAM_ASSASSIN_BOUNDARY__
Content-Type: text/plain; charset="utf-8"

{email.text_body}

--__SPAM_ASSASSIN_BOUNDARY__
Content-Type: text/html; charset="utf-8"

{email.html_body}

--__SPAM_ASSASSIN_BOUNDARY__--"""

    # Run SpamAssassin and capture the output directly
    output = subprocess.run(["spamassassin", "-t"],
                            input=message.encode('utf-8'),
                            capture_output=True)

    output_str = output.stdout.decode('utf-8', errors='replace')
    details = extract_analysis_details(output_str)
    return {"result": details}

Sehen Sie? „Lieber Gewinner“ wird erkannt, da es häufig in Spam-E-Mails verwendet wird.

Bereitstellen der API online

Für die Ausführung von SpamAssassin ist eine Linux-Umgebung mit installierter Software erforderlich. Normalerweise benötigen Sie für die Bereitstellung möglicherweise eine EC2-Instanz oder ein DigitalOcean-Droplet, was kostspielig und mühsam sein kann, insbesondere wenn Ihr Nutzungsvolumen gering ist.

Serverlose Plattformen lassen die Installation von Systempaketen wie SpamAssassin einfach nicht zu.

Leapcell kann diesen Job perfekt bewältigen.

Mit Leapcell können Sie beliebige Systempakete wie SpamAssassin bereitstellen, während der Dienst serverlos bleibt – Sie zahlen nur für Aufrufe, was normalerweise günstiger ist.

Die Bereitstellung der API auf Leapcell ist sehr einfach. Sie müssen keine Umgebung einrichten. Stellen Sie einfach ein Python-Image bereit und füllen Sie das Feld „Build Command“ ordnungsgemäß aus.

Will Your Marketing Email End Up in Spam? We Built a Tool to Find Out

Nach der Bereitstellung verfügen Sie über eine API zur Spam-Validierung. Immer wenn die API aufgerufen wird, führt sie SpamAssassin aus, bewertet die E-Mail und gibt die Bewertung zurück.

Will Your Marketing Email End Up in Spam? We Built a Tool to Find Out

Lesen Sie auf unserem Blog

Das obige ist der detaillierte Inhalt vonWird Ihre Marketing-E-Mail im Spam landen? Wir haben ein Tool entwickelt, um das herauszufinden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Was ist Python Switch Anweisung?Was ist Python Switch Anweisung?Apr 30, 2025 pm 02:08 PM

In dem Artikel wird die in Version 3.10 eingeführte "Match" -serklärung von Python erörtert, die als Äquivalent zum Wechseln von Aussagen in anderen Sprachen dient. Es verbessert die Code-Lesbarkeit und bietet Leistungsvorteile gegenüber herkömmlichen IF-ELIF-EL

Was sind Ausnahmegruppen in Python?Was sind Ausnahmegruppen in Python?Apr 30, 2025 pm 02:07 PM

Ausnahmegruppen in Python 3.11 ermöglichen die gleichzeitige Behandlung mehrerer Ausnahmen, wodurch die Fehlermanagement in gleichzeitigen Szenarien und komplexen Vorgängen verbessert wird.

Was sind Funktionsanmerkungen in Python?Was sind Funktionsanmerkungen in Python?Apr 30, 2025 pm 02:06 PM

Funktionsanmerkungen in Python Fügen Sie Metadaten zu Funktionen für Typprüfungen, Dokumentation und IDE -Unterstützung hinzu. Sie verbessern die Lesbarkeit, die Wartung der Code und die API -Entwicklung, die Datenwissenschaft und die Erstellung der Bibliothek von entscheidender Bedeutung.

Was sind Unit -Tests in Python?Was sind Unit -Tests in Python?Apr 30, 2025 pm 02:05 PM

In dem Artikel werden Unit -Tests in Python, deren Vorteile und wie man sie effektiv schreibt, erläutert. Es zeigt Werkzeuge wie Unittest und PyTest zum Testen.

Was sind Zugriffsspezifizierer in Python?Was sind Zugriffsspezifizierer in Python?Apr 30, 2025 pm 02:03 PM

In Artikel werden Zugriffsspezifizierer in Python erörtert, die benennende Konventionen verwenden, um die Sichtbarkeit von Klassenmitgliedern und nicht die strenge Durchsetzung anzuzeigen.

Was ist __init __ () in Python und wie spielt Selbst darin eine Rolle?Was ist __init __ () in Python und wie spielt Selbst darin eine Rolle?Apr 30, 2025 pm 02:02 PM

In Artikel wird die Methode von Python \ _ \ _ init \ _ \ _ () und die Rolle von Self bei der Initialisierung von Objektattributen erörtert. Andere Klassenmethoden und die Auswirkungen der Vererbung auf \ _ \ _ init \ _ \ _ () sind ebenfalls abgedeckt.

Was ist der Unterschied zwischen @ClassMethod, @StaticMethod und Instance -Methoden in Python?Was ist der Unterschied zwischen @ClassMethod, @StaticMethod und Instance -Methoden in Python?Apr 30, 2025 pm 02:01 PM

In dem Artikel werden die Unterschiede zwischen @ClassMethod, @StaticMethod und Instance -Methoden in Python erörtert und ihre Eigenschaften, Anwendungsfälle und Vorteile beschrieben. Es wird erläutert, wie Sie den richtigen Methodentyp basierend auf der erforderlichen Funktionalität und DA auswählen

Wie können Sie Elemente an ein Python -Array anhängen?Wie können Sie Elemente an ein Python -Array anhängen?Apr 30, 2025 am 12:19 AM

Inpython, youAppendElementStoAlistusedtheAppend () Methode.1) UseAppend () ForsingleElelements: my_list.append (4) .2) usextend () oder = formulnElements: my_list.extend (andere_list) ormy_list = [4,5,6] .3) useInSert () FORSPECIFIFICISPositionen: my_list.insert (1,5) .Beaware

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Leistungsstarke integrierte PHP-Entwicklungsumgebung

MantisBT

MantisBT

Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software