API

메일 API : 이메일 보내기 API - (구글, 스프링부트)

letsDoDev 2024. 5. 29. 00:41

# 1 스프링 이니셜라이저를 통한 세팅

앱 비밀번호가 프로젝트 내 smtp 설정에서 password로 사용될 것이다.

※발급 시에만 보여지기 때문에 따로 메모장에 별도로 저장해두자 ※

 

 

# 2 build gradle

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.0'
	id 'io.spring.dependency-management' version '1.1.5'
}

group = 'com.static'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '21'
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-mail'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}

 

# 3 appplication.yml

spring:
  application:
    name: 'mailsend'

  mail:
    host: smtp.gmail.com   # 포털사이트마다 다름
    port: 587 # google, naver, kakao 마다 port 다름
    username: ${google_id_no@} # @~ 이하 부분을 제외한 구글 id -> 시스템 환경 변수에 저장
    password: ${google_app_pw} # google에서 발급한 앱 비밀헌호 -> 시스템 환경 변수에 저장
    properties:
      mail:
        smtp:
#          auth: true
#          timeout:
            starttls:
              enable: true

 

  - google  의 id 와 app_pw 나의 시스템 변수에다가 저장해서 사용할 것이다.

  - 변수 설정 적용하려면  인텔리제이 종료 후 다시 시작  ※필

 

간이 테스트이기 때문에

service 구현체, service 인터페이스 생성 및 용도에 따른 dto 분리는 작업하지 않았다.

 

controller에서 모두 작업한 후 테스트를 수행할 것이다.

(실제로 이를 응용하여 프로젝트를 진행한다면 당현히 계층을 분리해주어야 한다.)

 

# 4 MailDto

package com.example.demo.dto;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@ToString
@Getter
@NoArgsConstructor
public class MailDto {

    String username;
    String title;
    String description;

    @Builder
    public MailDto(String username, String title, String description) {
        this.username = username;
        this.title = title;
        this.description = description;
    }
}

 

#5 MailController

package com.example.demo.controller;

import com.example.demo.dto.MailDto;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class MailSendController {

    private final JavaMailSender javaMailSender;

    @PostMapping("/mailsend")
    public ResponseEntity mailSend(@RequestBody MailDto mailDto) {

        log.info("mailDto -> {}", mailDto);
        try {

            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, false, "UTF-8");
            mimeMessageHelper.setTo(mailDto.getUsername()); // 받는 사람 이메일
            mimeMessageHelper.setSubject(mailDto.getTitle()); // 메일 제목
            mimeMessageHelper.setText(mailDto.getDescription(),true); // 메일 내용, html 여부
            javaMailSender.send(mimeMessage);

            return ResponseEntity.ok().build();

        } catch (Exception e) {
            log.error(e.toString());
            return ResponseEntity.internalServerError().build();
        }
    }
}

 

 

#6 postman 테스트

 

#7 수신자 계정 이메일함 가서 메일 왔나 확인 (정상 발신 및 수신 확인 완료!)

 

※ 처음에 200 ok 인데 왜 메일이 안 왔지 하고 여러 번 보냈었다 그 이유는 맨 처음 모르는 발신자로부터 온 메일이

스팸메일함에 쌓이고 있었던 것,,,,

스팸메일함에 가서 해당 메일 클릭 후 "스팸메일이 아님" 처리를 하면  그 이후 같은 계정으로 부터 발송된 메일은 일반 메일 함에 적재된다.