11장 메일 서버 준비하기
현재 까지의 구성 구조이다.
이번에는 메일 서버를 만들어 보자.
메일 시스템
메일 송신을 요청하면 수신자의 메일서버를 검색하고 메일 서버에 메일을 전송한다.
수신자의 메일 서버에 저장된 메일을 수신자가 확인할 수 있다.
메일 시스템에 사용되는 프로토콜은 다음과 같다.
- 메일 송신 : SMTP
- 메일 수신 : POP3, IMAP4
POP3 vs IMAP4
두 프로토콜은 최정적으로 메일이 저장되는 위치에 차이가 있다.
POP3 는 메일을 로컬 컴퓨터에 내려받아보관하지만, IMAP4는 메일 서버에서 메일을 보관하고 사용자는 브라우저를 이용해서 메일을 열람한다.
POP3는 로컬에 저장되어 오프라인에서도 메일을 읽을 수 있지만, IMAP4는 온라인에서만 열람 가능하다.
현재 대부분의 메일 시스템은 IMAP4를 기반으로 한다.
Amazon SES
메일 송수신 기능을 제공하는 AWS의 매니지드 서비스이다.
사람이 아니라 애플리케이션에서 메일을 송수신하는데 사용된다.
메일 송신
메일 송신자는 사람이 아닌 system@example.com 처럼 특별한 계정이 된다.
이러한 계정을 IAM 사용자로 등록하고, 해당 IAM 사용자를 이용해서 메일을 송신한다.
IAM 사용자 이용한 SES 연결 시의 인증 방법은 2가지이다.
- Amazon SES API
API 경유해서 직접 SES와 데이터 교환 - Amazon SES SMTP 인터페이스
SMTP 사용한 메일 송신
메일 수신
SES는 POP3나 IMAP4같은 프로토콜을 제공하지않고, 대신에 수신하면 액션을 실행한다.
액션을 이용해서 사용자로부터 수신받은 메일을 실시간으로 처리할 수 있다.
액션 | 설명 |
---|---|
S3액션 | 메일을 S3에 저장 |
SNS 액션 | 메일을 Amazon SNS 토픽에 공개 |
Lambda 액션 | Lambda 함수 실행 |
이러한 액션들을 사용해서 메일을 처리할 수 있다.
SES 생성 리전
현재 서울 리전에서는 송신 기능만 이용할 수 있다.
메일 수신도 SES를 이용하려면은 수신 가능한 리전을 선택해야한다.
자세한 내용은 https://docs.aws.amazon.com/ko_kr/ses/latest/dg/regions.html 참고
샌드박스
샌드박스는 외부에 영향을 주지 않도록 격리된 환경을 말한다. SES를 생성하면 샌드박스 내부에 위치한다.
샌드박스 내부에 있을 때에는 제약이 있으므로, 이를 해제하기 위해선 AWS 지원센터에 요청하여 샌드박스로 외부로 SES를 이동시켜야한다.
메일 송수신 기능 생성
수신기능도 테스트하기 위해 미국 동부 리전을 선택하였다.
도메인 설정
SES -> 확인된 자격증명(verified identifies) -> 자격 증명 생성
DKIM은 메일에 전자 서명을 넣어 위조된 메일이 아님을 보증한다.
생성 후 잠시후 검증 상태가 완료로 바뀐다.
검증 완료 메일 주소 추가
검증 완료된 메일 주소를 이용해야만 메일을 송수신 할 수 있다.
SES -> 자격증명 -> 메일 주소 추가
관리 콘솔에서 테스트 메일 송신
콘솔에서 테스트 이메일을 보낼 수 있다.
생성한 도메인을 지정하고 테스트 이메일을 전송한다.
SMTP를 이용한 메일 송신
애플리케이션에서 메일을 보내는 방법이 API와 STMP 인터페이스 사용하는 방법 2가지가 있다고 했다.
SMTP 인터페이스를 이용해서 메일을 송시해보자.
SES -> SMTP 설정 -> SMTP 보안 인증 생성
생성된 자격증명을 다운로드 해놓는다. 이후 다시 자격 정보를 얻을 수 없다
IAM에서 생성된 SMTP 사용자를 조회할 수 있다.
STMP 을 경유해서 테스트
from email import header
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email import charset
#config
acount = "****"
password = "****"
server = "smtp.163.com"
from_addr = "****@163.com"
to_addr = "****@qq.com"
#SMTP 서버 연결
con = smtplib.SMTP_SSL(server, 465)
con.login(acount, password)
cset = "utf-8"
message = MIMEText("SMTP 테스트", "plain", cset)
message["Subject"] = Header("SMTP을 경유한 전자메일 송신 테스트", cset)
message["From"] = from_addr
message["To"] = to_addr
#메일 송신
con.sendmail(from_addr, [to_addr], message.as_string())
#서버 연결 종료
con.close()
- server : SMTP 서버 이름. SMTP 설저에서의 엔드포이트
- from_addr : 송신자 메일 주소
- to_addr : 수신자 메일 주소
python sendmailtest.py
메일수신
SES에서 쓰기 가능한 S3 버킷 생성해줘야한다.
S3를 생성한 뒤 정책 변경해준다.
Amazon SES에 이메일 수신을 위한 권한 부여
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSESPuts",
"Effect": "Allow",
"Principal": {
"Service": "ses.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::for-learn8run-sse/*",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "**********",
"AWS:SourceArn": "arn:aws:ses:us-east-1:**********:receipt-rule-set/aws-intro-sample-mailbox:receipt-rule/simple-rule-inquiry"
}
}
}
]
}
SES -> 이메일 수신 -> 규칙 세트 생성 -> 규칙 생성
수신 가능 메일 주소 설정 한 뒤에 작업추가
S3 버킷으로 전송 작업 추가
해봤는데 잘안된다.ㅜㅜ 나중에 다시 해보자.