IT/개발

[뉴스톡] 개발 일지 : 이메일 전송 기능 구현

와잉 2026. 5. 7. 14:45

현재 Newstocks 라는 주식 레포팅 시스템을 개발하고 있다.

 

구현은 빠른 환경과, 다양한 라이브러리를 손쉽게 쓸 수 있는 FastAPI 환경에서 개발 중이며,

SMTP는 Naver  mail을 사용해서 메일 전송 기능을 구현했다.

 

우선 환경 설정을 할 때 네이버 메일의 환경설정으로 이동해야 한다. (휴지통 아래에 위치)

POP/IMAP 설정으로 들어가 사용함으로 변경을 해주어야 한다.

이때 찾아본 자료와는 다르게 2단계 인증을 해주어야 한다고 되어있었는데. 여기서 2단계 인증애플리케이션 비밀번호 설정을 모두 해주어야 한다.

server.login(email_id, email_pw)
#아이디, 애플리케이션 pw값(네이버pwX)

나는 2단계 인증만 하고 코드에 내 네이버 비밀번호를 입력해줬더니 다음과 같은 인증 오류가 발생했었다.

SMTPAuthenticationError(code, resp) smtplib.SMTPAuthenticationError:
Username and Password not accepted

수정해주면 정상적으로 메일이 발송된 것을 확인할 수 있다.

전체 코드

import smtplib

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

from jinja2 import Environment, FileSystemLoader


# Jinja2 템플릿 설정
env = Environment(
    loader=FileSystemLoader('app/templates')
)


def render_html(news_list, insight):
    template = env.get_template("report.html")

    return template.render(
        news_list=news_list,
        insight=insight
    )


def send_mail():

    # 테스트 데이터
    news_list = [
        {
            "title": "삼성전자 실적 상승",
            "content": "영업이익 증가 예상"
        },
        {
            "title": "미국 금리 인상 가능성",
            "content": "연준 발언 영향"
        }
    ]

    insight = """
📊 시장 요약
- 반도체 시장 회복 기대
- 금리 인상 우려 지속

💡 투자 인사이트
기술주 변동성 확대 가능성 존재
"""

    # HTML 렌더링
    content = render_html(news_list, insight)

    message = MIMEMultipart()
    message['Subject'] = 'Newstocks Test'
    message['From'] = 'Newstocks <본인 이메일>'
    message['To'] = '전송 이메일'

    mimeText = MIMEText(content, 'html')
    message.attach(mimeText)

    email_id = 'id값'
    email_pw = '어플리케이션 pw'

    server = smtplib.SMTP('smtp.naver.com', 587)
    server.ehlo()

    server.starttls()

    server.login(email_id, email_pw)

    server.sendmail(
        message['From'],
        message['To'],
        message.as_string()
    )

    server.quit()

    print("메일 전송 완료")


send_mail()