나는 regex로 이메일 파싱을 시도했는데, 생각한 대로 정확히 진행됐다.

발행: (2026년 3월 3일 오전 12:24 GMT+9)
5 분 소요
원문: Dev.to

Source: Dev.to

Introduction

최근에 들어오는 이메일을 자동으로 처리해야 했습니다.

아이디어는 간단해 보였습니다:

이메일 도착 → 몇 가지 필드 추출 → 웹훅 트리거

다음과 같은 경우들:

  • 주문 확인 메일
  • 청구서 이메일
  • 배송 알림
  • 고객 지원 메시지

복잡한 것이 없었습니다. 혹은 그렇게 생각했죠.

Attempt #1 — Regex

대부분의 개발자와 마찬가지로 저는 정규식부터 시작했습니다.

const price = email.match(/Total:\s\$(\d+)/)

첫 번째 이메일에서는 완벽히 동작했습니다. 그런데 다음 이메일이 와서 이렇게 적혀 있었습니다:

Amount paid: $29

또 다른 이메일은 이렇게 적혀 있었습니다:

Total price: USD 29

그 뒤에 2004년 Outlook 템플릿처럼 보이는 중첩 테이블, 인라인 스타일, 포맷팅이 포함된 HTML 이메일이 도착했습니다.

이 시점에서 제 정규식은 점점 다음과 같이 변했습니다:

/(Total|Amount|Price).*?(\$|USD)?\s?(\d+(\.\d+)?)/ 

보통 이때가 바로 접근 방식이 이미 실패하고 있다는 것을 깨닫는 순간입니다.

Attempt #2 — Parsing the HTML

좋아요, HTML을 파싱해 봅시다.

const dom = new JSDOM(emailHtml)

가끔은 동작했습니다. 하지만 이메일 HTML은 특수한 혼돈의 형태였습니다:

  • 테이블 안에 테이블이 있음
  • 모든 곳에 인라인 스타일이 존재
  • 발신자마다 레이아웃이 다름

그리고 어느 순간 각 이메일 포맷마다 맞춤 파서를 유지보수하게 되었습니다.

The real problem

이메일은 구조화된 데이터가 아닙니다. 사람을 위해 작성된 것이지 기계를 위해 만든 것이 아니죠. 발신자마다 형식이 다르고, 경직된 파싱 규칙을 강요하려 하면 금방 깨지기 쉽습니다.

The obvious solution (in hindsight)

엄격한 파싱 규칙을 강제하려 애쓰기보다 AI가 이메일을 해석하고 원하는 필드를 추출하도록 하면 어떨까요?

예시 이메일:

Subject: Order confirmation
Customer: John Smith
Product: T-shirt
Total: $39

구조화된 출력:

{
  "customer": "John Smith",
  "product": "T-shirt",
  "total": 39
}

이제 백엔드는 원시 이메일 텍스트가 아니라 깔끔한 구조화 데이터를 받게 됩니다.

So I built a small tool

이 문제에 계속 부딪히다 보니 작은 도구를 만들게 되었습니다. 이름은 ParseForce입니다.

흐름은 간단합니다:

Incoming email → AI parsing → structured JSON → webhook

당신은:

  • 고유한 인박스를 얻고
  • 이메일을 그 인박스로 보내고
  • 원하는 스키마를 정의합니다

그 결과 웹훅에서 구조화된 JSON을 받게 됩니다. 끝입니다.

Some things it works well for

지금까지 제가 사용한 사례는 다음과 같습니다:

  • 주문 확인 이메일 파싱
  • 청구서 데이터 추출
  • 리드 이메일 처리
  • 자동화 워크플로 트리거

즉, 이메일에 시스템이 이해해야 할 데이터가 포함된 모든 경우에 활용할 수 있습니다.

If you’re curious

여기서 확인해 보세요: 👉 https://parseforce.io

다른 사람들은 이 문제를 어떻게 해결하고 있는지도 궁금합니다. 정규식, 템플릿, 아니면 전혀 다른 방법을 사용하고 계신가요?

Tags: node, webdev, saas, automation, ai

0 조회
Back to Blog

관련 글

더 보기 »

JavaScript 변수와 데이터 타입 (초보자 가이드)

변수란 무엇인가? 변수를 정보를 저장하는 상자라고 생각해 보세요. - 한 상자는 당신의 이름을 저장합니다. - 또 다른 상자는 당신의 나이를 저장합니다. - 또 다른 상자는 당신이 …인지 여부를 저장합니다.