0. 메일을 보내보자!

웹페이지 방문시 많이 사용되는 서비스인 Contact us 와 같은 페이지 구성의 포폴 추가를 위해 메일 기능을 추가했다.

많은 시행착오가 있었어서 다시 정리하면서 기억해둬야 겠다.


 

1. thymeleaf 를 이용한 mail 전송처리하기

mail 전송처리하기를 하면서 정말 많은 에러가 있었는데, 문제의 원인을 다른 곳에서 찾고 있었던 것이 많은 시간을 소비하게 만들었다. 발생했던 에러에 대해서는 아래 구분선 이하에 작성해두었다. 여기서는 기본적인 mail 전송 처리에 대해 알아보자!


1-1. 의존성 추가

세팅 환경이 gradle인 관계로 mail 관련 라이브러리 추가를 위해 .gradle에 아래 코드와 같이 의존성을 추가했다.

starter-mail : 스프링에서 제공하는 자바 메일과 스프링 프레임워크 메일 전송 기능을 위해 추가하는 라이브러리이다.

 

(구글링을 하면, spring-boot-starter-data-jpa 와 security 라이브러리를 추가할 것을 설명하고 있는데 만들고자하는 포폴에는 별도 DB 저장 없이 단순 전송기능만을 필요로 하기 때문에 jpa 의존성을 추가하지 않았다. security 라이브러리 관련해서 여러가지 이하 에러 사항이 있어서 추가하지 않았다.)

 


1-2. application 설정

메일 전송을 위해 설정을 해주는데 properties 파일은 개인 정보 보호를 위해 gitignore 설정을 해주자! 그리고 아래 사진에서 메일전송을 하는 계정의 주소와 비밀번호를 입력해준다. 입력될 계정은 gmail 계정 보안등급을 낮춰야 메일 전송이 가능하다.

 

아래 host 설정은 stmp.googlemail.com으로 해보면 이하 3-5. 에러를 방지할 수 있다! 주의하기

 

 


1-3. 메일 구성방식 설정하기

메일을 보내는 방식에 따라 이미 정해진 텍스트나 임시비밀번호를 만들어서 html 파일에 적용해서 보낼 수도 있을 것이고, 메일 내용을 사용자가 입력하는 것에 따라 달라지는 경우에는 th:name으로 해당 내용을 받아와야 할 것이다.

thymeleaf를 사용하면서 이런 점이 일반적인 form submit 형식과 약간의 차이가 있었는데 아래 사진을 참고하면 도움이 될 것 같다.

 

html 파일에서 아래와 같이 th:name 으로 input 값을 설정해주어야 하고, input 값을 form 태그로 둘러싸고 있어서 파라미터 값을 Controller 단으로 전달할 수 있다.

 

 

이번 포폴에서는 고정된 값은 application에서 설정한 메일 전송 계정 외에는 없고, 사용자 입력사항을 받아와야 했다. 일반적인 contact us form 구글 이미지를 참고하면 알 수 있다. 그래서 메일 전송을 위해 별도의 html 파일은 만들지 않았고, form이 Post 방식일 경우에 파라미터 값을 받아올 수 있도록 했다.

 

th:name 으로 뷰단에서 받아온 값은 @RequestParam("키값")으로 받아올 수 있다.

여기에서는 메일보내는 사람의 주소, 메일제목, 내용을 받아오고 전송 후에 mainPage 단으로 다시 돌아갈 수 있도록 ModelAndView를 추가해주었다.

 


1-4. 메일 전송로직 작성하기

구글을 보면 MainController 파일 외에 service 단이나 별도 Control 기능을 수행하는 java 파일을 생성해둔 것을 볼 수 있었다. 사실 그게 맞는 작성이고, 여러 기능을 가진 웹페이지라면 필요한 구성이라고 생각한다. 하지만 이번 웹사이트는  mail 전송 밖에 기능이 없어서 일단 MainController 단에 MailSender 기능을 주고, @Autowired 어노테이션을 추가해주었다.

 

 

 


 

2. 메일 전송된 모습

 


 

+ 에러를 해결해보자 ;)

 

