상사로부터 회사의 업무 속도를 늦추는 "이메일 문제"를 해결해 달라는 요청을 받으셨나요? 매일 아침 수백 개의 자동화된 이메일에서 데이터를 수동으로 입력하느라 직원들의 메일함이 가득 차고 있을 겁니다.
총명하고 효율적인 개발자라면 즉시 이메일 파싱 시스템을 구축할 생각을 하셨을 겁니다. 좋은 생각입니다! 하지만 이 작업은 단순히 스크립트 몇 개를 짜는 것만으로 해결되지 않습니다. 지금부터 이메일 파서를 만들고 이메일 데이터 입력 업무를 성공적으로 자동화하는 여섯 가지 단계를 소개합니다.
시작하기 전에: 파싱이란 무엇이며 왜 필요한가
컴퓨터 과학에서 파싱(parsing)이란 정해진 규칙에 따라 텍스트를 여러 부분으로 분리하는 작업을 의미합니다.
이메일 파서는 컴퓨터가 이메일을 읽고, 정해진 규칙에 따라 특정 작업을 수행하도록 만드는 방법입니다. 이상적으로 이 시스템은 이메일에서 관련 데이터를 자동으로 추출하여 사내 백오피스 애플리케이션으로 전달합니다. 더 자세한 내용은 이메일 파싱 심층 분석 기사를 참고하세요.
더 나은 제안: 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. 이메일을 적절한 데이터 형식으로 변환하기
이메일은 오래된 형식입니다. '스타워즈' 영화보다도 먼저 만들어졌고, 시간이 지나면서 여러 문제가 누적되었습니다. 예를 들어, 초기 사양에는 국제(비-ASCII) 문자 처리가 포함되지 않았습니다. €, é와 같은 특수문자를 처리하려면, 다음과 같은 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 기반 관계형 데이터베이스 시스템이라면 어떤 것이든 이메일을 잘 저장할 수 있습니다. 최소한 이메일과 첨부 파일을 위한 두 개의 테이블은 필요할 것입니다.
서버 용량과 사용량만 맞춘다면 어떤 SQL 엔진도 충분합니다. 현재 인기 있는 관계형 데이터베이스는 다음과 같습니다:
- MySQL과 비공식 추천 포크인 MariaDB는 기본적이면서도 여전히 많은 사랑을 받는 데이터베이스입니다. Oracle이 MySQL을 인수한 후 지원이 예전 같지 않다는 점은 참고하세요. (놀랍지도 않지만요.)
- Postgresql은 더 크고 기능이 많으며, MySQL보다 확장성이 좋지만 설정은 더 복잡합니다.
- 무료 오픈 소스 외에, Oracle은 대기업의 다양한 요구에 부응하는 방대한 기능을 제공합니다. 아주 크고 복잡하며 비쌉니다. 단순한 이메일 저장 시스템에 과연 그 정도의 확장성이 필요할까요?
- 상용 제품 중에는 Microsoft SQL server 역시 최근 몇 년간 많은 발전을 이루어 Oracle의 유력한 경쟁자로 떠오르고 있습니다.
여기까지 마쳤다면, 이메일 콘텐츠를 애플리케이션 데이터베이스에 저장하는 기본 파이프라인이 완성된 것입니다.
하지만 여기서 멈출 필요는 없습니다. 이제 여러분의 손에는 매우 흥미롭고 중요한 데이터셋이 있습니다. 이 데이터는 회사의 핵심 비즈니스와 직결될 가능성이 높습니다. 이메일에는 청구서, 경비 보고서, 견적서, 신규 리드 및 고객 정보가 가득할 수 있습니다.
이제 한 단계 더 나아가 이메일에서 정말 필요한 데이터만 추출해 볼까요? 정제된 데이터는 업무 프로세스를 자동화하고, 여러분과 동료들의 소중한 시간을 절약해 줄 수 있습니다.
4. 각 이메일에서 필요한 텍스트 추출하기
이제 본격적인 파싱 단계입니다. 이상적으로는 아래 그림과 같이 이메일에서 구조화된 데이터를 추출하는 작업을 자동화하고 싶을 것입니다.

