[MeU] JavaMailSender 를 이용해 SMTP 기능 구현하기

sorzzzzy·2022년 4월 11일
0

Spring Project

목록 보기
18/18
post-thumbnail

프로젝트 페이지 중 Contact 페이지가 있었다.
이 기능을 어떻게 구현할 지 고민하다 Phone number 필드를 Email 필드로 바꿔,
입력한 Email로 안내 메일을 보내기로 했다.

SMTP를 사용해서!!!!!!!!!

이 포스팅에서는 Naver 메일을 사용했다.


네이버 환경설정

네이버 로그인을 한 후 메일 에 들어가 하단을 보면 환경설정 이 보인다.

POP3/IMAP 설정 탭에 들어가 POP3/SMTP 사용사용함 으로 체크하고 저장한다.


설정을 저장하면 위와 같이 정보가 뜨는데 우리는 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
.
.

SMTP 서비스 구현

✔️ 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 페이지에서 사용자의 닉네임(자유롭게 가능)과 답장을 받을 개인 메일 주소, 문의글 내용을 입력한다.


문의글 작성에 성공하면 위와 같은 알림창이 뜬다.



메일함을 확인해보면 위와 같이 문의글에 대한 메일 답장이 와있는 것을 볼 수 있다!
성~공🥳

profile
Backend Developer

0개의 댓글