1. Gmail SMTP Server
구글 계정만 있으면 Gmail SMTP Server를 통해 무료로 이메일을 전송할 수 있습니다.
Gmail SMTP Service 설정 정보는 다음과 같습니다.
2. pom.xml (dependency)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
3. application.yml
spring :
mail :
host : smtp.gmail.com
port : 587
username : 'your email'
password : 'your password'
properties :
mail :
smtp :
auth : true
starttls :
enable : true
4. 이메일 전송 예제
1) MailTO.java
전송할 메일의 정보를 저장합니다.
public class MailTO {
private String address;
private String title;
private String message;
/*
getter, setter 생략
*/
}
2). MailService.java
메일 전송기능을 모아둔 서비스 입니다.
sendMail 메소드에 MailTO 값을 넘겨서 메일 전송을 수행합니다.
import com.example.bamdule.model.TO.MailTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;
@Component
public class MailService {
@Autowired
private JavaMailSender mailSender;
public void sendMail(MailTO mail) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(mail.getAddress());
// message.setFrom(""); from 값을 설정하지 않으면 application.yml의 username값이 설정됩니다.
message.setSubject(mail.getTitle());
message.setText(mail.getMessage());
mailSender.send(message);
}
}
3). MailController.java
메일을 전송하는 컨트롤러입니다.
Get 방식으로 sendTestMail 메소드를 호출할 때 email 값을 query String으로 받아 해당 email로 테스트 메일을 전송합니다.
import com.example.bamdule.model.TO.MailTO;
import com.example.bamdule.mail.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/mail")
public class MailController {
@Autowired
private MailService mailService;
@GetMapping("/send")
public MailTO sendTestMail(String email) {
MailTO mailTO = new MailTO();
mailTO.setAddress(email);
mailTO.setTitle("밤둘레 님이 발송한 이메일입니다.");
mailTO.setMessage("안녕하세요. 반가워요!");
mailService.sendMail(mailTO);
return mailTO;
}
}
4) 메일 전송 테스트
http://localhost:8080/컨텍스트경로/mail/send?email=Bamdule5@gmail.com
org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at 535 5.7.8 https://support.google.com/mail/?p=BadCredentials b13sm3972805pjl.38 - gsmtp
위 에러가 발생하는 경우 보안 수준이 낮은 앱의 액세스를 허용해 주어야 합니다.
5. 파일 첨부 및 이미지가 삽입된 이메일 전송하기
1) MailHandler.java
import java.io.File;
import java.io.IOException;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
public class MailHandler {
private final JavaMailSender sender;
private final MimeMessage mimeMessage;
private final MimeMessageHelper mimeMessageHelper;
public MailHandler(JavaMailSender javaMailSender) throws MessagingException {
this.sender = javaMailSender;
this.mimeMessage = javaMailSender.createMimeMessage();
this.mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
}
public void setFrom(String fromAddress) throws MessagingException {
mimeMessageHelper.setFrom(fromAddress);
}
public void setTo(String email) throws MessagingException {
mimeMessageHelper.setTo(email);
}
public void setSubject(String subject) throws MessagingException {
mimeMessageHelper.setSubject(subject);
}
public void setText(String text, boolean useHtml) throws MessagingException {
mimeMessageHelper.setText(text, useHtml);
}
public void setAttach(String fileName, String path) throws MessagingException, IOException {
File file = new ClassPathResource(path).getFile();
FileSystemResource fsr = new FileSystemResource(file);
mimeMessageHelper.addAttachment(fileName, fsr);
}
public void setInline(String fileName, String path) throws MessagingException, IOException {
File file = new ClassPathResource(path).getFile();
FileSystemResource fileSystemResource = new FileSystemResource(file);
mimeMessageHelper.addInline(fileName, fileSystemResource);
}
public void send() {
sender.send(mimeMessage);
}
}
javaMailSender 객체를 생성자로 받습니다.
MimeMassageHelper를 생성해 Mail을 커스텀할 수 있습니다.
setAttach메소드를 이용해 파일 첨부를 하고, setInline 메소드를 이용해 메일 안에 이미지를 삽입할 수 있습니다.
2) MailService.java에 아래 메소드 추가
public void sendMailWithFiles(MailTO mail) throws MessagingException, IOException {
MailHandler mailHandler = new MailHandler(mailSender);
mailHandler.setTo(mail.getAddress());
mailHandler.setSubject(mail.getTitle());
String htmlContent = "<p>" + mail.getMessage() + "<p> <img src='cid:google-logo'>";
mailHandler.setText(htmlContent, true);
mailHandler.setAttach("test.txt", "static/test.txt");
mailHandler.setInline("google-logo", "static/google-logo.png");
mailHandler.send();
}
src/main/resources/static 폴더 아래에 google-log.png 파일과 test.txt 파일을 넣어주셔야 합니다.
파일 명은 원하는 대로 변경해도 됩니다.
3) MailController.java에 아래 메소드 추가
@GetMapping("/fileSend")
public MailTO sendTestFileEmail(String email) throws MessagingException, IOException {
MailTO mailTO = new MailTO();
mailTO.setAddress(email);
mailTO.setTitle("밤둘레 님이 발송한 이메일입니다.");
mailTO.setMessage("안녕하세요. 반가워요!");
mailService.sendMailWithFiles(mailTO);
return mailTO;
}
4) 테스트 메일 전송
http://localhost:8080/컨텍스트경로/mail/fileSend?email=Bamdule5@gmail.com
도움이 되셨다면 공감 한번씩 눌러주세요!
참조
https://victorydntmd.tistory.com/342?category=764331
'IT > Spring' 카테고리의 다른 글
[SpringBoot] HATEOAS 적용하기 (0) | 2021.06.17 |
---|---|
[SpringBoot] H2 데이터베이스 사용하기 (0) | 2021.06.17 |
[SpringBoot] tomcat 종료 시 logback thread가 종료되지 않을 경우 (0) | 2021.04.05 |
[SpringBoot] destroy event 등록하기 (0) | 2021.04.05 |
[Spring Boot] 간단하게 @Scheduled 사용하기 (0) | 2021.03.31 |