처음부터 이메일 파서를 만드는 방법

상사가 회사의 업무를 지연시키는 "이메일 문제"를 해결해 달라고 요청했습니다. 수백 통의 자동화된 이메일에서 데이터를 매일 아침 수작업으로 입력하고 있어 직원들의 메일함이 넘쳐납니다.

총명하고 효율적인 여러분께서는 즉시 이메일 파싱 시스템을 만들 가능성을 떠올리셨을 겁니다. 멋진 생각이지만, 단순히 스크립트 몇 개와 노력을 들이는 것만으로 끝날 일은 아닙니다. 이메일 파서를 만들고 이메일 데이터 입력 프로세스를 성공적으로 자동화하기 위한 6단계를 소개합니다.

시작하기 전에: 파싱의 정의와 그 의미

컴퓨터 과학에서 파싱(parsing)이란 정해진 규칙에 따라 텍스트를 여러 부분으로 나누는 행위를 의미합니다.

이메일 파서는 컴퓨터가 이메일을 읽고, 정해진 규칙에 따라 행동하게끔 만드는 방법입니다. 이상적으로는 시스템이 이메일에서 필요한 데이터를 자동으로 추출해 사내 백오피스 애플리케이션에 전달합니다. 이메일 파싱에 대한 자세한 분석 기사도 참고해 보세요.

더 나은 제안: Parseur를 사용해 보셨나요?

직접 이메일 파서를 만드는 것은 시스템 내부에서 어떻게 돌아가는지 이해하는 데 매우 흥미로운 프로젝트가 될 수 있습니다.

하지만 시간이 많이 걸리는 작업이기도 합니다.

무료 계정 만들기
Parseur로 시간과 노력을 절약하세요. 문서 처리를 자동화하세요.

Parseur는 2015년 말부터 완전히 새로 개발되었으며, 백엔드만 만드는 데 약 6년에 걸쳐 5,000시간가량이 투입되었습니다. 프론트엔드(UI와 템플릿 편집기를 포함) 개발에도 수천 시간이 소요되었습니다. Parseur 개발팀은 20년 이상의 경력을 가진 숙련된 개발자들로 구성되어 있습니다.

아직 개발은 끝나지 않았고, '충분히 쓸 만한' 텍스트 파서를 만드는 데 얼마나 더 시간이 걸릴지 예측하기조차 어렵습니다.

빠른 결과가 필요하다면 Parseur를 시도해 보세요. Parseur는 관리형이면서도 사용하기 쉬운 이메일 파서로, 직접 솔루션을 만드는 데 드는 수많은 시간을 절약해 줍니다. Parseur의 다양한 기능 목록도 둘러보세요.

1. 이메일 받기

현재 이메일은 직원 개별, 팀, 혹은 회사 전체 메일함 등으로 수신되고 있을 것입니다.

첫 번째 단계는 이 메일함들을 모두 한곳으로 모으는 이메일 계정을 마련하는 것입니다. 아니면, 직접 이메일 서버(이른바 SMTP 서버)를 구축해야 할 수도 있습니다.

이메일 관련 지식이 있다면 다음과 같은 인기 SMTP 서버를 참고하세요:

  • Exim은 무료 오픈 소스 이메일 전송 에이전트(메일 서버)입니다. 현재 가장 인기 있는 SMTP 서버로, 2위인 Postfix를 빠른 속도로 따라잡고 있습니다.
  • Postfix 또한 무료 오픈 소스입니다. "문제없이 잘 동작한다"는 평판이 있습니다. 이 이메일 서버 점유율 기사에 따르면, Exim과 Postfix가 전체 이메일 서버의 80%를 차지합니다.
  • 마이크로소프트의 대표적인 Exchange 서버도 있습니다. EWS로도 이메일을 받을 수 있고, 더 구식인 POP3 또는 IMAP도 사용할 수 있습니다. 요즘은 마이크로소프트가 클라우드로 호스팅해 주는 유료 서비스도 제공합니다.
  • 직접 만들 수도 있습니다. 이 길은 오래 걸리고 복잡하지만 배울 점이 많습니다. 다만, 수많은 이메일 클라이언트들과의 호환성 문제가 없는 경우에 한합니다. 이 방법을 선택한다면 Python 표준 라이브러리의 smtpd를 참고해 시작할 수 있습니다.

