본문 바로가기

프로그래밍/JAVA & SPRING

[LifeSoft] spring 18강 이메일 보내기

반응형

가. 이메일 서비스 구축 방법

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

 

- 자체 구축

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

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

*** 찾기 힘들다면 아래를 참고

내 계정 화면 - 보안 으로 가서 밑으로 내려오면

보안 수준이 낮은 앱의 액세스에 들어가서 허용으로 바꿈

 

나. 실습예제

1) pom.xml에 라이브러리 추가

빌드가 잘 안될 경우 스프링의 버전을 조정할 필요가 있음

비슷한 이름의 라이브러리가 있으므로 artifactid를 정확히 확인하고 추가해야 함.

  <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) root-context.xml 에 메일 발송을 위한 bean 등록

 <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
  <property name="host" value="smtp.gmail.com"></property>
  <property name="port" value="587"></property>
  <property name="username" value="이메일주소"></property>
  <property name="password" value="패스워드"></property>
  <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>

 

3) EmailDTO.java

이메일 전송하는 form을 만드는데 거기에 이런 내용을 채울것이다.

 

public class EmailDTO {
 private String senderName;  // 발신자 이름
 private String senderMail;  // 발신자 이메일 주소
 private String receiveMail; // 수신자 이메일 주소
 private String subject;  // 제목
 private String message;  // 본문

..getter(), setter(), toString()메서드까지 만듬.

}

 

3) EmailService.java

이메일 발송 서비스를 만든다.

public interface EmailService {
 public void sendMail(EmailDTO dto);
}

 

4) EmailServiceImpl.java

public class EmailServiceImpl implements EmailService {
 @Inject
 JavaMailSenderImpl mailSender; // 메일 발송 객체
 
 @Override
 public void sendMail(EmailDTO dto) {
  try {
   MimeMessage msg = mailSender.createMimeMessage();
   // 이메일 수신자  import javax.mail.internet.MimeMessage.RecipientType;
   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");  // 이메일 본문
   mailSender.send(msg);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

 

6) views/include/admin_menu.jsp

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

 

7) controller.email.EmailController.java

@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";
 }
}

 

8) views/email/write.jsp

<h2>이메일 보내기</h2>
<form action="${path}" method="post">
발신자 이름 : <input name="sendName"> <br>
발신자 이메일주소 : <input name="sendMail"> <br>
수신자 이메일주소 : <input name="receiveMail"> <br>
제목 : <input name="subject"> <br>
내용 : <textarea rows="5" cols="80" name="message"></textarea><br>
<input type="submit" value="전송">
</form><br>
<span style="color:red;">${message}</span>

 

 

이메일 발송 후 콘솔화면

DEBUG: JavaMail version 1.4.7
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
13:50:31.869 [http-nio-8080-exec-4] INFO [com.example.spring02.service.email.EmailServiceImpl.sendMail:25]-
    EmailDTO=== EmailDTO [senderName=운영자, senderxxx@gmail.com">senderMail=senderxxx@gmail.com, revievexxx@naver.com">receiveMail=revievexxx@naver.com, subject=스프링 이메일 테스트, message=EmailControllerEmailControllerEmailControllerEmailControllerEmailControllerEmailController]
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 smtp.gmail.com ESMTP y10sm81765312pfm.27 - gsmtp
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587

EHLO DESKTOP-1JSRCR3
250-smtp.gmail.com at your service, [211.46.216.207]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
EHLO DESKTOP-1JSRCR3
250-smtp.gmail.com at your service, [211.46.216.207]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<jsdilnam10@gmail.com">senderxxx@gmail.com>
250 2.1.0 OK y10sm81765312pfm.27 - gsmtp
RCPT TO:<receivexxxjsdilnam@naver.com">@naver.com>
250 2.1.5 OK y10sm81765312pfm.27 - gsmtp
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   jsdilnam10@gmail.com">senderxxxjsdilnam@naver.com">@naver.com
DATA
354  Go ahead y10sm81765312pfm.27 - gsmtp
Date: Wed, 17 Apr 2019 13:50:39 +0900 (KST)
From: =?UTF-8?B?7Jq07JiB7J6Q?= <jsdilnam10@gmail.com">senderxxxjsdilnam10@gmail.com">@gmail.com>
To: receivexxxjsdilnam@naver.com">@naver.com
Message-ID: <kim@DESKTOP-1JSRCR3">2035888718.0.1555476639686.JavaMail.kim@DESKTOP-1JSRCR3>
Subject: =?utf-8?B?7Iqk7ZSE66eBIOydtOuplOydvCDthYzsiqTtirg=?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit

EmailControllerEmailControllerEmailControllerEmailControllerEmailControllerEmailController
.
250 2.0.0 OK  1555476641 y10sm81765312pfm.27 - gsmtp
QUIT
221 2.0.0 closing connection y10sm81765312pfm.27 - gsmtp