# 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 |