대량 메일 발송 시 블랙리스트에 오르지 않는 것도 고도의 기술이 필요하므로 전문가에게 맡기는 것이 좋습니다.

또한 직접 이메일 서버를 운영하는 일은 저물고 있고, 오늘날은 클라우드와 SaaS가 대세입니다. 이메일 관련 번거로운 작업을 맡아주는 호스팅 메일 서비스를 쓰는 것이 더 효율적입니다. 대표 서비스는 다음과 같습니다.

  • Postmark는 전달성과 신뢰성에 매우 집중하며, 무료 플랜도 제공합니다.
  • Mandrill은 일찍 출시되어 여전히 인기가 많고, 마케팅 및 트랜잭션 이메일에 집중합니다.
  • Sendgrid 역시 마케팅 및 트랜잭션 이메일 플랫폼입니다.
  • Mailgun은 개발자 및 API 활용에 집중합니다. 무료 플랜도 있습니다.

Parseur에서 Postmark를 특히 선호합니다. API가 훌륭하고 문서도 자세합니다. 인기 있는 모든 프로그래밍 언어용 SDK도 많습니다.

2. 이메일을 적절한 데이터 형식으로 변환

이메일은 오래된 포맷(스타워즈보다 먼저 생긴…)으로, 수십 년 동안 여기저기에서 안 좋은 점도 누적되었습니다. 예를 들어, 초기에 국제(비-미국) 문자를 지원하지 않았습니다. € 등 특수문자를 다루려면 아래의 3가지 기술 문서(RFC)를 숙지해야 합니다.

  • RFC 2047: 이메일 헤더에서 국제 문자 및 제목 지원
  • RFC 5890: DNS의 국제 도메인 이름 지원
  • RFC 6532: 메일 헤더에 UTF-8(국제 문자를 위한 인코딩) 사용 허용

Postmark나 Mailgun 같은 서비스가 이런 처리를 대신해줍니다. UTF-8, MIME, cp1252로 고통받을 필요도 없습니다. (UTF-8, MIME, cp1252가 뭔지 모르신다면 정말 부럽습니다.)

예를 들어 Mailgun을 사용할 경우, 서버가 대신 이메일을 받고 복잡한 RFC 처리를 마친 뒤 JSON 문서로 변환해 보냅니다. 지정한 URL로 웹훅을 통해 HTTP POST 요청으로 전송하는 방식입니다.

참고로 SMTP 관련 RFC 전체 목록도 살펴보실 수 있습니다.

Mailgun으로 받은 간단한 이메일 예시는 다음과 같습니다.

{
  "subject": "My favorite café",
  "sender": "John Doe <[email protected]>",
  "recipient": "Mr. Parseur <[email protected]>",
  "message": "It's called Awesome Café! See directions in the attachment. Bye.",
  "attachements": [
    { "name": "directions.pdf", "content": "https://url.with.content" },
    { "name": "cappucino.jpg", "content": "https://another.content.url" }
  ]
  /*... 기타 의미 있는 여러 데이터(자세한 내용은 문서 참고) ...*/
}

