본문 바로가기
Java/study

spring 18강 이메일 보내기

by avvin 2019. 7. 3.

spring 18강 이메일 보내기



이메일 서비스 구축 방법


이메일 발송을 위해서는 메일 서버가 필요함


- 자체 구축  OR


- 포털사이트에서 제공하는 smtp(Simple Mail Transfer Protocol) server 활용 (제약 존재)


- gmail의 경우 : 내 계정 - 로그인 및 보안 - 기기 활동 및 보안관련 활동 - 보안 수준이 낮은 앱 허용 옵션을 사용으로 설정해야함




실습 예제


model.email. EmailDTO.java

service.email. EmailService / Imple.java

controller.email. EmailController.java


write.jsp




1. pom.xml에 라이브러리 추가 [ artifactId : mail  ( groupId : javax.mail ) ] //최신버전으로

1
2
3
4
5
6
7
8
9
10
11
<!-- 이메일 발송 관련 라이브러리 -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>
        <dependency> //추가(왜 하는진 설명X)
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>



Context Support는 애플리케이션 컨텍스트 컨테이너에서 사용되어지지만 자주 사용되지 않는 부가적인 기능들을 분리해 놓은 것이다. 캐쉬, 메일, 스케줄링, UI와 관련된 기능들이 포함되어 있다.

( 참고 : http://toby.epril.com/?p=623 )



2. root-context에 메일 발송을 위한 bean 등록/설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <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" />
        <property name="password" value="비밀번호" />
        <property name="javaMailProperties">
            <props>
                <prop key="mail.transport.protocol">smtp</prop>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">true</prop>
                <prop key="mail.debug">true</prop>
            </props>
        </property>
    </bean>



스프링에서 제공하는 JavaMailSenderImpl 클래스


email기능을 구현할 때 JavaMailSenderImpl  객체 사용을 위한 root-context에 설정

(root-context에 설정 하고말고는 뭘로 결정되는지...)


★★★

위 설정 코드를 대략적으로 풀어보자면 

JavaMailSenderImpl 타입의 mailSender 객체는  host, port, username, password, javaMailProperties 변수를 가지는데


javaMailProperties 는 mail.transport.protocol / smtp 등의 key / value 값을 가진다는 설정



사용 예시 더 살펴보기(참고) :  https://ddakker.tistory.com/167




admin_menu.jsp

<a href="${path}/email/write.do">이메일 발송</a> 



EmailDTO.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.example.spring02.model.email;
 
public class EmailDTO {
    private String senderName;
    private String senderMail;
    private String receiveMail;
    private String subject;
    private String message;
    //getter,setter,toString
    public String getSenderName() {
        return senderName;
    }
    public void setSenderName(String senderName) {
        this.senderName = senderName;
    }
    public String getSenderMail() {
        return senderMail;
    }
    public void setSenderMail(String senderMail) {
        this.senderMail = senderMail;
    }
    public String getReceiveMail() {
        return receiveMail;
    }
    public void setReceiveMail(String receiveMail) {
        this.receiveMail = receiveMail;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    @Override
    public String toString() {
        return "EmailDTO [senderName=" + senderName + ", senderMail=" + senderMail + ", receiveMail=" + receiveMail
                + ", subject=" + subject + ", message=" + message + "]";
    }
    
}
 
cs



EmailServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.example.spring02.service.email;
 
import javax.inject.Inject;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
 
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
 
import com.example.spring02.model.email.EmailDTO;
 
@Service //서비스 빈으로 등록
public class EmailServiceImpl implements EmailService {
 
    @Inject
    JavaMailSender mailSender; //root-context.xml에 설정한 bean
    
    @Override
    public void sendMail(EmailDTO dto) {
        try {
            //이메일 객체
            MimeMessage msg=mailSender.createMimeMessage();
            //받는 사람
            msg.addRecipient(RecipientType.TO, 
                    new InternetAddress(dto.getReceiveMail()));
            //보내는 사람(이메일주소+이름)
            msg.addFrom(new InternetAddress[] {
new InternetAddress(dto.getSenderMail(),dto.getSenderName())
            });
            //이메일 제목
            msg.setSubject(dto.getSubject(),"utf-8");
            //이메일 본문
            msg.setText(dto.getMessage(), "utf-8");
//html로 보낼 경우            
//            MimeMessage message = mailSender.createMimeMessage();
//            MimeMessageHelper helper 
//= new MimeMessageHelper(message, true);
//            helper.setTo("test@host.com");
//
//            helper.setText("<html><body><img src='cid:identifier1234'></body></html>", true);
            
            //이메일 보내기
            mailSender.send(msg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}
cs




EmailController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.example.spring02.controller.email;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
 
import com.example.spring02.model.email.EmailDTO;
import com.example.spring02.service.email.EmailService;
 
@Controller
@RequestMapping("email/*")  
public class EmailController {
    @Inject
    EmailService emailService;
    
    @RequestMapping("write.do")
    public String write() {
        return "/email/write";
    }
    
    @RequestMapping("send.do")
    public String send(@ModelAttribute EmailDTO dto,
            Model model) {
        try {
            emailService.sendMail(dto);
            model.addAttribute("message","이메일이 발송되었습니다.");
        } catch (Exception e) {
            e.printStackTrace();
            model.addAttribute("message","이메일 발송 실패...");
        }
        return "/email/write";
    }
}
cs




'Java > study' 카테고리의 다른 글

java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for​ ~  (0) 2019.06.13
NIO기반 네트워킹  (0) 2019.04.25
NIO기반 입출력  (0) 2019.04.24
스레드풀(ThreadPool)  (0) 2019.04.24
IO기반 네트워킹  (0) 2019.04.22