본문 바로가기
파이썬 웹 서비스 만들기

9. 이메일 보내기 - 9.2. 파이썬 flask mail 패키지

by 영바이트 2020. 11. 29.

 

포스팅의 큰 주제로 계정 암호(password)와 같이 중요한 계정 정보를 수정하는 기능을 다루려고한다. 계정 정보 수정을 위한 방법으로 허가된 사용자에게만 계정 정보를 수정할 수 있는 페이지를 이메일을 통해 제공하는 방법이 많이 사용된다.

 

파이썬과 플라스크를 이용해서 자동으로 메일을 발송할 수 있다. 웹 상에서 자동으로 발송되는 이메일들은 이런 방식으로 웹 서버 수준에서 생성되고 발송된다. 파이썬 Flask 서버에서는 메일 발송을 위해 Flask-Mail 패키지가 사용된다. 메일을 발송하는 과정은 아래와 같다.

 

① 메일 서버 정보 설정

from flask import Flask
from flask_mail import Mail, Message

app = Flask(__name__)

app.config['MAIL_SERVER'] = 'smtp.gmail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = 'YOUR_ACCOUNT'
app.config['MAIL_PASSWORD'] = 'YOUR_PASSWORD'

mail = Mail(app)

 

플라스크 객체를 생성하고 메일 서버 정보들을 설정한다. 여기서는 구글 메일 서버를 사용하였다. 설정 중 TLS는 메일을  주고 받을 때 메시지를 암호화하여 주고받는 규약(프로토콜Protocol) 중 하나이다. 설정을 마치고 마지막으로 Mail 객체를 생성한다.

 

메일 서버 정보 설정에서 MAIL_USERNAME과 MAIL_PASSWORD 항목은 실제 사용하고 있는 구글 메일 계정의 사용자 이름과 패스워드를 입력한다.

 

② 메시지 생성

@app.route("/")
@app.route("/home")
def home():
    msg = Message(subject='Hello Flask Mail', sender='noreply@abc.com', recipients=['수신자 메일주소'])
    msg.body = f'Hello, this email is sent using Flask Mail:)'
    mail.send(msg)
    return "A test email is sent"

 

메시지는 헤더Header와 바디Body로 구성되어 있다. 헤더에는 제목, 보내는 사람, 받는 사람 등 편지봉투 겉면에 들어가는 정보들이 들어가고, 바디에는 전달하고자하는 메시지가 포함된다.

 

메시지 본문을 기술할 때 사용한 방법인 f''' ... ''' 형태의 기술 방법을 '포맷 문자열 리터럴(formatted string literal)' 혹은 'f-문자열(f-strings)'이라고 하는데, 아래와 같이 f 뒤의 따옴표 사이에 문자열과 더불어 변수를 사용할 수 있다는 점에서 편리하다.

 

subject = 'test'

print(f'Hello, this is a {subject}.')

→ 'Hello, this is a test.' 문자열이 출력된다. 

 

③ 메일 발송

@app.route("/")
@app.route("/home")
def home():
    ...
    mail.send(msg)
    return "A test email is sent"
    
if __name__ == '__main__':
    app.run("127.0.0.1", 5000)

 

생성한 메시지를 mail 객체의 send 메서드를 이용해서 'mail.send(msg)' 명령으로 발송할 수 있다. Flask-Mail 패키지는 플라스크와 함께 동작하기 때문에 app.run()을 통해 플라스크 서버를 동작시키고, 플라스크가 home() 함수 안에서 메일 발송 함수 mail.send(msg)를 실행시키는 방법으로 최종적으로 메일이 발송된다.

 

 

 


 

 

'메일 서버 정보 설정 → 메시지 생성 → 메일 발송' 전체 과정을 동작하는 코드로 결합시키면 아래와 같다.

from flask import Flask
from flask_mail import Mail, Message

app = Flask(__name__)

app.config['MAIL_SERVER'] = 'smtp.gmail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = 'YOUR_ACCOUNT'
app.config['MAIL_PASSWORD'] = 'YOUR_PASSWORD'

mail = Mail(app)

@app.route("/")
@app.route("/home")
def home():
    msg = Message(subject='Hello Flask Mail', sender='noreply@abc.com', recipients=['수신자 메일주소'])
    msg.body = f'Hello, this email is sent using Flask Mail:)'
    mail.send(msg)
    return "A test email is sent"

if __name__ == '__main__':
    app.run("127.0.0.1", 5000)

 

해당 코드를 실행시키고 웹 브라우저 등을 통해 웹 서비스의 홈 URL(/ 또는 /home)로 접속해서 home() 함수를 실행시키면 메시지 생성과 메일 발송이 이루어진다.

 

메일 발송 결과

 

수신자 메일 주소의 메일함을 확인해보면 아래와 같이 발송한 메일이 도착했음을 확인할 수 있다.

 

수신된 메일

 

 


 

 

만약 메일이 정상적으로 발송되지 않는다면 구글 메일 서버의 보안 설정 수준을 조정할 필요가 있다. 예를 들면 아래와 같은 오류가 발생하는 경우가 있을 수 있다.

 

 

SMTPAuthenticationError: Username and Password not accepted

 

 

구글 메일에 접속해서 'Google 계정 설정'에서 아래와 같이 보안 수준을 조정한 후 플라스크 서버를 통해 메일을 발송하면 된다.

 

구글메일 보안 탭

 

보안 수준 설정 항목

 

보안 수준 설정: 보안 수준이 낮은 앱 허용: 사용

 

 

플라스크를 이용한 메일 발송 실습을 마치고 나면 메일 서버의 보안 수준을 원래 수준인 '보안 수준이 낮은 앱 허용: 사용 안 함'으로 다시 수정해서 불필요한 보안 위험이 발생하지 않도록 한다.

 

댓글