| [intellij] Gradle 사용시 No candidates found for method call plugins. 오류 해결방법

| IntelliJ cannot resolve symbol.. 에러 해결

| SPRING.JPA.OPEN-IN-VIEW 로그 오류 해결하기

| What is this spring.jpa.open-in-view=true property in Spring Boot?

| tomcat7.x JAVA_OPTS 설정 및 User설정

| 톰캣 구동 오류

| Spring Boot 시작시 /dev/./urandom을 사용하는 이유

| Tomcat 구동 시 /dev/urandom 블로킹 이슈(지연시작 문제)

| [Spring] Spring Boot + Gradle + Security 를 이용한 로그인/로그아웃 구현 - 1편

| Spring Security?

| Java Mail Exception Error;


 

3-1. 라이브러리가 반영문제

의존성 라이브러리를 추가하고 삭제하는 과정에서 intelliJ가 반영을 제대로 하지 못하는 경우가 있다. 서버를 재연결해도 문제가 똑같다면! 

File > Invalidate Caches / Restart 를 통해 캐시를 삭제하고 재시작해보자. 이렇게 해서 막힌 경우가 3번 있었는데 모두 해결됐다!


3-2. 로그오류

aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning

 

이런 에러가 발생한다면 spring.jpa.open-in-view 설정을 true 에서 false로 바꿔주자!

application.propertiest에 spring.jpa.open-in-view=false 라는 코드를 추가해준다. 이렇게 해서 해결!


3-3. 톰캣 구동 오류

Creation of SecureRandom instance for session ID generation using \[​SHA1PRNG\] took \[xxxxxxx] milliseconds.

응답시간이 길어져서 문제가 생기는 것이었다. 

 

 

구글에 나온 방법들이 리눅스와 윈도우 차이가 있음으로 유의해야 한다.

 

리눅스는 아파치 설치 경로에서 (내 컴퓨터에서는 C:\apache-tomcat-8.5.63\bin) catalina.sh 파일을 변경하는 것을 방법으로 제시하고 있다. 

JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"

윈도우 환경에서는 환경변수를 아래와 같이 추가한다.

변수 이름(N) : JAVA_OPTS
변수 값(V)   : %JAVA_OPTS% -Djava.security.egd=file:/dev/./urandom

 

이 방법도 되지 않으면, java.security 파일 추가 및 수정하는 방법을 시도해보자! (참조)


3-4. 로그인 화면 없애기

의존성 라이브러리 중 starter-security 에 의한 것으로 스프링에서 중복 로그인 등 보안을 위해 설정된 화면이다. 이번 포폴에서는 필요하지 않기 때문에 의존성 라이브러리를 제거해주었다.

 


 

3-5. UnknownHostException

진짜 별의별 방법을 다해본 것 같다. port도 변경해보고 application.properties 설정도 변경해보고, google 메일 보안수준도 변경해보고 다했는데!! 문제는 다른 곳에 있었다.

stackoverflow의 내용을 보고 해결할 수 있었다.

기존에 application.properties 설정을 spring.mail.host=smtp.mail.com로 했었는데, spring.mail.host=smtp.googlemail.com로 변경하니 해결됐다! 생각해보니 기존에 Maven 프로젝트 때도 gmail.com으로 했었는데, 더 자세히 살피면서 코딩해야겠다.

 


| [SpringBoot] Thymeleaf를 이용한 이메일 전송
| org.springframework.boot:spring-boot-starter-mail:

| 06. 스프링 부트 (Spring Boot) - 자바 메일 센더 (Java Mail Sender)

| Spring Boot 메일 전송: Spring Boot 2, Mail, Thymeleaf

| [Spring-Boot] JavaMailSender에 대하여

| Spring boot로 JPA-Hibernate 셋팅(1편)

| SpringBoot: JavaMailSender를 이용한 메일전송 설정

| 26. [springboot] Thymeleaf 값 전달방법 기초

| thymeleaf로 HTML 에서 Spring boot 서버단으로 값 전달하는 세가지 방법

| [spring boot 2.0]thymeleaf 템플릿을 이용한 이메일 전송

 

 

댓글