만들어가는 세상

[SPRINGBOOT] SPRING BOOT &GRADLE Google SMTP EMAIL 서버 전송 로직입니다. 본문

IT/SPRING

[SPRINGBOOT] SPRING BOOT &GRADLE Google SMTP EMAIL 서버 전송 로직입니다.

윤재웅 2019. 11. 8. 10:21

[SPRINGBOOT] SPRING BOOT&GRADLE Google SMTP EMAIL 서버 전송 로직입니다.

우선 SMTP TEST를 위해 Google 계정과 \[Google에서 계정 엑세스 권한을 가진앱\] 보안 수준이 낮은 앱 허용: 사용으로 변경 합니다. 나의 Google 계정만 있으면 됩니다.

build.gradle 에서 dependencies 합니다.

compile('org.springframework.boot:spring-boot-starter-mail')

application.yml 여기에서는 로컬, 개발, 운영 서버 기준으로 동적 SMTP 주소값이 할당되기 떄문에 아래와 같이 처리합니다.

---
spring:
  profiles: dev
system:
  email-host: smtp.gmail.com
  email-port: 587
  email-id: id
  email-pw: pw
---
spring:
  profiles: prod
system:
  email-host: smtp.gmail.com
  email-port: 587
  email-id: id
  email-pw: pwd  
 ---
spring:
  profiles: test
system:
  email-host: smtp.gmail.com
  email-port: 587
  email-id: id
  email-pw: pwd

SystemProperties.java 동적 프로퍼티값을 JAVA파일로 선언합니다.

@Data
@ConfigurationProperties("system")
@Component
public class SystemProperties {
    private String emailHost;
    private int emailPort;
    private String emailId;
    private String emailPw;
}

MailSenderConfig.java 메일발송 준비를 위해 아래와같이 로직 처리를 합니다. 이제 동적 프로퍼티값이 메일 전송 준비를 합니다.

@Configuration
public class MailSenderConfig {

    @Autowired
    public SystemProperties systemProperties;

    public JavaMailSenderImpl getJavaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost(systemProperties.getEmailHost());
        mailSender.setPort(systemProperties.getEmailPort());

        mailSender.setUsername(systemProperties.getEmailId());
        mailSender.setPassword(systemProperties.getEmailPw());

        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.debug", "true");

        return mailSender;
    }
}

EmailService.java 메일전송을 하는 서비스 로직 입니다.

@Service
@Slf4j
public class EmailService {
    @Autowired
    private MailSenderConfig mailSender;

    public void sendEmail(Email email) {
        MimeMessagePreparator messagePreparator = mimeMessage -> {
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");

            messageHelper.setFrom(email.getFromEmail());
            messageHelper.setTo(InternetAddress.parse(email.getToEmail()));
            messageHelper.setSubject(email.getSubject());
            messageHelper.setText(email.getContent(),true);
        };
        try {
            mailSender.getJavaMailSender().send(messagePreparator);
        } catch (MailException e) {
            log.error(e.getMessage());
        }
    }
}
InternetAddress.parse()
여러사람에게 메일을 보낼수 있도록 처리하는 메소드 입니다.
예) gos1004 <gos1004@email.com>,gos1005 <gos1004@email.com>,gos1006 <gos1004@email.com>

messageHelper.setText(email.getContent(),true);
에디터를 사용할 경우 HTML 형식 포맷을 처리를 할 경우 true 를 사용하면 됩니다.

메일 형식을 gos1004@email.com 이렇게 보낼수 있지만 id <gos1004@email.com> 이런식으로도 보낼수 있습니다.

SimpleMailMessage 객체를 사용하는 방법도 있지만 여러 옵션을 고려해야기때문에 MimeMessageHelper 객체를사용 하였습니다.

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;

@Component
public class EmailService {

    @Autowired
    public JavaMailSender emailSender;

    public void sendEmail(
      String to, String subject, String text) {
        ...
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(text);
        emailSender.send(message);
        ...
    }
}
Comments