본문 바로가기
스프링과 JPA 기반 웹 어플리케이션 개발/3부 개발 환경 설정

45. HTML 이메일 전송하기

by Backchus 2020. 4. 23.

HtmlEmailService 설정 변경

package me.weekbelt.studyolle.mail;

@Slf4j
@RequiredArgsConstructor
@Profile("dev")
@Component
public class HtmlEmailService implements EmailService{

    private final JavaMailSender javaMailSender;

    @Override
    public void sendEmail(EmailMessage emailMessage) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            // ......
            mimeMessageHelper.setText(emailMessage.getMessage(), true); // 수정
            javaMailSender.send(mimeMessage);
            log.info("sent email: {}", emailMessage.getMessage());
        } catch (MessagingException e) {
            log.error("failed to send email", e);
        }
    }
}

 

타임리프 템플릿으로 이메일 템플릿 생성(mail/simple-link.html)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>스터디올래</title>
</head>
<body class="bg-light">
<div>
    <p class="lead">안녕하세요. <span th:text="${nickname}"></span>님</p>

    <h2 th:text="${message}">메시지</h2>

    <div>
        <a th:href="${host + link}" th:text="${linkName}">link name</a>
        <p>링크를 동작하지 않는다면 URL 복사해서 사용하는 웹 브라우저에 붙여넣으세요.</p>
        <small th:text="${host + link}"></small>
    </div>
</div>
<footer>
    <small class="d-block mb-3 text-muted">스터디올래&copy; 2020</small>
</footer>
</body>
</html>

 

로컬환경에서의 URL사용을 위해 애플리케이션 설정 추가

  • application.properties에 AppProperties 추가
// ....

app.host=http://localhost:8080

 

이렇게 설정한 URL을 받아오기 위해 AppProperties 생성

package me.weekbelt.studyolle.config;

@Data
@Component
@ConfigurationProperties("app")
public class AppProperties {

    private String host;
}

 

템플릿 엔진으로 HTML 본문 채워 넣기

  • TemplateEngine
  • Context
package me.weekbelt.studyolle.account;

@Slf4j
@Transactional
@RequiredArgsConstructor
@Service
public class AccountService implements UserDetailsService {

    // .........
    
    private final TemplateEngine templateEngine;
    private final AppProperties appProperties;

    // ........

    public void sendSignUpConfirmEmail(Account newAccount) throws MessagingException {
        // model이랑 비슷한 느낌
        Context context = new Context();
        context.setVariable("link", "/check-email-token?token=" +
                newAccount.getEmailCheckToken() + "&email=" + newAccount.getEmail());
        context.setVariable("nickname", newAccount.getNickname());
        context.setVariable("linkName", "이메일 인증하기");
        context.setVariable("message", "스터디올래 서비스를 사용하려면 링크를 클릭하세요.");
        context.setVariable("host", appProperties.getHost());

        // mail/simple-link.html을 String타입으로 생성
        String message = templateEngine.process("mail/simple-link", context);

        EmailMessage emailMessage = EmailMessage.builder()
                .to(newAccount.getEmail())
                .subject("스터디올래, 회원 가입 인증")
                .message(message)
                .build();

        emailService.sendEmail(emailMessage);
    }

    // ........
    
    public void sendLoginLink(Account account) {
        // model이랑 비슷한 느낌
        Context context = new Context();
        context.setVariable("link", "/login-by-email?token=" + account.getEmailCheckToken() +
                "&email=" + account.getEmail());
        context.setVariable("nickname", account.getNickname());
        context.setVariable("linkName", "스터디올래 로그인하기");
        context.setVariable("message", "로그인하려면 아래 링크를 클릭하세요.");
        context.setVariable("host", appProperties.getHost());

        // mail/simple-link.html을 String타입으로 생성
        String message = templateEngine.process("mail/simple-link", context);

        account.generateEmailCheckToken();
        EmailMessage emailMessage = EmailMessage.builder()
                .to(account.getEmail())
                .subject("스터디올래, 로그인 링크")
                .message(message)
                .build();

        emailService.sendEmail(emailMessage);
    }

    // .........
}

 

참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1#

 

스프링과 JPA 기반 웹 애플리케이션 개발 - 인프런

이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습니다. 이 강좌를 충분히 학습한다면 여러분 만의 웹 서비스를 만들거나 취직에 도움이 될만한 포트폴리오를 만들 수 있을 겁니다. 활용 웹 개발 프레임워크 및 라이브러리 Java Spring Spring Boot Spring Data JPA Thymeleaf 온라인 강의 스

www.inflearn.com