정말 편리하지 않나요? 전통적인 이메일 형식과 비교해 보세요:

  MIME-Version: 1.0
  Received: by 102.29.23.176 with HTTP; Sat, 12 Aug 2016 14:13:31 -0700 (PDT)
  Date: Sat, 12 Aug 2016 14:13:31 -0700
  Delivered-To: =?ISO-8859-1?Q?Mr. Parseur <[email protected]>
  Message-ID: <CAAJL_=kPAJZ=fryb21wBOALp8-XOEL-h9j84s3SjpXYQjN3Z3A@mail.gmail.com>
  Subject: =?ISO-8859-1?Q?My=20Favorite=20Caf=E9
  From: =?ISO-8859-1?Q?John Doe <[email protected]>
  To: =?ISO-8859-1?Q?Mr. Parseur <[email protected]>
  Content-Type: multipart/mixed; boundary=mixed
  ==mixed
  Content-Type: multipart/alternative; boundary=alternative
  ==alternative
  Content-Type: text/plain; charset="utf-8"
  It's called Awesome Caf=C3=A9! See directions in the attachm= ent. Bye.
  ==alternative
  Content-Type: text/html; charset="utf-8"
  It's called <b>Awesome Caf=C3=A9</b>! See directions in the = attachment. Bye. ==alternative== ==mixed
  Content-Type: document/pdf; name="directions.pdf"
  Content-Disposition: attachment; filename="directions.pdf"
  Content-Transfer-Encoding: base64
  iVBORw [... 전체 인코딩된 첨부 파일 ...] RK5CYII=
  ==mixed
  Content-Type: image/jpg; name="capuccino.jpg"
  Content-Disposition: attachment; filename="capuccino.jpg"
  Content-Transfer-Encoding: base64
  G+aHAAAA [... 또 다른 첨부 파일 인코딩 ...] ORK5CYII=
  ==mixed==

다행히 대부분의 프로그래밍 언어에는 이메일 해석용 라이브러리가 있습니다. Python의 email, Ruby의 RubyMail 등입니다.

3. 데이터를 데이터베이스에 저장

이제 본격적으로 코딩을 통해 HTTP 요청을 처리하고, 원하는 데이터베이스에 데이터를 손쉽게 저장할 수 있습니다.

아래는 대표적으로 사용되는 프로그래밍 언어 및 프레임워크입니다(인기순):

특정 포맷에 구애받지 않는다면 코드는 단순할 수 있습니다. 다만, 회사 소프트웨어가 요구하는 형식에 맞게 데이터를 변환하는 작업이 추가될 수 있습니다. 대표 데이터 교환 포맷은 CSV, JSON 등이 있고, 일부 기업용 소프트웨어는 더 특이하고 바이너리 형식을 요구하기도 합니다.

단순히 데이터를 저장하는 것(예: 자체 개발용)이라면, 어떤 방식으로 데이터를 저장할지만 결정하면 됩니다.

향후 통계나 비순차적 작업이 전혀 필요 없다면 MongoDB 같은 NoSQL 데이터베이스도 고려할 수 있습니다. 하지만 이 블로그 포스트의 조언도 참고해 보시길 권합니다.

SQL 기반 관계형 데이터베이스라면 이메일 저장에 무리가 없습니다. 최소한 이메일 본문과 첨부 파일을 위한 2개의 테이블은 필요할 것입니다.

서버 사양과 데이터량만 맞으면 대부분의 SQL 엔진이 문제없이 구동됩니다. 대표적인 관계형 데이터베이스는 아래와 같습니다.

  • MySQL 및 그 비공식 포크인 MariaDB는 기본적이면서 널리 사용됩니다. Oracle에서 MySQL을 인수한 후 지원이 예전만 못하니 참고하세요.
  • Postgresql은 더 크고 기능이 풍부하며 확장성이 높지만 구축/설정이 더 복잡합니다.
  • 무료 오픈소스 외에도 Oracle은 방대한 기능을 가진 대형 데이터베이스입니다. 단순 이메일 저장에 이 정도 대규모 솔루션이 필요한지는 다시 생각해 보셔야 합니다.
  • 상용 솔루션으로 Microsoft SQL server도 최근 많은 발전을 이뤄 Oracle의 경쟁자로 주목받고 있습니다.

이제 이메일 내용을 애플리케이션의 데이터베이스에 저장하는 일은 완료됐습니다.

하지만 여기서 멈추지 마세요. 이제 손안에 비즈니스에 정말 중요한 데이터들이 모였습니다. 이메일에는 청구서, 출장비, 견적서, 잠재 고객, 기존 고객 정보 등등이 들어있을 가능성이 높죠.

이메일에서 핵심 데이터만 추가로 추출해내면 어떨까요? 데이터 정제가 진행되면 업무 자동화 수준도 한 단계 높아지고, 여러분과 동료들의 소중한 시간도 더 많이 절약할 수 있습니다.

4. 각 이메일에서 중요한 텍스트 추출하기

