SNYUNG.COM

[Spring] 이메일 보내기(smtp)

January 02, 2018

메일 보내기를 해보자!! 웹에서 메일 가져오기를 쓸일이 있을까? 라는 생각을 하지만 필요한 곳도 있겠지... 사내 웹페이지 같은? 그래도 나는 메일 보내기를 먼저 해보려고 합니다..

크게 주제는 3개입니다.

  • 단순 메시지 보내기(텍스트)
  • 파일첨부해서 보내기
  • 이미지 추가해서 보내기
  • 추후 추가 가능성 있습니다.(가령 난수생성해서 보내기_임시비밀번호 보내기)

단순 메시지 보내기(텍스트)

단순한 텍스트를 보내는 것은 쉬울 것이라는 생각에 금방 끝내자 했는데 찾는데 마다 말이 다르고 파일구조가 다르니까 따라하기가 힘듭니다.....
이 역시 제 방식으로 합니다. 간단하게 수정해야 할 파일은 3군데 입니다.

  • pom.xml(Java Mail API추가_javax.mail)
  • dispatcher-servlet.xml(bean추가)
  • controller 추가

1. pom.xml

메일과 관련된 API가 2~3개가 보였는데, 이게 가장 심플해 보여서 javax로 진행하였습니다.

  <!-- Java Mail API -->
  <dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.3</version>
  </dependency>

2. dispatcher-servlet.xml(bean추가)

대표적인 메일 3개를 가지고 모두 해보았습니다.

  • Gmail (TSL)
  • Naver (SSL)
  • Daum (SSL)

2.1. Gmail(제일 간단하게 해결)

역시 구글이었습니다. 제일 심플하고 쉽게 되어있습니다.

  <!-- Gmail -->
  <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="smtp.gmail.com" />
    <property name="port" value="587" />
    <property name="username" value="{{사용자 아이디}}@gmail.com" />
    <property name="password" value="{{비밀번호}}" />
    <property name="javaMailProperties">
    <props>
      <prop key="mail.smtp.auth">true</prop>
      <prop key="mail.smtp.starttls.enable">true</prop>
    </props>
    </property>
  </bean>
  • 대략적으로 보시면 이해가 되실거라 생각됩니다.

2.2. Naver(네이버)

네이버에서는 SSL을 추가하지 않을 경우 전송이 안되더라고요. 이거 때문에 30분 삽질했습니다....

  <!-- naver mail -->
  <bean class="org.springframework.mail.javamail.JavaMailSenderImpl"
    p:host="smtp.naver.com"
    p:port="465"
    p:username="{{아이디만}}"
    p:password="{{비밀번호}}">
    <property name="javaMailProperties">
    <props>
      <prop key="mail.smtp.starttls.enable">true</prop>
      <prop key="mail.smtp.auth">true</prop>
      <prop key="mail.smtps.ssl.checkserveridentity">true</prop>
      <prop key="mail.smtps.ssl.trust">*</prop>
      <prop key="mail.debug">true</prop>
      <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
    </props>
    </property>
  </bean>
  • 여기서 주의사항은 username에는 아이디만 적으면 됩니다.
  • 포트 번호도 확인해주세요
  • 추가적으로 <prop key="mail.smtp.socketFactory.class"> javax.net.ssl.SSLSocketFactory </prop> 를 적어주지 않으면 전송이 안되네요

2.3. Daum(다음카카오)

네이버와 비슷하다고 생각했는데 역시나 입니다.

  <!-- Daum mail -->
  <bean class="org.springframework.mail.javamail.JavaMailSenderImpl"
    p:host="smtp.daum.net"
    p:port="465"
    p:username="{{아이디명}}@hanmail.net"
    p:password="{{비밀번호}}">
    <property name="javaMailProperties">
    <props>
      <prop key="mail.smtp.starttls.enable">true</prop>
      <prop key="mail.smtp.auth">true</prop>
      <prop key="mail.smtps.ssl.checkserveridentity">true</prop>
      <prop key="mail.smtps.ssl.trust">*</prop>
      <prop key="mail.debug">true</prop>
      <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
      </props>
    </property>
  </bean>
  • 다른점이 있다면 아이디를 적는 공간이 다릅니다.

보안 설정하기

모든 SMTP를 사용하기 위해서는 보안을 풀어주어야 합니다.


3. 컨트롤러 생성하기

이제는 진짜 메일을 보내기 위한 컨트롤러 입니다. DAO나 VO로 따로 빼서 관리를 할 수 있지만 이번에는 한곳에 두겠습니다.

