๐Ÿ“Œ Gmail SMTP ๋ฉ”์ผ ๋ฐœ์†ก (Spring Boot ๊ธฐ๋ฐ˜) โ€” ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉ

My Pale Blue Dotยท2025๋…„ 5์›” 14์ผ
0

SPRING BOOT

๋ชฉ๋ก ๋ณด๊ธฐ
29/40
post-thumbnail

๐Ÿ“… 2025-05-14

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

1๏ธโƒฃ Gmail ๋ฉ”์ผ ์ „์†ก ๋ฐฉ์‹ ๊ฐœ์š”

โœ… Gmail API vs Gmail SMTP ์ฐจ์ด์ 

ํ•ญ๋ชฉGmail APIGmail SMTP
์ธ์ฆ ๋ฐฉ์‹OAuth 2.0 (access token)์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ
์‚ฌ์šฉ ๋ฐฉ๋ฒ•Google Cloud Console ์„ค์ • + OAuth ์ธ์ฆ ํ๋ฆ„ ํ•„์š”์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐœ๊ธ‰๋งŒ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
์ฃผ์š” ์‚ฌ์šฉ ๋ชฉ์ Gmail ์ฝ˜ํ…์ธ  ์ ‘๊ทผ, ๋ฉ”์ผ ๊ด€๋ฆฌ๋‹จ์ˆœ ๋ฉ”์ผ ์ „์†ก(SMTP ์ „์†ก ์ „์šฉ)

์ด ๊ธ€์—์„œ๋Š” Gmail API(OAuth) ๋ฐฉ์‹์ด ์•„๋‹Œ, SMTP ๋ฐฉ์‹์œผ๋กœ Gmail์„ ์—ฐ๋™ํ•˜์—ฌ ๋ฉ”์ผ์„ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


2๏ธโƒฃ Gmail ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ • ๋ฐฉ๋ฒ•

  • ๊ฒฝ๋กœ: ๊ตฌ๊ธ€ ๊ณ„์ • > ๋ณด์•ˆ > ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ
  • ์„ค์ • ๋ฐฉ๋ฒ•:
    • ์•ฑ ์ด๋ฆ„ ์˜ˆ: "Mail API ํ…Œ์ŠคํŠธ"
    • ์ƒ์„ฑ๋œ 16์ž๋ฆฌ ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋ฐ˜๋“œ์‹œ ๋ณต์‚ฌ/์ €์žฅ (ํ•œ ๋ฒˆ๋งŒ ํ‘œ์‹œ๋จ)
    • ์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์‹ค์ œ ๋กœ๊ทธ์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹˜
    • 2๋‹จ๊ณ„ ์ธ์ฆ์ด ํ™œ์„ฑํ™”๋œ ๊ณ„์ •๋งŒ ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ƒ์„ฑ ๊ฐ€๋Šฅ

3๏ธโƒฃ Gradle ์˜์กด์„ฑ ์ถ”๊ฐ€

// ๋ฉ”์ผ ์ „์†ก ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ์Šคํƒ€ํ„ฐ
implementation 'org.springframework.boot:spring-boot-starter-mail'

4๏ธโƒฃ application.properties ์„ค์ •

## Google SMTP
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=boogiewoong2@gmail.com
spring.mail.password=**** **** **** ****  # ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.debug=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.mime.charset=UTF-8
spring.mail.properties.mail.transport.protocol=smtp

๐Ÿ”’ ๋ณด์•ˆ ํŒ

  • ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์œ„ ์„ค์ •์„ application.yml ๋˜๋Š” .env ํŒŒ์ผ๋กœ ์™ธ๋ถ€ ๋ถ„๋ฆฌ
  • ๋ฏผ๊ฐ ์ •๋ณด๋Š” ์ ˆ๋Œ€ Git์— ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋„๋ก .gitignore ์„ค์ • ํ•„์š”!

5๏ธโƒฃ ๋ฉ”์ผ ๋ฐœ์†ก ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌํ˜„

package com.example.demo.C06Google;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@Slf4j
@RequestMapping("/google/mail")
public class C01GoogleMailAPIController {

    @Autowired
    JavaMailSender javaMailSender;

    @GetMapping("/req")
    @ResponseBody
    public String req(@RequestParam("email") String email, @RequestParam("text") String text){
        log.info("GET /google/mail/req ์š”์ฒญ ์ˆ˜์‹ ...");

        try {
            // ๋‹จ์ˆœ ํ…์ŠคํŠธ ๋ฉ”์ผ ๊ตฌ์„ฑ
            SimpleMailMessage message = new SimpleMailMessage();
            message.setTo(email); // ์ˆ˜์‹ ์ž ์ฃผ์†Œ
            message.setSubject("[WEB๋ฐœ์‹ ] ๋ฉ”์ผ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค"); // ๋ฉ”์ผ ์ œ๋ชฉ
            message.setText(text); // ๋ณธ๋ฌธ ๋‚ด์šฉ

            javaMailSender.send(message); // ์ „์†ก
            return "โœ… ๋ฉ”์ผ ์ „์†ก ์„ฑ๊ณต!";
        } catch (Exception e) {
            log.error("๋ฉ”์ผ ์ „์†ก ์‹คํŒจ", e);
            return "โŒ ๋ฉ”์ผ ์ „์†ก ์‹คํŒจ: " + e.getMessage();
        }
    }
}

๐Ÿ”ฅ ์ •๋ฆฌ

  • spring-boot-starter-mail๊ณผ JavaMailSender๋ฅผ ์‚ฌ์šฉํ•ด Gmail์„ ํ†ตํ•œ SMTP ๋ฉ”์ผ ์ „์†ก ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • Gmail ๊ณ„์ •์€ 2๋‹จ๊ณ„ ์ธ์ฆ + ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ •์ด ํ•„์ˆ˜
  • ์‹ค๋ฌด์—์„  HTML ๋ฉ”์ผ, ํŒŒ์ผ ์ฒจ๋ถ€, ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜ ๋ฉ”์ผ ์ „์†ก ๋“ฑ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅ

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


๐Ÿ“ข ๋‹ค์Œ ํŽธ์—์„œ๋Š” HTML ๋ฉ”์ผ ์ „์†ก / ์ฒจ๋ถ€ํŒŒ์ผ ์ถ”๊ฐ€ / MimeMessage ์‚ฌ์šฉ ์˜ˆ์ œ๋ฅผ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด์•ผ!

ํ•„์š”ํ•˜๋ฉด ์ง€๊ธˆ ๋ฐ”๋กœ ์ค€๋น„ํ•ด์ค„๊ฒŒ ๐Ÿ˜„

์ด์ œ ์ด ๋‚ด์šฉ์„ ๋ฒจ๋กœ๊ทธ์— ๋ฐ”๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์–ด! ๐Ÿš€

์ธ๋„ค์ผ ์ด๋ฏธ์ง€๋„ ๋งŒ๋“ค์–ด์ค„๊นŒ?

profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€