JavaMailSender

황상익·2024년 8월 19일

JavaMailSender란??

SpringFrameWork에서 이메일을 보낼때 사용하는 인터페이스

-- 주요기능
간단한 텍스트 이메일 전송
HTML 이메일 전송
첨부파일 포함 이메일 전송
이메일 헤더 설정 (수신자, 발신자, 제목 등)

-- 사용방법
의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-mail'

application.properties에는

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=your-email@gmail.com
spring.mail.password=your-email-password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
  1. spring.mail.host=smtp.gmail.com
    이메일을 전송할 때 사용할 SMTP 서비스 호스트 주소를 지정
    smtp.gmail.com -> Gmail의 SMTP 서버를 사용한다는 의미
  • SMTP란?? 이메일을 전송하기 위한 표준 통신 프로토콜
  1. spring.mail.port=587
    SMTP 서버와 통신할때 사용한 포트 번호
    587: 이 포트는 일반적으로 SMTP 서버와의 연결에 STARTTLS(TLS 보안 프로토콜을 통한 암호화) 옵션을 사용하는 경우 사용
    다른 포트 옵션으로는 465(SSL/TLS를 사용하는 포트)가 있으며, 이는 SSL 암호화 연결을 사용하는 경우.

  2. spring.mail.username=your-email@gmail.com
    SMTP 서버에 연결할 때 사용할 이메일 주소
    your-email@gmail.com: Gmail 계정의 이메일 주소를 의미합니다. 이 이메일 주소는 실제로 이메일을 전송하는 데 사용, 이메일의 발신자 주소

  3. spring.mail.password=your-email-password
    SMTP 서버에 인증할 때 사용할 비밀번호를 지정
    애플리케이션이 SMTP 서버에 로그인하여 이메일을 전송할 수 있도록 인증
    비밀번호를 코드에 직접 넣지 않고, 환경 변수나 외부 설정 파일을 통해 안전하게 관리하는 것이 좋음

  4. spring.mail.properties.mail.smtp.auth=true
    SMTP 서버와 통신할 때 인증을 요구하는지 여부를 설정
    대부분의 SMTP 서버는 인증을 필요

  5. spring.mail.properties.mail.smtp.starttls.enable=true
    STARTTLS를 사용할지 여부를 설정
    true: SMTP 서버와의 통신을 암호화하기 위해 STARTTLS를 활성화합니다. STARTTLS는 기본적으로 암호화되지 않은 연결을 암호화된 연결로 업그레이드하는 프로토콜

MimeMessage

객체를 생성할때 필요한 설정을 단순화.
이메일 본문, 첨부파일, 수신자, 발신자 등을 설정
JavaMail API에서 이메일 메시지를 나타내는 클래스. 이 클래스는 이메일 메시지의 내용을 구성하고 전송하는 데 사용. MimeMessage는 단순한 텍스트 이메일부터 멀티파트(MIME) 이메일(예: HTML 본문, 첨부 파일 등)까지 다양한 형식의 이메일을 지원

주요 메서드

setTo(String to): 이메일 수신자의 주소를 설정합니다.

예: helper.setTo("recipient@example.com");
setCc(String cc) 및 setBcc(String bcc): 참조(cc)와 숨은 참조(bcc) 수신자를 설정합니다.

예: helper.setCc("cc@example.com");
예: helper.setBcc("bcc@example.com");
setSubject(String subject): 이메일의 제목을 설정합니다.

예: helper.setSubject("This is the subject");
setText(String text, boolean html): 이메일의 본문을 설정합니다. 두 번째 인자는 본문이 HTML 형식인지 여부를 지정합니다.

예: helper.setText("<h1>HTML Content</h1>", true); (HTML 본문)
예: helper.setText("Plain text content", false); (텍스트 본문)
setFrom(String from): 이메일 발신자의 주소를 설정합니다.

예: helper.setFrom("noreply@example.com");
addAttachment(String attachmentFilename, File file): 이메일에 첨부 파일을 추가합니다.

예: helper.addAttachment("invoice.pdf", new File("/path/to/invoice.pdf"));
addInline(String contentId, Resource resource): 이메일 본문에 이미지와 같은 인라인 리소스를 추가합니다.

예: helper.addInline("logo.png", new ClassPathResource("/images/logo.png"));

내가 작성한 code

@Service
@RequiredArgsConstructor
public class NotificationServiceImpl implements NotificationService{

    private final JavaMailSender mailSender;

    @Override
    public void sendLowStockAlert(Item item) {
        String to = "hwangsangik@gmail.com";
        String subject = "Low Stock Alert: " + item.getItemName();
        String body = "The stock for Item" + item.getItemName() + "is Low. Current Stock: " + item.getStock();

        sendEmailNotification(to, subject, body);
    }

    @Override
    public void sendEmailNotification(String to, String subject, String body) {

        //이메일 메시지 내용을 구성, 전송
        MimeMessage message = mailSender.createMimeMessage();

        //이메일을 생성하고 관리하는데 사용되는 MimeMessage를 쉽게 다룰 수 있도록 도와줌
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(body, true);

            mailSender.send(message);
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    public void sendSmsNotification(String phoneNumber, String message) {
        /**
         * ToDo : SMS API 가져온뒤 사용
         */
    }
}
profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글