Spring 웹상에서 메일 보내보기

2019-08-21

웹상에서 메일 보내보기

목차

  1. 설정
    -1 pom.xml
    -2 servlet-context
    -3 Controller
    -4 왜 MailSender 사용가능할까?
    -5 보낸사람이 다를 때?
  2. Java Mail API로 메일 작성하기
    -1 Java Mail API 란?
    -2 HTML 형식으로 보내기
    -3 파일 첨부하기





설정부터 해보자!

1. pom.xml에서 메일 설정

<!-- 메일 설정 시작 --> 
    <!-- javax.mail/mail -->
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${org.springframework-version}</version>
    </dependency> 



2. servlet-context 설정

<beans:bean id="mailSender"
		class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <beans:property name="host" value="smtp.gmail.com" />
    <beans:property name="port" value="587" /><!-- 465 or 25 -->
    <beans:property name="username" value="본인 이메일 계정" />
    <beans:property name="password" value="해당 계정의 비밀번호" />
    <beans:property name="defaultEncoding" value="utf-8" />
    <beans:property name="javaMailProperties">
        <beans:props>
            <beans:prop key="mail.transport.protocol">smtp</beans:prop>
            <beans:prop key="mail.smtp.auth">true</beans:prop>
            <beans:prop key="mail.smtp.starttls.enable">true</beans:prop>
            <beans:prop key="mail.debug">true</beans:prop>
        </beans:props>
    </beans:property>
</beans:bean>



3. Controller 작성

@Controller
public class MailSendController {
	@Autowired
	MailSender sender;
	
	@ResponseBody
	@RequestMapping("/mail/send")
	public String sendMail() {
		
		//메일내용설정해주기
		SimpleMailMessage message = new SimpleMailMessage();
		message.setTo("보내는사람 이메일~~");
		message.setSubject("hiiiiiiiiiiiii");
		message.setText("my first email to send a letter");
		message.setFrom("받는사람 이메일!!");
		
		sender.send(message);
		
		return "send OK";
	}
}



왜 MailSender를 사용할 수 있을까?

bean으로 설정된 mailSenderJavaMailSenderImpl 클래스임.
이 클래스는 JavaMailSender 인터페이스의 구현체. JavaMailSender를 살펴본다면,

public interface JavaMailSender extends MailSender {}

즉, MailSender를 상속받기 때문에 다형성이 가능하므로 컨트롤러에서 MailSender 클래스를 주입받을 수 있게 된다.



보낸사람을 설정해줬는데도 bean에서 설정한 메일주소로 보내지는 이유

google의 보안정책이 바뀌어서 설정된 계정으로만 보내짐.

google 계정을 쉽게 만들 수 있기도 하고, 이를 악용하여 악성코드를 보낼 수도 있기 때문인게 아닌가 싶다.





그러면 이제 Java Mail API로 메일을 작성해보자!

Java Mail API 가 뭐야?

  • 파일 첨부 또는 HTML로 구성되어 있는 경우 MimeMessage 이용
  • JavaMailSender 인터페이스는 MimeMessage 객체를 생성해주는 createMimeMessage() 메서드를 제공
  • 이 메서드가 리턴한 MimeMessage 객체를 이용해서 메시지를 구성한 뒤 메일 발송



1. HTML 형식으로 보내보기

@Autowired
JavaMailSender jmsender;


@ResponseBody
@RequestMapping("/mail/send/javamail")
public String sendJavaMailSender() {

    MimeMessage message = jmsender.createMimeMessage();
    try {
        //메일제목설정
        message.setSubject("[안내] 처음보내는 JAVAMAIL SENDER", "utf-8");

        //html메일내용
        String htmlStr = "<h1 style=\"color: lightblue;\">hi everyone~~</h1>"
                + "<a href=\"http://www.naver.com\">naver</a>";

        //내용설정 
        message.setText(htmlStr, "utf-8", "html");

        //TO 설정 
        message.addRecipient(RecipientType.TO, 
                             new InternetAddress("받는사람메일계정", "mand2 님", "utf-8"));

        jmsender.send(message);
    
    } catch (MessagingException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return "send OK";
}

setText 메서드: subtype을 설정해주지 않으면 그냥 다 전해짐,, 태그를 텍스트로 인식!

To설정에서 new InternetAddress를 사용하는 이유?
받는사람의 메일계정이 아닌 사용자 이름으로 보내줄 수 있음



2. 파일 첨부해서 보내보기

스프링이 제공하는 MimeMessageHelper 클래스를 사용

@RequestMapping("/mail/send/file")
@ResponseBody
public String sendFileAttach() {

    MimeMessage message = jmsender.createMimeMessage();

    try {
        MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");

        //title
        helper.setSubject("[info] file attatched");

        //content html
        String htmlStr = "<h1>file has been attatched."
            		+ "please download the file I send </h1>";

        //content setting
        helper.setText(htmlStr, true);

        //to
        helper.setTo(new InternetAddress("받는사람 메일주소", "만득이 님", "utf-8"));

        //create file instance + absolute root
        DataSource dataSource = new FileDataSource("절대경로루트");
        helper.addAttachment(MimeUtility.encodeText("파일이름", 
                                                    "utf-8", "B"), dataSource);
       	jmsender.send(message);

    } catch (MessagingException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return "send ok";
}

#1 MimeMessage 객체로 메세지생성

#2 MimeMessageHelper 객체 생성 ( 메세지객체, 파일유무, charset)

#3 메일 제목 설정

#4 내용 html 설정

#5 받는사람 설정

#6 보낼 파일 설정

​ 파일 위치
​ 파일이름 설정
​ - MimUtility 의 encodeText 메서드를 이용
​ - 파일이름(한글일 때) 설정

#7 해당 메세지 객체를 send 해주기