๐Ÿ ํŒŒ์ด์ฌ ์ดˆ๋ณด์ž ๊ฐ€์ด๋“œ : ์ด๋ฉ”์ผ ์ž๋™ํ™”(์˜ˆ์ œ)




ํŒŒ์ด์ฌ์€ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๊ทธ์ค‘์—์„œ๋„ **'์ด๋ฉ”์ผ ์ž๋™ํ™”'**๋Š” ์ผ์ƒ ์—…๋ฌด๋‚˜ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ๋ฐ์š”. ๋งค๋ฒˆ ๋ฐ˜๋ณต๋˜๋Š” ๋ฉ”์ผ ๋ฐœ์†ก ์ž‘์—…์„ ํŒŒ์ด์ฌ์—๊ฒŒ ๋งก๊ฒจ๋ณด์„ธ์š”!


์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ํŒŒ์ด์ฌ์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ํ…์ŠคํŠธ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์˜ˆ์ œ ์ค‘์‹ฌ์œผ๋กœ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.


1. ⚙️ ์ค€๋น„๋ฌผ: SMTP ์„œ๋ฒ„์™€ ๋กœ๊ทธ์ธ ์ •๋ณด

์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๋ ค๋ฉด SMTP(Simple Mail Transfer Protocol) ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฉ”์ผ ์„œ๋น„์Šค(Gmail, Naver ๋“ฑ)๋Š” ์ด SMTP ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์ŠคSMTP ์„œ๋ฒ„ ์ฃผ์†ŒํฌํŠธ ๋ฒˆํ˜ธ
Gmailsmtp.gmail.com587 (TLS)
Naversmtp.naver.com587 (TLS)

⚠️ ์ฃผ์˜: ๋ณด์•ˆ ์„ค์ •!

Gmail์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ผ๋ฐ˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋Œ€์‹  **'์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ'**๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (2๋‹จ๊ณ„ ์ธ์ฆ ํ™œ์„ฑํ™” ํ•„์ˆ˜)

Naver ๋“ฑ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋„ 'SMTP/POP3 ์‚ฌ์šฉ' ์„ค์ •์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


2. ๐Ÿ ํ•„์ˆ˜ ํŒŒ์ด์ฌ ๋ชจ๋“ˆ ์†Œ๊ฐœ

์ด๋ฉ”์ผ ์ž๋™ํ™”์— ํ•„์š”ํ•œ ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ณ„๋„ ์„ค์น˜ ํ•„์š” ์—†์Œ)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • smtplib: SMTP ์„œ๋ฒ„์— ์ ‘์†ํ•˜๊ณ  ์ด๋ฉ”์ผ์„ ์‹ค์ œ๋กœ ๋ณด๋‚ด๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • email.message: ์ด๋ฉ”์ผ์˜ ์ œ๋ชฉ, ๋ณธ๋ฌธ, ์ˆ˜์‹ ์ž ๋“ฑ ๋‚ด์šฉ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


3. ๐Ÿ“ ๊ธฐ๋ณธ ์ด๋ฉ”์ผ ๋ฐœ์†ก ์˜ˆ์ œ ์ฝ”๋“œ

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ์˜ ํ…์ŠคํŠธ ์ด๋ฉ”์ผ์„ ๋ฐœ์†กํ•˜๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

Python
import smtplib
from email.message import EmailMessage

# ๐Ÿ”‘ STEP 1: ์ด๋ฉ”์ผ ์ •๋ณด ์„ค์ •
SENDER_EMAIL = "๋‹น์‹ ์˜_์ด๋ฉ”์ผ@gmail.com"  # ๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ ์ด๋ฉ”์ผ ์ฃผ์†Œ
SENDER_PASSWORD = "๋‹น์‹ ์˜_์•ฑ_๋น„๋ฐ€๋ฒˆํ˜ธ"     # Gmail ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋˜๋Š” ์ผ๋ฐ˜ ๋น„๋ฐ€๋ฒˆํ˜ธ
RECEIVER_EMAIL = "๋ฐ›๋Š”_์‚ฌ๋žŒ_์ด๋ฉ”์ผ@example.com" # ๋ฐ›๋Š” ์‚ฌ๋žŒ ์ด๋ฉ”์ผ ์ฃผ์†Œ

# ๐Ÿ“ง STEP 2: EmailMessage ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๋‚ด์šฉ ๊ตฌ์„ฑ
msg = EmailMessage()
msg['Subject'] = 'ํŒŒ์ด์ฌ์œผ๋กœ ๋ณด๋‚ธ ์ฒซ ๋ฒˆ์งธ ์ž๋™ํ™” ๋ฉ”์ผ! ๐Ÿฅณ'
msg['From'] = SENDER_EMAIL
msg['To'] = RECEIVER_EMAIL
msg.set_content('์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๊ฒƒ์€ ํŒŒ์ด์ฌ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฐœ์†ก๋œ ํ…Œ์ŠคํŠธ ์ด๋ฉ”์ผ์ž…๋‹ˆ๋‹ค.')

