
회원가입을 하면서 이메일 인증을 할 때,
유저에게 광고를 하거나 공지를 할 때,
유저에게 이메일을 보낼 필요성이 있다.
유저에게 이메일을 보내는 서비스는 어떻게 구현하고,
어떤 원리인지 알아보자.
Simple Message Transfer Protocol
protocol
서로간의 약속
ex) HTTP 프로토콜
SMTP는 메일을 전송하는 것까지만을 포함한다.
이메일을 받는 것은 POP3에 해당한다.
SMTP는 TCP 25번 포트를 사용한다.
보통의 이메일 주소는 위와 같을 것이다.
@을 중심으로 앞에는 아이디가,
뒤에는 도메인 주소가 나온다.
누군가 위의 이메일 주소로 이메일을 발신한다면,
먼저 자신의 도메인에 해당하는 메일서버에 전송을 한뒤,
naver 메일서버에 이메일이 전송된다.
// mail
implementation 'org.springframework.boot:spring-boot-starter-mail'
메일 서비스 의존성을 추가한다.
내가 구현하는 과정을 캡처하지 않아서 비슷하게 구현한 사람의 이메일을 첨부한다.
https://velog.io/@hyeri_hello/JavaSpring-SMTPEmail-%EB%B3%B4%EB%82%B4%EA%B8%B0
#mail
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=username
spring.mail.password=password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.timeout=5000
spring.mail.properties.mail.smtp.starttls.enable=true
sender.mail=kudongku@naver.com
포트는 보통 587을,
username과 비밀번호는 과정2에서 나온 값들을,
smtp의 세팅들은 그냥 그대로 해주면 된다.
@Slf4j(topic = "MailService")
@Service
@RequiredArgsConstructor
public class MailService {
@Value("${sender.mail}")
private String senderEmail;
private final JavaMailSender javaMailSender;
private final UserService userService;
public void sendMail(String sellerEmail, String sellerNickname, Long buyerId,
String t, Long price) {
if (buyerId == null) {
sendNoBuyerNotification(sellerEmail, sellerNickname, t);
} else {
sendSellerBuyerNotification(sellerEmail, sellerNickname, buyerId, t, price);
}
}
public void sendNoBuyerNotification(String sellerEmail, String sellerNickname, String t) {
String title = "땅땅땅! [" + t + "] 게시글의 경매가 종료되었습니다!";
String content =
sellerNickname + "님!"
+ "\n땅땅땅! [" + t + "] 게시글의 경매가 종료되었습니다!"
+ "\n아쉽게도 경매의 낙찰자가 없습니다."
+ "\n게시글을 다시 올려주세요!";
sendEmail(sellerEmail, title, content);
}
public void sendSellerBuyerNotification(String sellerEmail, String sellerNickname,
Long buyerId, String t, Long price) {
User buyer = userService.getUserByIdOrElseThrow(buyerId);
String sellerTitle = "땅땅땅! [" + t + "] 게시글의 경매가 종료되었습니다!";
String sellerContent =
sellerNickname + "님!"
+ "\n땅땅땅! [" + t + "] 게시글의 경매가 종료되었습니다!"
+ "\n낙찰가 : " + price + "원"
+ "\n낙찰자 : " + buyer.getNickname()
+ "\n지금 바로 접속해서 거래를 시작하세요!";
String buyerTitle = "땅땅땅! [" + t + "] 게시글에 낙찰되었습니다!";
String buyerContent =
buyer.getNickname() + "님 축하합니다!"
+ "\n땅땅땅! [" + t + "] 게시글에 낙찰되었습니다!"
+ "\n낙찰가 : " + price + "원"
+ "\n지금 바로 접속해서 거래를 시작하세요!";
sendEmail(sellerEmail, sellerTitle, sellerContent);
sendEmail(buyer.getEmail(), buyerTitle, buyerContent);
}
public void sendEmail(String recipientEmail, String subject, String text) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(recipientEmail);
message.setFrom(senderEmail);
message.setSubject(subject);
message.setText(text);
javaMailSender.send(message);
}
}
위 코드에서 중요한 코드는
public void sendEmail(String recipientEmail, String subject, String text) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(recipientEmail);
message.setFrom(senderEmail);
message.setSubject(subject);
message.setText(text);
javaMailSender.send(message);
}
이부분이다.
제목 수신자 발신자 내용을 설정해서
javaMailSender에게 보내면 된다.