본문 바로가기

IT/Spring

[SpringBoot] 이메일 전송 (Gmail SMTP Server)

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