이 방대한 문제를 해결하기 위한 몇 가지 접근법을 소개합니다.
통계적 단어 분석, 즉 "단어 카운팅"
통계적 분석은 정해진 양식 없이 사람이 직접 작성한 이메일을 처리하는 데 적합합니다. 여러 이메일 분류를 정의하고 각 분류별 단어 목록을 만든 다음, 이메일을 파싱하며 각 분류의 단어 수를 세어 이메일이 어떤 분류에 속하는지 결정할 수 있습니다.
예를 들어, '행복한 고객'과 '화난 고객' 카테고리를 만들어, 행복한 고객의 이메일은 상사에게 전달하고 화난 고객의 이메일은 휴지통으로 보낼 수도 있습니다. (농담입니다.)
하지만 아시다시피 사람 간의 소통에는 오류, 모호함, 맥락 의존성이 따릅니다. 진정한 의미의 인공지능이 실현되기 전까지는 이러한 모호성을 완벽하게 해결하기 어렵습니다. 따라서 이 방법은 신뢰성이 떨어지거나 아예 쓸모없을 수도 있습니다.
정규표현식(Regular Expressions)
이 방법은 대부분 동일한 형식으로 생성되는 자동화된 이메일에 가장 적합합니다.
예를 들어, 항공사에서 오는 수많은 예약 확인 이메일에서 탑승자 이름만 추출하고 싶다고 가정해 봅시다. 전체 이메일과 일치시키고 탑승자 이름만 추출하는 정규표현식 하나로 가능합니다. 간단해 보이죠? 하지만 이메일 구조의 다른 부분이 바뀌거나, 한 예약에 승객이 세 명이라면 어떻게 될까요? 문제가 복잡해질 수 있습니다.
Python에는 re 라이브러리가 있고, Ruby에는 Regexp 모듈이 있으며, JavaScript에도 정규표현식이 내장되어 있습니다.
다만, 정규표현식은 유지보수가 어렵고 가독성이 떨어진다는 단점이 있습니다. 많은 Parseur 고객들이 저희에게 처음에는 직접 정규표현식으로 이메일 파서를 만들었지만, 끊임없이 바뀌는 이메일 형식을 감당하기 어려웠다고 말합니다.
5. 관리형 솔루션? Parseur가 도와드립니다!
원하는 데이터를 엑셀 스프레드시트나 데이터베이스의 정확한 열에 자동으로 분류하여 넣을 수 있다면 얼마나 좋을까요?
이것이 바로 Parseur가 하는 일입니다. 직관적인 포인트 앤 클릭 인터페이스에서 원하는 데이터를 한 번만 선택하면, 이후 들어오는 유사한 이메일에서 자동으로 데이터가 추출되어 엑셀 시트에 정리됩니다.
따라서 이메일 파서를 처음부터 직접 만들 필요가 없습니다. 포인트 앤 클릭 방식의 간단한 설정으로 수작업을 없앨 수 있습니다. 각 이메일은 자동으로 엑셀의 한 행(row)으로 변환됩니다.
6. 비즈니스 소프트웨어와 통합하기
추출된 데이터가 엑셀 스프레드시트에 정리되었다면, 마지막 단계는 이 데이터를 필요한 곳, 즉 회사 애플리케이션으로 옮기는 것입니다.
Zapier나 Make 같은 통합 플랫폼을 사용하면 수천 개의 다른 앱과 손쉽게 연결할 수 있습니다.
Parseur는 Google Sheets, Zapier, Make(구 Integromat), Microsoft Power Automate와 기본적으로 통합되어 있어, 파싱한 데이터를 몇 번의 클릭만으로 수천 개의 앱으로 보낼 수 있습니다.
행운을 빕니다
마지막 업데이트