이 단계에서 진짜 파싱이 시작됩니다. 우리가 바라는 이상적인 모습은 이렇습니다.

A screen capture of email parser overview
Schematics of an email parser transforming a received email into structured data (for example, a spreadsheet, or a database)

아래 몇 가지 접근법이 있습니다.

통계적 단어 분석(Word Counting)

통계적 분석은 사람이 직접 작성해서 형식이 정해지지 않은 이메일을 분류하는 데 적합합니다. 여러 이메일 분류를 정의하고, 각 분류별 단어 셋을 만들어 둔 뒤, 각 이메일의 단어 빈도를 세어 어느 분류에 가까운지 결정할 수 있습니다.

예를 들면, '행복한 고객', '화난 고객'이라는 카테고리를 만들어 행복한 고객의 이메일만 상사에게, 화난 고객의 메일은 휴지통으로 보낼 수도 있겠죠(농담입니다).

그러나 사람 간 소통에는 언제나 실수, 모호성, 맥락 문제 등이 포함되어 있습니다. 진정한 인공지능이 나오기 전까지 이런 애매성은 시스템 신뢰도를 떨어뜨릴 수 있습니다.

정규표현식(Regular Expressions)

자동화 도구나 시스템에서 생성된 형태가 거의 변하지 않는 이메일에 적합한 방법입니다.

예를 들어, 미국 항공사로부터 수많은 예약 이메일이 오는데, 탑승자 이름만 추출하고 싶다면, 이메일 전체와 일치시키고 해당 이름만 추출하도록 정규식을 만들 수 있습니다. 쉬워 보이겠지만 이메일의 다른 부분이 변하거나, 승객이 여러 명이라면 금방 복잡해집니다.

Python에는 re 라이브러리가, Ruby에는 Regexp 모듈, JavaScript에도 정규표현식이 내장되어 있습니다.

단점은 정규표현식 코드가 읽기 힘들고 유지보수가 어렵다는 점입니다. 많은 Parseur 고객들이 저희에게 직접 Regex 기반 파서 개발을 시도했다가 변화무쌍한 이메일 형식 대응에 실패했다는 사례가 많습니다.

5. 관리형 솔루션? Parseur가 도와드릴 수 있습니다!

원하는 데이터를 엑셀 스프레드시트나 데이터베이스 정확한 열에 자동으로 정렬해서 넣어준다면 얼마나 편할까요?

이것이 바로 Parseur의 목표입니다. 사용자는 포인트 앤 클릭 인터페이스로 추출할 데이터를 한 번만 지정하면, 이후 비슷한 형식의 이메일이 들어오면 자동으로 데이터가 추출되어 엑셀에 행별로 저장됩니다.

직접 이메일 파서를 만들 필요도, 수작업 처리를 반복할 필요도 없습니다. 각 이메일이 엑셀의 한 행으로 자동 변환됩니다.

6. 비즈니스 소프트웨어와 통합

이제 추출된 데이터가 엑셀 스프레드시트에 정렬되어 있다면, 남은 일은 이 데이터를 실제 비즈니스 소프트웨어에 넣는 것입니다.

ZapierMake와 같은 툴을 활용하면 이메일 응용프로그램과 비즈니스 소프트웨어를 손쉽게 연결할 수 있습니다. 별도의 커넥터만 작성하면, 그 시스템 내의 다양한 커넥터들도 활용할 수 있습니다.

Parseur는 Google Sheets, Zapier, Integromat, Microsoft Power Automate와 기본적으로 연동되어 있어, 파싱한 데이터를 몇 번의 클릭만으로 수천 개의 애플리케이션에서 사용할 수 있습니다.

행운을 빕니다!

마지막 업데이트

AI 기반 데이터 추출 소프트웨어.
오늘 바로 Parseur를 시작하세요.

이메일, PDF, 스프레드시트에서 텍스트 추출을 자동화하세요.
수백 시간의 반복 업무를 절감할 수 있습니다.
AI로 업무 자동화를 경험해 보세요.

Parseur rated 5/5 on Capterra
Parseur.com has the highest adoption on G2
Parseur rated 5/5 on GetApp
Parseur rated 4.5/5 on Trustpilot