import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MailController {

	@Autowired
	private JavaMailSender mailSender;

	// mailSending 코드
	@RequestMapping(value = "mailSending.do")
	public String mailSending(HttpServletRequest request) {

		String setfrom = "{{아이디명하고 똑같아야합니다.}}";
		String tomail = request.getParameter("tomail"); // 받는 사람 이메일
		String title = request.getParameter("title"); // 제목
		String content = request.getParameter("content"); // 내용

		try {
			MimeMessage message = mailSender.createMimeMessage();
			MimeMessageHelper messageHelper = new MimeMessageHelper(message,
					true, "UTF-8");

			messageHelper.setFrom(setfrom); // 보내는사람 생략하면 정상작동을 안함
			messageHelper.setTo(tomail); // 받는사람 이메일
			messageHelper.setSubject(title); // 메일제목은 생략이 가능하다
			messageHelper.setText(content); // 메일 내용

			mailSender.send(message);
		} catch (Exception e) {
			System.out.println(e);
		}

		return "main/main.tiles";
	}
}
  • 크게는 4개의 정보가 들어갑니다.(보내는사람, 받는사람, 제목, 내용)
  • 이렇게 3개의 파일을 수정하면 완료가 됩니다. 이제 보내는 페이지에서 클릭시 전송을 해주면됩니다.

4. 메일 보내기 페이지

단순히 보내는사람, 제목, 내용만 적어주고 버튼을 눌러주면 보내지는 페이지입니다.

  <h4>메일 보내기</h4>
    <form action="mailSending.do" method="post">
      <div>
        <input type="text" name="tomail" size="120"
        style="width: 100%" placeholder="상대의 이메일"
        class="form-control">
      </div>
      <div align="center">
        <!-- 제목 -->
        <input type="text" name="title" size="120"
        style="width: 100%" placeholder="제목을 입력해주세요"
        class="form-control">
      </div>
        <p>
          <div align="center">
          <!-- 내용 -->
            <textarea name="content" cols="120" rows="12"
            style="width: 100%; resize: none" placeholder="내용#"
            class="form-control"></textarea>
          </div>
        <p>
      <div align="center">
        <input type="submit" value="메일 보내기" class="btn btn-warning">
      </div>
    </form>

2. 파일첨부해서 보내기

너무 나도 간단하게 첨부는 가능하지만 다른 문제가 있는 파일 첨부

  @Controller
  public class MailController {

	@Autowired
	private JavaMailSender mailSender;

	// mailSending 코드
	@RequestMapping(value = "mailSending.do")
	public String mailSending(HttpServletRequest request, MultipartHttpServletRequest multi) {


		String setfrom = "{{메일주소}}";
		String tomail = request.getParameter("tomail"); // 받는 사람 이메일
		String title = request.getParameter("title"); // 제목
		String content = request.getParameter("content"); // 내용
        // 여기가 추가
		String filename =  request.getParameter("submitFile");

		try {
			MimeMessage message = mailSender.createMimeMessage();
			MimeMessageHelper messageHelper = new MimeMessageHelper(message,
					true, "UTF-8");

			messageHelper.setFrom(setfrom); // 보내는사람 생략하거나 하면 정상작동을 안함
			messageHelper.setTo(tomail); // 받는사람 이메일
			messageHelper.setSubject(title); // 메일제목은 생략이 가능하다
			messageHelper.setText(content); // 메일 내용


			// 여기가 추가
			FileSystemResource fsr = new FileSystemResource({{파일경로}});
		    messageHelper.addAttachment(filename, fsr);

			mailSender.send(message);
		} catch (Exception e) {
			System.out.println(e);
		}

		return "redirect:/main.do";
	}
}
  • 제일 중요한건 저 파일 경로다....
  • 자바스크립트로는 보안상 경로자체를 가져올수 없다.
  • 파일업로드하듯이 가져와야 할 것 같다.

3. 이미지 추가해서 보내기

진짜 단순히 img 태그를 추가하는 방법이다. 결국 이미지는 이미지 태그를 추가해서 이미지 경로를 써주는 되는거였다....

  String contents = content + "<img src=\"https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/module/1590/3428.jpg\">";
  messageHelper.setText(contents, true);
  • 스프링과는 맞지 않는 앵귤러 사진입니다.
#Spring

😍 개발문화 만들기 | 설계 | 생산성 | 도전
🏛 @Im-D @callbus