이전 내용
[파이썬] FastAPI - 메모 앱 프로젝트 9: 소셜 로그인 추가(네이버)
이전 내용 [파이썬] FastAPI - 메모 앱 프로젝트 9: 소셜 로그인 추가(카카오)이전 내용 [파이썬] FastAPI - 메모 앱 프로젝트 9: 소셜 로그인 추가(구글)이전 내용 [파이썬] FastAPI - 메모 앱 프로젝트 8: MV
puppy-foot-it.tistory.com
환영 이메일 발송 기능 구현
BackgroundTasks 클래스 란?
소셜 로그인(구글, 카카오, 네이버) 기능을 모두 구현했으므로, 이제 신규 회원 가입 시 환영 이메일을 발송하는 기능을 구현해 본다.
FastAPI에서는 FastAPI에서 제공하는 BackgroundTasks 클래스를 이용해 응답을 반환한 후에 실행할 백그라운드 작업을 정의할 수 있다. 백그라운드 작업은 클라이언트가 응답을 받기 위해 작업이 완료될 때까지 기다릴 필요가 없기 때문에 요청 후에 발생해야하는 작업에 매우 유용하다.
◆ BackgroundTasks 클래스
BackgroundTasks는 FastAPI에서 제공하는 도우미 클래스로, 이 클래스를 사용하면 클라이언트로부터 요청을 받은 후 작업을 백그라운드에서 수행할 수 있다.
예를 들어 작업을 수행한 후 전송되는 이메일 알림이나, 데이터 처리 등을 구현할 수 있다.
https://fastapi.tiangolo.com/ko/tutorial/background-tasks/
백그라운드 작업 - FastAPI
FastAPI framework, high performance, easy to learn, fast to code, ready for production
fastapi.tiangolo.com
BackgroudTasks 클래스를 사용하면 FastAPI에서 엔드포인트 함수의 매개변수로 주입받아 사용하고 FastAPI가 나머지를 처리하도록 할 수 있다.
만약 HTTP 요청을 받은 후에 어떤 작업을 백그라운드에서 처리하고 싶다면, 해당 작업을 BackgroundTasks 객체에 추가한다. 그러면 요청에 대한 응답을 즉시 보내고 등록된 백그라운드 작업을 BackgroundTasks에 맡겨 그 작업을 백그라운드에서 처리하게 한다.
BackgroundTasks 클래스는 starlette.backgroud 모듈에서 제공하며, FastAPI에 포함되어 있으므로 fastapi 모듈에서 가져와 사용할 수 있다.
BackgroundTasks로 이메일 전송
1. 지메일 앱 비밀번호 생성
이제 앞서 만든 메모앱에 사용자가 가입했을 때 환영 이메일을 전송하는 백그라운드 작업을 적용해 본다. 여기서는 간단하게 구글 계정을 이용해 메일을 전송하는 방법으로 진행한다.
먼저 구글 계정에서 로그인을 하고, [Google 계정 관리]로 이동한다.
그리고 [보안]에서 [2단계 인증]을 활성화 한다.
그리고 하단에 보면 앱 비밀번호가 있는데, 여기서 사용할 앱 비밀번호를 생성한다.
앱 비밀번호는 이메일 계정의 보안을 위한 장치로, 사용자의 로그인 비밀번호를 이용하지 않고 특정 앱에 따로 비밀번호를 생성해서 권한을 부여하는 방식이다.
새로운 앱에서 사용할 비밀번호를 생성하기 위해 앱 이름을 입력하고 [만들기] 버튼 클릭
그러면 이렇게 앱 비밀번호가 생성되는데, 이를 복사하여
.env 파일에 계정이랑 같이 넣는다.
# 지메일 계정 (이메일 발송 용)
EMAIL_ADDRESS = "본인의 지메일 계정"
EMAIL_PASSWORD = "생성한 앱 비밀번호"
BackgroundTasks로 이메일 전송
2. 이메일 발송 기능 구현 파일 생성
그리고 email_service.py 파일을 생성하여 이메일 발송 기능을 구현한다.
◆ email_service.py
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from dotenv import load_dotenv
import os
load_dotenv()
class EmailService:
def send_email(
self,
receiver_email: str,
):
sender_email = os.getenv('EMAIL_ADDRESS')
password = os.getenv('EMAIL_PASSWORD')
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "회원 가입을 환영합니다."
body = "메모 앱 서비스를 이용해 주셔서 감사합니다."
message.attach(MIMEText(body, "plain"))
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login(sender_email, password)
server.send_message(message)
[코드 설명]
- 필요한 라이브러리 import
- smtplib: Python의 표준 라이브러리로, 이메일 송신을 위한 SMTP 프로토콜을 지원.
- MIMEText, MIMEMultipart: 이메일의 내용(텍스트 및 여러 형식)을 정의하는 데 사용. 텍스트 또는 HTML 형식을 가진 이메일 본문을 만들 수 있다.
- load_dotenv: 환경 변수를 관리하기 위해 사용하며, .env 파일에서 이메일 주소 및 비밀번호 같은 민감한 정보를 불러오는 역할.
- os: 운영 체제와 상호작용하기 위한 표준 라이브러리로, 환경 변수를 읽기 위해 사용.
- load_dotenv()로 .env 파일에 저장된 환경 변수를 불러온다. .env 파일은 이메일 주소와 비밀번호 같은 민감한 정보를 저장한다.
- EmailService 클래스 생성
- 이메일 전송 기능을 제공하는 클래스
- send_email 메서드는 수신자의 이메일 주소를 입력으로 받아 이메일을 전송하며, receiver_email는 수신자의 이메일 주소를 나타내는 문자열이다.
- 환경 변수에서 보낸이 이메일 주소와 비밀번호를 불러와 이메일 메시지를 생성한다.
- message = MIMEMultipart() : MIMEMultipart 객체를 생성하여 이메일 메시지를 구성
- message["From"] = sender_email: 발신자
- message["To"] = receiver_email: 수신자
- message["Subject"] = "회원 가입을 환영합니다.": 제목
- 이메일 본문 첨부
- body = "메모 앱 서비스를 이용해 주셔서 감사합니다."
message.attach(MIMEText(body, "plain")) - 이메일의 본문 내용을 문자열로 작성하고, MIMEText로 감싼 후 message 객체에 첨부
- 이메일 송신
- Gmail의 SMTP 서버에 연결합니다. SSL을 통해 안전하게 연결하며, 포트 465를 사용.
- 로그인 후, send_message 메서드로 작성한 이메일 메시지를 송신.
BackgroundTasks로 이메일 전송
3. 컨트롤러 수정
controllers.py에 신규 회원 가입 시 이메일 발송 기능을 수행하도록 코드를 추가 작성 및 수정해 준다.
◆ controllers.py
추가 작성
from fastapi import FastAPI, Request, Depends, HTTPException, APIRouter, BackgroundTasks
from email_service import EmailService
# 이메일 전송 함수 정의
def send_welcome_email(email: str):
# 이메일 전송
email_service = EmailService() # EmailService 클래스 인스턴스 생성
try:
email_service.send_email(receiver_email=email) # 이메일 전송
except Exception as e:
# 이메일 전송 실패 시 에러 메시지 반환
print(f"이메일 전송 실패: {e}") # 에러 로깅
- BackgroudTasks 라이브러리를 import 해주고 이메일을 전송하는 함수인 send_welcome_email을 작성한다.
회원 가입을 하는 부분도 수정해 준다.
# 회원 가입
@router.post("/signup")
async def signup(signup_data: UserCreate, background_tasks: BackgroundTasks, db: Session=Depends(get_db)):
# ID 규칙 확인: 영어 소문자와 숫자만 허용
if not re.fullmatch(r"[a-z0-9]+", signup_data.username):
raise HTTPException(status_code=400, detail="사용자 이름은 영어 소문자와 숫자로만 구성되어야 합니다.")
# 비밀번호 규칙 확인
password_regex = re.compile(r"""
(?=.*[a-z]) # 적어도 하나의 소문자
(?=.*[A-Z]) # 적어도 하나의 대문자
(?=.*\d) # 적어도 하나의 숫자
(?=.*[@$!%*?&\-_+=<>]) # 적어도 하나의 특수문자
.{10,} # 길이는 10자 이상
""", re.VERBOSE)
if not password_regex.match(signup_data.password):
raise HTTPException(status_code=400, detail="비밀번호는 최소 10자 이상이며, 대문자, 소문자, 숫자 및 특수문자가 포함되어야 합니다.")
# username 중복 확인
existing_user = db.query(User).filter(User.username == signup_data.username).first()
if existing_user:
raise HTTPException(status_code=400, detail="이미 존재하는 사용자 이름 입니다.")
hashed_password = get_password_hash(signup_data.password) # 비밀번호 해시 기능
new_user = User(username=signup_data.username, email=signup_data.email, hashed_password=hashed_password)
db.add(new_user)
try:
db.commit()
except Exception as e:
db.rollback() # 에러 발생 시 롤백
raise HTTPException(status_code=500, detail="회원 가입 실패. 다시 시도해 주세요.")
db.refresh(new_user)
# 백그라운드 작업 등록
background_tasks.add_task(send_welcome_email, new_user.email)
return {"message": "회원가입을 성공하였습니다. 이메일을 확인해 주세요."}
- background_tasks: BackgroundTasks: signup 함수의 매개변수로 BackgroundTasks를 추가
- 새로운 가입자를 commit하고 나면, 이메일 전송 호출을 BackgroundTasks에 등록하여 실행되도록 한다.
회원 가입 이메일 전송 테스트
이제 main.py를 실행하여 서버를 실행한 뒤, 회원 가입을 진행하여 등록한 메일로 회원가입 메시지가 오는지 확인해 본다.
회원 가입이 성공하면 성공했다는 메시지가 팝업으로 뜬다.
등록한 메일로 들어가서 확인해 보면 회원 가입 환영 이메일이 잘 발송된 것을 확인할 수 있다.
마지막으로 버전 관리를 위해 requirements.txt 파일을 업데이트해준다.
pip freeze > requirements.txt
만약, 추후 이메일 인증 서비스를 구현하려면 하단 링크를 참고하면 좋을 거 같다.
4. FastAPI 회원 가입( Redis, SMTP 활용 이메일 인증 )
오늘은 사용자에게 이메일을 통해 인증번호를 보내고 확인하는 기능을 구현해볼게요!전 포스트를 확인하면 GOod!큰 흐름은 이렇게 진행돼요1\. 사용자에게 이메일을 입력받는다.2\. 랜덤한 6자리
velog.io
[참고]
https://fastapi.tiangolo.com/ko/tutorial/background-tasks/
FastAPI로 배우는 백엔드 프로그래밍 with 클린 아키텍처
다음 내용
[파이썬] FastAPI - 메모 앱 프로젝트 11: 회원 탈퇴
이전 내용 [파이썬] FastAPI - 메모 앱 프로젝트 10: 환영 이메일 발송이전 내용 [파이썬] FastAPI - 메모 앱 프로젝트 9: 소셜 로그인 추가(네이버)이전 내용 [파이썬] FastAPI - 메모 앱 프로젝트 9: 소셜
puppy-foot-it.tistory.com
'[파이썬 Projects] > <파이썬 웹개발>' 카테고리의 다른 글
[파이썬]FastAPI - 다른 컴퓨터에서 프로젝트(VSCODE, 깃허브) (0) | 2025.05.12 |
---|---|
[파이썬] FastAPI - 메모 앱 프로젝트 11: 회원 탈퇴 (0) | 2025.05.12 |
[파이썬] FastAPI - 메모 앱 프로젝트 9: 소셜 로그인 추가(네이버) (0) | 2025.05.12 |
[파이썬] FastAPI - 메모 앱 프로젝트 9: 소셜 로그인 추가(카카오) (0) | 2025.05.12 |
[파이썬] FastAPI - 메모 앱 프로젝트 9: 소셜 로그인 추가(구글) (0) | 2025.05.10 |