이메일 마케팅이 스팸으로 끝날까? 이를 확인하기 위해 도구를 만들었습니다.
Grace Collins
Solutions Engineer · Leapcell

이메일 마케팅 캠페인을 실행할 때 가장 큰 어려움 중 하나는 메시지가 스팸 폴더가 아닌 받은 편지함에 도달하도록 하는 것입니다.
이 게시물에서는 이메일이 스팸으로 표시되는지 여부와 그 이유를 확인할 수 있는 도구를 빌드합니다. 이 도구는 API 형태로 온라인에 배포되어 워크플로에 통합될 수 있습니다.
스팸 검증의 비밀
Apache SpamAssassin은 Apache Software Foundation에서 관리하는 오픈 소스 스팸 감지 플랫폼으로, 많은 이메일 클라이언트와 이메일 필터링 도구에서 메시지를 스팸으로 분류하는 데 널리 사용되는 도구입니다.
이는 다양한 규칙, 베이지안 필터링 및 네트워크 테스트를 사용하여 주어진 이메일에 스팸 "점수"를 할당합니다. 일반적으로 5점 이상의 이메일은 스팸으로 플래그될 위험이 높습니다.
Apache SpamAssassin은 스팸 감지 소프트웨어이므로 이메일이 스팸으로 플래그되는지 여부를 알려주는 데에도 사용할 수 있습니다.
SpamAssassin의 점수 체계는 투명하고 잘 문서화되어 있으므로 이메일의 어떤 측면이 높은 스팸 점수를 유발하는지 정확하게 식별하고 글쓰기를 개선하는 데 자신 있게 사용할 수 있습니다.
SpamAssassin을 사용하여 이메일을 검증하는 방법
SpamAssassin은 Linux 시스템에서 실행되도록 설계되었습니다. 설치하고 실행하려면 Linux OS가 필요하거나 Docker 컨테이너를 만들어야 합니다.
Debian 또는 Ubuntu 시스템에서는 다음을 사용하여 SpamAssassin을 설치합니다.
apt-get update && apt-get install -y spamassassin sa-update
sa-update
명령은 SpamAssassin의 규칙이 최신인지 확인합니다.
설치가 완료되면 이메일 메시지를 SpamAssassin의 명령줄 도구로 파이프할 수 있습니다. 출력에는 스팸 점수가 있는 이메일의 주석 처리된 버전이 포함되어 있으며 어떤 규칙이 트리거되었는지 설명합니다.
일반적인 사용법은 다음과 같습니다.
spamassassin -t < input_email.txt > results.txt
results.txt
에는 다음과 같이 SpamAssassin의 헤더와 점수로 처리된 이메일이 포함됩니다.
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
SpamAssassin을 API로 래핑
SpamAssassin은 API로 캡슐화될 때만 잠재력을 최대한 발휘합니다. 이러한 형식을 통해 유연성이 향상되고 다양한 워크플로에 통합할 수 있기 때문입니다.
이것을 상상해보세요. 이메일에서 “보내기”를 누르기 전에 콘텐츠가 먼저 SpamAssassin API로 전송됩니다. 이메일이 스팸 기준을 충족하지 않는다고 판단되는 경우에만 진행할 수 있습니다.
이러한 이메일 필드를 허용하는 간단한 API를 만들어 보겠습니다. subject
, html_body
및 text_body
. 필드를 SpamAssassin에 전달하고 유효성 검사 결과를 반환합니다.
API 예제
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=\