2023. 10. 3. 01:25ㆍSpring기능모음
Spring Email
이메일을 보내서 인증을 받는다던지 등의 이유로 이메일을 쓸 가능성이 높은데, 매우 간단한 Email 보내는 프로그램을 한 번 짜볼 예정이다. 이메일만 보내는 기능이지만, DB에 exprTime과 보내는 이메일 주소를 넣고 유저가 해당하는 번호와 동일하게 만들어서 DB에 넣어놓고 사용자가 번호 치면 Email 기준으로 DB에서 끄집어와서 exprTime 지났는지 확인하고 번호 맞는지 확인하고 맞으면 이메일 인증 구현 뚝딱일 것 같아서 기록한다.
우선 spring 사이트에 가서 다음과 같이 프로젝트를 생성해서 만들었다.
인텔리제이에서 dependencies에 한 줄을 추가해서 전체 목록을 보면 다음과 같다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-mail' // 추가한 부분
}
그리고 폴더를 다음과 같이 난 만들었다.
기본으로는 application.properties인데 application.yml으로 바꿔주자. 그리고 해당 부분을 다음과 같이 채워주자. password는 실제 password를 입력하지 않아도 된다. 방법을 후에 알려주도록 하겠다. 이메일은 본인 gmail주소를 적으면 된다.
spring:
mail:
host: smtp.gmail.com
username: email주소
password: password
port: 587
properties:
mail:
smtp:
starttls:
enable: true
auth: true
우선 컨트롤러에 가서 다음과 같이 Controller를 만들어주자.
@RestController // JSON형태로 받고 주는 형식
@RequestMapping("/mail") // 주소창에 입력할 부분
public class EmailSendController {
private EmailService emailService;
// 생성자 주입 부분
public EmailSendController(EmailService emailService){
this.emailService = emailService;
}
// PostMapping으로 데이터를 주고 받을 예정이다.
// 각각 이야기하면 file은 실제 파일을 바이트코드로, cc는 참조
// to는 보낼 사람, subject는 보낼 제목, body는 보낼 내용이다.
@PostMapping("/send")
public String sendMail(@RequestParam(value = "file", required =false) MultipartFile[] file,
String to, String[] cc, String subject, String body){
return emailService.sendMail(file, to, cc, subject, body);
}
}
EmailService는 인터페이스 클래스로 다음과 같이 만들어주자.
public interface EmailService {
String sendMail(MultipartFile[] file, String to, String[] cc, String subject, String body);
}
이제 EmailService를 구현하기 위해 Impl에서 코드를 다음과 같이 짜자.
@Service
public class EmailServiceImpl implements EmailService {
// yml 파일에서 받아아서 넣는 부분, 내 이메일 주소가 들어가게 된다.
@Value("${spring.mail.username}")
private String fromEmail;
// Spring에서 이메일 보낼 수 있게 해주는 api
@Autowired
private JavaMailSender javaMailSender;
@Override
public String sendMail(MultipartFile[] file, String to, String[] cc, String subject, String body) {
try{
// message 생성관련 api사용
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
// Controller부분에서 각각이 무슨 내용인지 알려줬으니
// 해당 부분은 이 내용을 집어넣는 코드겠구나를 이해할 수 있을 것이라고 생각한다.
mimeMessageHelper.setFrom(fromEmail);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setCc(cc);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(body);
// 여러 파일일 수도 있으니까 파일 여러 개 보내는 코드
for(int i = 0; i < file.length; i++){
mimeMessageHelper.addAttachment(
file[i].getOriginalFilename(),
new ByteArrayResource(file[i].getBytes())
);
}
// 메세지 전송 코드
javaMailSender.send(mimeMessage);
// 해당 메세지를 log로 띄운다.
return "mial send";
} catch(Exception e){
throw new RuntimeException(e);
}
}
}
그런데 비밀번호를 해야되는데 실제 비밀번호를 쓰기 꺼리면, 내 계정에서 구글 계정 설정, 보안으로 가서 이메일 2차인증 받고 기기 등록 후에 비밀번호 등록받아서 입력하면 내 비밀번호 친 것처럼 사용이 가능하다.
이렇게 해서 PostMan에서 to와 cc만 본인이 보내고 싶은 부분으로 작성하고 해당 메일로 가서 확인해보면 모든 내용이 정상적으로 보내진 것을 볼 수 있다.
'Spring기능모음' 카테고리의 다른 글
p6spy 사용하기 (0) | 2024.01.30 |
---|