Python용 Flask Framework로 이메일을 수신하는 방법
게시 됨: 2020-04-30인터넷에는 이메일 전송에 대한 튜토리얼이 많이 있지만 이메일을 수신하고 처리하도록 애플리케이션을 구성하는 방법은 거의 없습니다. 모든 것을 스스로 설정하려고 하면 매우 어려울 수 있는 작업이지만 Twilio SendGrid의 Inbound Parse 기능 을 사용하면 웹 요청을 받는 것만큼 쉽습니다 .
이 짧은 자습서에서는 Python 및 Flask 웹 프레임워크를 사용하여 Twilio SendGrid에서 이메일을 웹 애플리케이션으로 직접 전달하도록 하는 방법을 배우게 됩니다.
요구 사항
이 자습서를 완료하기 위한 요구 사항은 다음과 같습니다.
- Python 3: 운영 체제에서 Python 3 인터프리터를 제공하지 않는 경우 python.org 로 이동 하여 설치 프로그램을 다운로드할 수 있습니다.
- Twilio SendGrid 계정: Twilio SendGrid를 처음 사용하는 경우 무료 계정을 만들 수 있습니다. 이 계정 을 사용하면 하루에 100개의 이메일을 영원히 보낼 수 있습니다.
- 이메일을 받을 도메인: 이 문서 전체에서 yourdomainhere.com 을 사용하겠습니다 . 자신의 도메인 이름으로 교체해야 합니다.
- ngrok : 이 편리한 유틸리티를 사용하여 컴퓨터에서 로컬로 실행되는 Flask 애플리케이션을 SendGrid가 요청을 보낼 수 있는 공개 URL에 연결합니다. 이것은 컴퓨터가 라우터나 방화벽 뒤에 있을 가능성이 높기 때문에 응용 프로그램의 개발 버전에 필요하므로 인터넷에서 직접 연결할 수 없습니다. ngrok이 설치되어 있지 않은 경우 Windows, MacOS 또는 Linux용 사본을 다운로드 할 수 있습니다 .
도메인 인증
Twilio SendGrid가 도메인에서 이메일을 수락할 수 있으려면 먼저 도메인을 인증해야 Twilio SendGrid에서 도메인이 사용자의 제어 하에 있음을 알 수 있습니다.
도메인 인증 시작
도메인을 인증하려면 SendGrid 계정에 로그인 하고 왼쪽 탐색 모음에서 "설정"을 열고 발신자 인증 을 선택 합니다.
발신자 인증 페이지 에서 "도메인 인증" 섹션의 "시작하기" 버튼을 클릭합니다.
DNS 공급자를 선택하라는 메시지가 표시되며 대부분의 경우 도메인을 구입한 회사와 동일합니다. DNS 공급자가 목록에 표시되지 않거나 공급자가 누구인지 모르는 경우 "확실하지 않음"을 선택하십시오.
그런 다음 보내는 이메일에 표시되는 링크에 브랜딩을 추가할지 묻는 메시지가 표시됩니다. 이것은 현재 우리가 관심을 갖는 주제가 아니므로 "아니오"를 선택하십시오. 이 옵션을 사용하려는 경우 나중에 활성화할 수 있습니다.
"다음" 버튼을 클릭하여 다음 페이지로 계속 진행합니다.
다음 페이지에서 도메인 이름을 제공하라는 메시지가 표시됩니다. 나는 yourdomainhere.com 을 입력했고 사용하려는 도메인을 입력해야 합니다. "고급 설정" 섹션에서 아무 것도 변경할 필요가 없습니다.
계속하려면 "다음" 버튼을 클릭하십시오.
이제 페이지에 유형, 호스트 이름 및 값이 있는 도메인 구성에 추가해야 하는 3개의 새 DNS 레코드가 표시됩니다. 편의를 위해 호스트와 값을 모두 클립보드에 복사할 수 있습니다. 아래에서 내가 지정한 설정을 볼 수 있습니다. 귀하의 도메인도 비슷하지만 귀하의 도메인 이름이 포함되어 있습니다.
도메인에 DNS 항목 추가
다음 단계는 DNS 공급자에 따라 다릅니다. 도메인의 구성 페이지를 방문하여 DNS 설정이 편집된 위치를 찾으십시오.
아래 스크린샷은 Google Domains 용 입니다. 다음 이미지에서 세 개의 DNS 레코드 중 첫 번째 레코드를 어떻게 추가했는지 확인할 수 있습니다. 이름이 @, ftp 및 www 레코드인 3개의 레코드는 이 자습서와 관련이 없으며 이미 내 도메인에 설정되어 있습니다.
DNS 레코드 이름을 입력하는 방법에 주의하십시오. 일부 공급자는 SendGrid에서 볼 수 있는 것처럼 DNS 레코드의 정규화된 이름을 기대하지만 다른 공급자는 도메인 이름 앞 부분만 기대합니다. 예를 들어 SendGrid가 em3329.yourdomainhere.com으로 표시한 레코드는 Google Domains에서 em3329 로 입력해야 했습니다 . 다른 DNS 레코드를 확인하고 이러한 새 레코드를 입력하는 방법을 일관되게 유지하십시오.
다음은 3개의 새 DNS 레코드를 입력한 후의 모습입니다.
도메인 확인
이제 도메인이 보류 중인 것으로 표시될 SendGrid 발신자 인증 페이지 로 돌아가 십시오. 클릭하면 인증 절차가 진행됩니다.
다음 화면에서 3개의 DNS 레코드를 볼 수 있습니다. 페이지 오른쪽 상단의 "확인" 버튼을 클릭하여 SendGrid가 DNS 레코드를 가져오고 요청한 항목을 추가했는지 확인합니다.
SendGrid가 도메인을 확인할 수 있으면 "작동했습니다!"라는 메시지가 표시됩니다. 페이지:
반면에 SendGrid가 DNS 항목을 확인할 수 없으면 나중에 다시 시도해야 합니다. DNS가 변경될 때마다 변경 사항이 DNS 서버에 전파되는 데는 어느 정도 시간이 걸립니다. DNS 항목을 편집한 직후에 오류가 발생하면 "확인" 버튼을 다시 누르기 전에 조금 더 시간을 주어야 합니다. DNS가 완전히 전파되는 데 최대 48시간이 소요될 수 있지만 일반적으로 시간이 훨씬 덜 걸립니다.
"성공했습니다!"라는 메시지가 표시되면 Flask 웹 응용 프로그램에 이메일을 게시하는 방법을 잘 알고 있습니다.
플라스크 이메일 애플리케이션
이제 SendGrid가 이메일을 전달할 수 있는 간단한 Flask 웹 애플리케이션을 작성할 준비가 되었습니다.
Python 가상 환경 만들기
Python 모범 사례에 따라 프로젝트를 위한 별도의 디렉터리를 만들고 그 안에 가상 환경 을 만들 것 입니다. 그런 다음 Flask 프레임워크를 설치할 것입니다.
Unix 또는 Mac OS 시스템을 사용하는 경우 터미널을 열고 다음 명령을 입력하여 위에서 설명한 작업을 수행합니다.
Windows에서 자습서를 따르는 경우 명령 프롬프트 창에 다음 명령을 입력합니다.
수신 이메일 경로
이제 수신 이메일을 수신할 Flask 애플리케이션을 작성해 보겠습니다. 전체 응용 프로그램의 코드는 아래에 나와 있습니다. 이 코드를 app.py 라는 파일에 넣 습니다 .
애플리케이션에는 /email URL 에 연결된 웹 경로가 하나만 있습니다. 수신 이메일을 전달하기 위해 SendGrid가 이 경로를 호출하도록 할 것입니다. 그들이 보내는 요청에는 표준 HTTP 양식 게시물로 보낸 이메일과 관련된 모든 세부 정보가 있습니다. 이것은 Flask에서 `request.form` 사전에서 이러한 모든 세부 정보에 쉽게 액세스할 수 있음을 의미합니다.
다음 형식 변수가 특히 중요합니다.
- `request.form['from']`: 이메일 발신자
- `request.form['to']`: 이메일 수신자
- `request.form['제목']`: 이메일 제목
- `request.form['text']` 일반 텍스트 형식의 이메일 본문
- `request.form['html']` HTML 형식의 이메일 본문
SendGrid에서 제출한 필드는 이것만이 아닙니다. SendGrid 문서에서 이메일 매개변수의 전체 목록을 검토하십시오 .
이메일 처리는 각 애플리케이션(예: Flask 애플리케이션)에 크게 의존하기 때문에 우리가 하는 일은 이메일 필드를 콘솔에 인쇄하는 것뿐입니다.
app.py 를 저장한 후 다음과 같이 Flask 애플리케이션을 시작할 수 있습니다.
응용 프로그램은 이제 실행 중이고 들어오는 요청을 수신하지만 자신의 컴퓨터에서만 연결할 수 있습니다. 지금은 터미널 창에서 실행 중인 애플리케이션을 그대로 둡니다. 다음 섹션에서 우리는 그것을 인터넷에 노출할 것입니다.
SendGrid 인바운드 구문 분석 웹훅
이 자습서의 마지막은 도메인의 수신 이메일을 Flask 애플리케이션으로 전달하도록 SendGrid를 구성하는 것입니다.
ngrok 시작
ngrok 도구는 공개적으로 사용 가능한 URL을 생성하고 이를 로컬에서 실행되는 애플리케이션에 매핑합니다. 이것은 개발 및 테스트를 위해 인터넷에 서비스를 노출하는 데 사용되는 일반적인 기술입니다. Flask 응용 프로그램이 완료되면 적절한 서버에서 프로덕션을 위해 배포하고 더 이상 필요하지 않습니다.
아직 설치하지 않았다면 시스템에 ngrok 를 설치하십시오. Flask 응용 프로그램을 실행 중인 상태로 두고 두 번째 터미널 창을 열어 다음과 같이 ngrok를 시작합니다.
이것은 Flask 애플리케이션이 웹 요청을 기다리고 있는 로컬 시스템의 포트 5000으로 공용 인터넷에서 "터널"을 생성하도록 ngrok에 지시합니다. ngrok의 출력은 다음과 같습니다.
ngrok 화면에서 "Forwarding"으로 시작하는 줄에 유의하십시오. 여기에는 ngrok이 요청을 우리 서비스로 리디렉션하는 데 사용하는 무작위로 생성된 공개 URL이 표시됩니다. 암호화를 사용하기 때문에 https:// URL 을 사용할 것 입니다.
SendGrid에 웹훅 URL 등록
SendGrid 대시보드 로 돌아가서 설정 아래에서 Inbound Parse 를 선택한 다음 "호스트 및 URL 추가"를 클릭합니다.
다음 페이지에서 이메일을 수신할 하위 도메인 을 입력하십시오. 이것은 귀하의 도메인에서 아직 사용되지 않는 모든 하위 도메인일 수 있습니다. 또는 최상위 도메인에서 직접 이메일을 수신하려는 경우에는 비워둘 수 있습니다. 아래 이미지에서 하위 도메인 parse 를 사용했습니다. 즉, SendGrid에서 허용하는 이메일의 형식은 < any>@parse.yourdomainhere.com 입니다. 하위 도메인 필드를 비워 두면 SendGrid에서 <anything>@yourdomainhere.com 에 대한 이메일을 수락할 수 있습니다. 어떤 경우에는 더 좋을 수도 있습니다.
다음으로 도메인 이름 을 선택해야 합니다 . SendGrid로 확인한 모든 도메인을 보여주는 드롭다운 목록입니다. 이 작업을 처음 수행하는 경우 이전에 확인한 도메인만 표시됩니다.
다음 필드는 웹훅 의 도착 URL 입니다. 이것은 Flask URL /email 이 추가된 ngrok에 의해 생성된 URL 입니다. 제 경우에는 https://bbf1b72b.ngrok.io/email 이었습니다 . 비슷한 URL이 있지만 ngrok 호스트 이름의 첫 번째 부분은 다를 것입니다.
"추가"를 클릭하여 웹훅을 구성하십시오.
이제 기본 Inbound Parse 페이지에 웹훅에 대한 항목이 표시됩니다.
참고: ngrok URL은 ngrok이 중지되고 다시 시작될 때마다 변경되므로 개발 중에 ngrok를 다시 시작할 때마다 URL을 업데이트하도록 웹훅을 편집해야 합니다. 프로덕션 용도로 웹훅을 배포할 때 공개 URL에서 직접 호스팅하므로 ngrok는 사용되지 않습니다.
구문 분석 하위 도메인 등록
이전 섹션에서 이메일을 수신하도록 선택한 하위 도메인은 'MX' 레코드를 사용하여 도메인의 DNS 구성에 정의해야 합니다. 이 레코드의 값은 모든 SendGrid 고객에 대해 동일합니다: `mx.sendgrid.net.`("net" 뒤의 후행 점 참고).
Google Domains DNS 구성에서 parse 하위 도메인을 다음과 같이 정의했습니다.
사용하는 도메인 공급자에 따라 이 DNS 레코드에 대한 전체 호스트 이름을 입력해야 할 수 있으므로 이 경우 parse.yourdomainhere.com 이 됩니다.
이전 섹션에서 하위 도메인을 정의하지 않기로 결정한 경우 호스트 이름은 yourdomainhere.com 이 됩니다. 일부 DNS 공급자의 경우 " @"로 지정해야 합니다.
이 DNS 변경 사항도 전파해야 하므로 이메일을 즉시 받지 못할 수도 있습니다.
테스트 이메일 보내기
Flask 애플리케이션과 ngrok이 모두 실행되는 동안 이메일 클라이언트를 열고 테스트 이메일을 보냅니다. SendGrid가 모든 사용자 이름을 캡처하므로 "받는 사람:" 필드에 원하는 사용자 이름을 입력할 수 있습니다. @ 뒤에 오는 것은 완전한 이메일 수신 도메인이어야 합니다.
아래 예에서 [email protected] 으로 이메일을 보냈습니다 .
SendGrid가 이메일을 수신하고 이를 ngrok 웹훅 URL로 전달할 때까지 1~2분 정도 기다리십시오. 그러면 이를 Flask의 /email 엔드포인트로 전달합니다. 위에서 보았듯이 Flask 애플리케이션에서 작성한 간단한 끝점은 콘솔에 수신된 이메일 데이터를 인쇄합니다.
이것이 다입니다. 이제 Flask 애플리케이션에서 웹 요청으로 이메일을 수신하고 있습니다!
프로덕션 배포
이 섹션에서는 개발 중에 배포된 웹훅과 프로덕션 사용을 위한 웹훅 간의 몇 가지 중요한 차이점을 지적하고 싶습니다.
ngrok 없이 배포
위에서 언급했듯이 ngrok은 프로덕션 도구가 아니며 프로덕션 배포에 사용해서는 안 됩니다. 대신 인터넷에 직접 연결된 서버에 Flask 애플리케이션을 배포합니다. Flask 설명서에 몇 가지 배포 옵션 이 설명되어 있습니다.
웹훅 보안
이메일 수신 엔드포인트가 인터넷에서 공개적으로 사용 가능하므로 URL을 아는 사람은 누구라도 이 엔드포인트에 요청을 보낼 수 있으므로 SendGrid 요청을 가장하는 악의적인 사용자가 보낸 가짜 호출에 애플리케이션이 노출될 수 있습니다.
이러한 유형의 공격을 방지하는 좋은 방법은 Flask 끝점에서 기본 인증 을 구현하는 것입니다. Flask-HTTPAuth 확장은 이러한 유형의 보안을 구현하는 데 도움이 될 수 있습니다 .
엔드포인트에 인증을 추가하는 경우 SendGrid에 제공된 웹훅 URL에 사용자 이름과 비밀번호를 포함해야 합니다. 위에서 사용한 웹훅은 https://username:[email protected]/email로 지정해야 합니다.
결론
이메일을 수신하도록 모든 것을 설정하는 데는 많은 단계가 필요하지만 이것이 가장 간단한 방법 중 하나입니다. Inbound Parse에 대한 자세한 내용은 문서 페이지를 확인하세요.
Inbound Parse로 무엇을 만들지 기대됩니다!