# ๐Ÿš€ STEP 3: SMTP ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ด๋ฉ”์ผ ์ „์†ก
try:
    # Gmail ์„œ๋ฒ„ ์ฃผ์†Œ์™€ ํฌํŠธ 587 ์‚ฌ์šฉ
    with smtplib.SMTP('smtp.gmail.com', 587) as server:
        server.ehlo()      # ์„œ๋ฒ„์— ์—ฐ๊ฒฐ ์‹œ์ž‘ (์˜ต์…˜)
        server.starttls()  # ๋ณด์•ˆ ์—ฐ๊ฒฐ (TLS) ์‹œ์ž‘
        server.ehlo()      # TLS ์—ฐ๊ฒฐ ํ›„ ๋‹ค์‹œ ์—ฐ๊ฒฐ (์˜ต์…˜)
        
        server.login(SENDER_EMAIL, SENDER_PASSWORD) # ๋กœ๊ทธ์ธ
        server.send_message(msg) # ์ด๋ฉ”์ผ ๋ฐœ์†ก
        
    print("✅ ์ด๋ฉ”์ผ ๋ฐœ์†ก ์„ฑ๊ณต!")

except Exception as e:
    print(f"❌ ์ด๋ฉ”์ผ ๋ฐœ์†ก ์‹คํŒจ: {e}")

๐Ÿง ์ฝ”๋“œ ์„ค๋ช…:

  1. EmailMessage(): ์ด๋ฉ”์ผ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ด์„ ๋นˆ ๋ด‰ํˆฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  2. msg['Subject'], msg['From'], msg['To']: ๋ด‰ํˆฌ์— ์ œ๋ชฉ, ๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ, ๋ฐ›๋Š” ์‚ฌ๋žŒ ์ •๋ณด๋ฅผ ๊ธฐ์ž…ํ•ฉ๋‹ˆ๋‹ค.

  3. msg.set_content(): ์ด๋ฉ”์ผ์˜ ๋ณธ๋ฌธ ๋‚ด์šฉ์„ ์ฑ„์›๋‹ˆ๋‹ค.

  4. smtplib.SMTP(...): Gmail SMTP ์„œ๋ฒ„์™€ ํฌํŠธ 587๋กœ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. with ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ๊ฒฐ์ด ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  5. server.starttls(): ์ด๋ฉ”์ผ ์ „์†ก ์‹œ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•ด TLS ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. server.login(): ์„ค์ •ํ•œ ์ด๋ฉ”์ผ ์ฃผ์†Œ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

  7. server.send_message(msg): ๊ตฌ์„ฑ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ๋ฐœ์†กํ•ฉ๋‹ˆ๋‹ค.


4. ๐Ÿ–ผ️ ๋ณด๋„ˆ์Šค: HTML ํ˜•์‹์œผ๋กœ ์˜ˆ์˜๊ฒŒ ๋ณด๋‚ด๊ธฐ!

ํ…์ŠคํŠธ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๋‹ค๋ฉด, ์›นํŽ˜์ด์ง€์ฒ˜๋Ÿผ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๋Š” HTML ํ˜•์‹์˜ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๋ณด์„ธ์š”.

์˜ˆ์ œ ์ฝ”๋“œ์˜ msg.set_content() ๋Œ€์‹  ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Python
# ... (์ด์ „ ์ฝ”๋“œ ๋™์ผ)

HTML_CONTENT = """
<html>
<body>
    <h2>✨ ํŒŒ์ด์ฌ ์ž๋™ํ™” ์ด๋ฉ”์ผ์ž…๋‹ˆ๋‹ค!</h2>
    <p style="color: blue;">์ด ๋‚ด์šฉ์€ HTML ํƒœ๊ทธ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. </p>
    <ul>
        <li>์ž๋™ํ™” ์„ฑ๊ณต!</li>
        <li>ํŒŒ์ด์ฌ ์ตœ๊ณ !</li>
    </ul>
</body>
</html>
"""

# set_content ๋Œ€์‹  add_alternative ์‚ฌ์šฉ
msg.add_alternative(HTML_CONTENT, subtype='html')

# ๐Ÿš€ STEP 3: SMTP ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ด๋ฉ”์ผ ์ „์†ก (๋‚˜๋จธ์ง€ ์ฝ”๋“œ ๋™์ผ)
# ...
  • subtype='html'์„ ์ง€์ •ํ•˜์—ฌ ์ด๋ฉ”์ผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด ๋‚ด์šฉ์„ HTML๋กœ ํ•ด์„ํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋„ ์ด ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ •๊ธฐ ๋ณด๊ณ ์„œ ๋ฐœ์†ก, ์•Œ๋ฆผ ๋ฉ”์ผ ์ž๋™ํ™” ๋“ฑ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ’ก

๋Œ“๊ธ€