프로젝트 페이지 중 Contact 페이지가 있었다.
이 기능을 어떻게 구현할 지 고민하다 Phone number
필드를 Email
필드로 바꿔,
입력한 Email로 안내 메일을 보내기로 했다.
SMTP를 사용해서!!!!!!!!!
이 포스팅에서는 Naver 메일을 사용했다.
네이버 로그인을 한 후 메일
에 들어가 하단을 보면 환경설정
이 보인다.
POP3/IMAP 설정
탭에 들어가 POP3/SMTP 사용
을 사용함
으로 체크하고 저장한다.
설정을 저장하면 위와 같이 정보가 뜨는데 우리는 SMTP 를 사용하기 때문에 SMTP 포트만 기억하면 된다.
✔️ pom.xml
.
.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
.
.
✔️ application.properties
.
.
spring.mail.host=smtp.naver.com
spring.mail.port={포트번호}
spring.mail.username={네이버 메일}
spring.mail.password={네이버 비밀번호}
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.ssl.trust=smtp.naver.com
spring.mail.properties.mail.smtp.starttls.enable=true
.
.
✔️ vo/Contact.java
@AllArgsConstructor
@Getter @Setter
public class Contact {
Integer contactId;
String username;
String email;
String content;
Date createdAt;
public Contact(Integer contactId, String username, String email, String content) {
this.contactId = contactId;
this.username = username;
this.email = email;
this.content = content;
}
}
테이블을 바탕으로 객체를 생성한다.
✔️ controller/dto/ContactRequestDto
, ContactResponseDto
@Getter @Setter
public class ContactRequestDto {
Integer contactId;
String username;
String email;
String content;
public Contact getContact() {
return new Contact(this.contactId, this.username, this.email, this.content);
}
}
@Getter
public class ContactResponseDto {
Integer contactId;
String username;
String email;
String content;
public ContactResponseDto(Contact contact) {
this.contactId = contact.getContactId();
this.username = contact.getUsername();
this.email = contact.getEmail();
this.content = contact.getContent();
}
}
✔️ mapper/ContactMapper.java
@Mapper
public interface ContactMapper {
Integer saveContact(@Param("contact") Contact contact);
}
사용자들이 작성한 문의글을 저장한다.
파라미터는 Contact
객체이고, 반환값은 Integer
이다.
✔️ resources/static/custom.js
$("#submitButton").click(function(){
var username = $("#name").val();
var email = $("#phone").val();
var content = $("#message").val();
$.ajax({
method: "POST",
url: "/contact",
data: JSON.stringify({
"username": username,
"email": email,
"content": content
}),
contentType: "application/json",
success: function(data){
console.log("success!");
alert("문의글 작성 성공! 메일을 확인해주세요.");
window.location.href = '/';
},
err: function (err){
alert("문의글 작성 실패!");
return false;
}
})
});
✔️ controller/ContactController.java
@Slf4j
@RestController
@AllArgsConstructor
public class ContactController {
private ContactService contactService;
@PostMapping("/contact")
public ResponseEntity<String> saveContact(@RequestBody ContactRequestDto contactDto) {
Contact contact = contactDto.getContact();
contactService.sendContactEmail(contact);
return ResponseEntity.status(HttpStatus.OK).body("success");
}
}
✔️ service/ContactService.java
@Service
public class ContactService {
private final JavaMailSender mailSender;
private ContactMapper contactMapper;
public ContactService(JavaMailSender javaMailSender, ContactMapper contactMapper) {
this.mailSender = javaMailSender;
this.contactMapper = contactMapper;
}
@Value("${spring.mail.username}")
private String sender;
public boolean sendContactEmail(Contact contact) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(contact.getEmail());
message.setFrom(sender);
message.setSubject("Hello " + contact.getUsername() + "! This is MeU.");
message.setText("Hello " + contact.getUsername() + "! This is MeU.\n\n" +
"We checked the inquiry email from " + contact.getUsername() + ".\n\n" +
"---------------------Your Contact Message-------------------\n" +
contact.getContent() + "\n" +
"----------------------------------------------------------------------\n\n" +
"We will send you a reply email within 3 days regarding the related matters.\n" +
"Thank you for using MeU.\nHave a nice day!");
mailSender.send(message);
Integer result = contactMapper.saveContact(contact);
return result == 1;
}
}
SimpleMailMessage
를 이용해 message
라는 새로운 객체를 생성한 뒤,
message.setTo
: 보내는 사람(=설정 파일의 메일)message.setFrom
: 받는 사람(=폼에 작성한 메일)message.setSubject
: 메일 제목message.setText
: 메일 내용mailSender
에 객체를 넣어 보낸다.
✔️ resources/mybatis/mapper/contact-mapper.xml
<mapper namespace="com.codepresso.meu.mapper.ContactMapper">
<insert id="saveContact">
INSERT INTO Contact(contactId, username, email, content)
VALUES (#{contact.contactId}, #{contact.username}, #{contact.email}, #{contact.content});
</insert>
</mapper>
✔️ controller/IndexController.java
수정
.
.
.
// Contact Page
@RequestMapping(value = "/contact")
public String getContactPage() {
return "contact";
}
Contact 페이지에서 사용자의 닉네임(자유롭게 가능)과 답장을 받을 개인 메일 주소, 문의글 내용을 입력한다.
문의글 작성에 성공하면 위와 같은 알림창이 뜬다.
메일함을 확인해보면 위와 같이 문의글에 대한 메일 답장이 와있는 것을 볼 수 있다!
성~공🥳