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);
...
}
}