# 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 인데 왜 메일이 안 왔지 하고 여러 번 보냈었다 그 이유는 맨 처음 모르는 발신자로부터 온 메일이
스팸메일함에 쌓이고 있었던 것,,,,
스팸메일함에 가서 해당 메일 클릭 후 "스팸메일이 아님" 처리를 하면 그 이후 같은 계정으로 부터 발송된 메일은 일반 메일 함에 적재된다.
'API' 카테고리의 다른 글
| #1 TEST CODE 작성 : Todo API 만들기 (1) | 2024.12.14 | 
|---|---|
| [spring webSocket - 스프링 웹소켓] : 간이 채팅방 구현 (4) | 2024.09.16 | 
| WebSocketHandler - 오버라이드 메소드, override method 정리 (0) | 2024.09.16 | 
| Security/OAuth2(구글로그인)/JWT(access, refresh) 발행 및 저장 -개인 복습(API) 1부 (0) | 2024.05.01 | 
| [API] 다중 파일 업로드 & 다운로드 (Ver. Part) (0) | 2024.03.24 | 
 
                    
                   
                    
                  