[파이썬] Tornado에서의 메일 전송

Tornado는 파이썬으로 개발된 웹 어플리케이션 프레임워크로, 비동기 처리 및 고성능 웹 서버와 함께 사용하기 적합합니다. 이번 블로그 포스트에서는 Tornado에서 메일 전송을 어떻게 할 수 있는지 알아보겠습니다.

메일 전송 라이브러리

Tornado에서 메일 전송을 위해 smtplib 라이브러리를 활용할 수 있습니다. 이 라이브러리는 SMTP(Simple Mail Transfer Protocol) 프로토콜을 사용하여 메일을 전송하는 기능을 제공합니다. Tornado와 함께 웹 서버를 개발하는 경우에는 일반적으로 비동기 처리를 해야하므로, smtplib 대신 aiosmtplib를 사용하는 것이 좋습니다. 이 라이브러리는 비동기 IO를 지원하므로 Tornado의 비동기 특성과 잘 어울립니다.

메일 전송 설정

메일을 전송하기 전에, 메일 서버의 정보를 설정해야 합니다. 예를 들어, Gmail을 사용하는 경우 아래와 같이 설정할 수 있습니다.

# SMTP 서버 설정
SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587

# 계정 정보
SMTP_USERNAME = 'your_email@gmail.com'
SMTP_PASSWORD = 'your_password'

위의 설정에서 SMTP_SERVER는 메일 서버의 호스트 주소, SMTP_PORT는 포트 번호를 의미합니다. SMTP_USERNAMESMTP_PASSWORD는 메일 전송에 사용할 계정의 정보입니다. 이 정보는 메일을 보내는데 사용될 것입니다.

메일 전송하는 함수

이제 메일을 전송하는 함수를 작성해보겠습니다.

import asyncio
import aiosmtplib

async def send_email(to_email, subject, body):
    # 메일 전송 설정
    smtp = aiosmtplib.SMTP(hostname=SMTP_SERVER, port=SMTP_PORT, use_tls=True)
    await smtp.connect()

    # 로그인
    await smtp.login(SMTP_USERNAME, SMTP_PASSWORD)

    # 메일 전송
    message = f"Subject: {subject}\n\n{body}"
    await smtp.sendmail(SMTP_USERNAME, to_email, message)

    # 연결 종료
    await smtp.quit()

위의 코드에서 send_email 함수는 세 개의 매개변수를 받습니다. to_email은 수신자의 이메일 주소, subject는 메일 제목, body는 메일 내용입니다. 함수 내부에서는 aiosmtplib.SMTP를 사용하여 SMTP 서버에 연결하고, 로그인 후 메일을 전송합니다.

메일 전송 예제

이제 앞서 작성한 메일 전송 함수를 사용하여 실제로 메일을 전송하는 예제를 살펴보겠습니다.

import tornado.ioloop
import tornado.web
import asyncio

class EmailHandler(tornado.web.RequestHandler):
    async def post(self):
        to_email = self.get_argument('to_email')
        subject = self.get_argument('subject')
        body = self.get_argument('body')

        await send_email(to_email, subject, body)

        self.write('메일이 성공적으로 전송되었습니다.')

if __name__ == "__main__":
    app = tornado.web.Application([(r"/send_email", EmailHandler)])
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

위의 예제는 Tornado의 RequestHandler를 사용하여 /send_email 엔드포인트로 POST 요청을 받으면, 이메일을 전송하는 로직을 수행합니다.

결론

Tornado에서 메일을 전송하는 방법을 알아보았습니다. smtplib 대신 aiosmtplib를 사용하여 비동기 특성과 어울리게 메일 전송 기능을 구현할 수 있습니다. 메일 전송은 웹 애플리케이션 개발 시 자주 사용되는 기능이므로, Tornado에서 메일 전송을 어떻게 구현할 수 있는지 알아두면 유용합니다.