본문으로 바로가기

자바 SMTP와 Mail 발송하기(Google, Naver)

category Java 개발 이야기 2017. 9. 8. 13:23


SMTP와 Mail 발송하기(Google, Naver)


SMTP 개념

SMTP 프로토콜은 Simple Mail Transfer Protocol의 약어로 인터넷상에서 이메일을 전송하기 위해서 사용되는 통신 규약 중에 하나입니다. 그리고 이메일을 송수신하는 서버를 SMTP서버라고 합니다.

SMTP서버를 구축하기 위해서는 물리적인 서버(예를들어 리눅스)를 구축하여 서버를 설치하고 네트워크 환경을 잡아줘야하지만 네이버와 구글에서 계정에 대한 SMTP를 제공해주기 때문에 SMTP를 구축하지 않는 방법으로

포스팅하였습니다.

블로그에서 포스팅하는 자바의 예제는 JavaMail 라이브러리를 사용하였습니다.


개발 순서

1. JavaMail 라이브러리를 다운받고 프로젝트에 임포트

2. 구글 또는 네이버에서 SMTP 환경 설정

3. 개발시작


1. mvnrepository 에서 JavaMail 라이브러리 다운받기

http://mvnrepository.com/artifact/javax.mail/mail/1.4.7 에서 관련된 메일을 가져옵니다. 그리고 해당 프로젝트에 임포트 합니다.




2. SMTP 설정

2-1) 네이버 SMTP설정





2-2) google smtp 설정

1) javax.mail.AuthenticationFailedException이 발생하는 것은 아래와 같이 보안 수준이 낮은 앱 허용을 해주지 않아서 발생하게 됩니다. 

구글의 내계정 -> 로그인 보안에 들어가서 가장 하단에 허용함을 변경합니다.

2) 구글 메일의 환경설정에 들어가 POP설정 허용, 그리고 IMAP 사용을 클릭합니다.


3. 개발시작

이제 기본적으로 구글 메일과 네이버 메일을 사용하기 위한 기본적인 환경 정리는 끝났습니다.

이제 자바 메일 코드를 작성할 건데 JavaMail을 이용하여 메일을 보내기 위해 5가지 단계 진행해서 설명해드리겠습니다.


3.1) 발신자의 메일계정과 비밀번호를 설정한다.

3.2) Property에 SMTP 서버 정보를 설정한다. 

3.3) SMTP 서버 정보와 사용자 정보를 기반으로 Session 클래스의 인스턴스를 생성한다.

3.4) Message 클래스의 객체를 사용하여 수신자와 내용, 제목의 메시지를 작성한다.

3.5) Transport 클래스를 사용하여 작성한 메세지를 전달한다.


3.1) 발신자의 메일계정과 비밀번호를 설정

final String user = "qwerty1324@korea.com"; //발신자의 이메일 아이디를 입력 final String password = "password"; //발신자 이메일의 패스워드를 입력


3.2) Property에 SMTP 서버 정보를 설정

Properties prop = new Properties(); prop.put("mail.smtp.host", "smtp.gmail.com"); prop.put("mail.smtp.port", 465); prop.put("mail.smtp.auth", "true"); prop.put("mail.smtp.ssl.enable", "true"); prop.put("mail.smtp.ssl.trust", "smtp.gmail.com");


mail.smtp.host

"mail.smtp.host"은 이메일 발송을 처리해줄 STMP 서버를 나타냅니다.

gmail을 SMTP서버로 사용할 경우 "smtp.gmail.com" 으로 설정, naver를 SMTP서버로 사용할 경우 "smtp.naver.com" 으로 설정합니다.

mail.smtp.port 

"mail.smtp.port "은 SMTP서버와 통신하는 포트를 말하는데 gmail일 경우 465를 Naver의 경우 587을 사용합니다.

주의. 구글과 네이버의 경우 Properties 설정 값이 다릅니다.!


3.3) SMTP 서버 정보와 사용자 정보를 기반으로 Session 클래스의 인스턴스를 생성한다.

Session session = Session.getDefaultInstance(prop, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(user, password);
            }
        });


3.4) Message 클래스의 객체를 사용하여 수신자와 내용, 제목의 메시지를 작성한다.

3.5) Transport 클래스를 사용하여 작성한 메세지를 전달한다.

try { MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(user));

//수신자메일주소 message.addRecipient(Message.RecipientType.TO, new InternetAddress("ktko@ktko.com")); // Subject message.setSubject("제목을 입력하세요"); //메일 제목을 입력 // Text message.setText("내용을 입력하세요"); //메일 내용을 입력 // send the message Transport.send(message); ////전송 System.out.println("message sent successfully..."); } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); }




Gmail 예제 

public static void gmailSend() { String user = "ktko@gmail.com"; // 네이버일 경우 네이버 계정, gmail경우 gmail 계정 String password = "password";   // 패스워드 // SMTP 서버 정보를 설정한다. Properties prop = new Properties(); prop.put("mail.smtp.host", "smtp.gmail.com"); prop.put("mail.smtp.port", 465); prop.put("mail.smtp.auth", "true"); prop.put("mail.smtp.ssl.enable", "true"); prop.put("mail.smtp.ssl.trust", "smtp.gmail.com"); Session session = Session.getDefaultInstance(prop, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, password); } }); try { MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(user));

//수신자메일주소 message.addRecipient(Message.RecipientType.TO, new InternetAddress("ktko@naver.com")); // Subject message.setSubject("제목을 입력하세요"); //메일 제목을 입력 // Text message.setText("내용을 입력하세요"); //메일 내용을 입력 // send the message Transport.send(message); ////전송 System.out.println("message sent successfully..."); } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } }


Naver Mail 예제

public static void naverMailSend() { String host = "smtp.naver.com"; // 네이버일 경우 네이버 계정, gmail경우 gmail 계정 String user = "ktko@naver.com"; // 패스워드 String password = "password";      // SMTP 서버 정보를 설정한다. Properties props = new Properties(); props.put("mail.smtp.host", host); props.put("mail.smtp.port", 587); props.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, password); } }); try { MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(user)); message.addRecipient(Message.RecipientType.TO, new InternetAddress("ktko@ktko.com")); // 메일 제목 message.setSubject("KTKO SMTP TEST1111"); // 메일 내용 message.setText("KTKO Success!!"); // send the message Transport.send(message); System.out.println("Success Message Send"); } catch (MessagingException e) { e.printStackTrace(); } }


다중 메일 보내기

1:1 메일이 아닌 1:N메일을 보내기 위한 코드를 간략하게 설명 드리겠습니다.

아래 함수는 수신자의 메일을 입력하는 곳으로 수신자 메일 주소를 저장한 InternetAddress 전달하고 있습니다. 

message.addRecipient(Message.RecipientType.TO, new InternetAddress("ktko@ktko.com"));


1명 이상의 수신자에게 전달하기 위해선 InternetAddress 객체 배열을 생성하여 객체 안에 수신자들의 메일 주소를 입력하여 전달해 주면 됩니다.

InternetAddress[] addArray = new InternetAddress[5]; addArray[0] = new InternetAddress("ktko0@ktko0.com"); addArray[1] = new InternetAddress("ktko1@ktko1.com"); addArray[2] = new InternetAddress("ktko2@ktko2.com"); addArray[3] = new InternetAddress("ktko3@ktko3.com"); addArray[4] = new InternetAddress("ktko4@ktko4.com"); message.addRecipients(Message.RecipientType.TO, addArray);

주의 점은 AddRecipient가 아닌 addRecipients 입니다.




댓글을 달아 주세요

  1. 임현태 2018.10.07 23:50

    안녕하세요 혹시 깃허브나 세이브 파일좀 얻을수 있나요?

  2. 임현태 2018.10.08 00:02

    spring으로 이메일 보내는거 하라해서 처음 만지고 있는데요.

    public class MailController{
    @Autowired
    private JavaMailSender mailSender;
    @RequestMapping(method = RequestMethod.POST)

    public void sendMail(/*String from,String to, String subject, String text*/) {
    String host = "smtp.naver.com";
    String user = "123123213@naver.com";
    String password = "123123123123";

    Properties prop = new Properties();
    prop.put("mail.smtp.host", "smtp.naver.com");
    prop.put("mail.smtp.port", 587);
    prop.put("mail.smtp.auth", "true");
    prop.put("mail.smtp.ssl.enable", "true");
    prop.put("mail.smtp.ssl.trust", "smtp.naver.com");

    Session session = Session.getDefaultInstance(prop, new javax.mail.Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(user, password); }
    });
    try {
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(user));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress("ktko@ktko.com"));
    // 메일 제목
    message.setSubject("KTKO SMTP TEST1111"); // 메일 내용
    message.setText("KTKO Success!!"); // send the message
    Transport.send(message);
    System.out.println("Success Message Send");
    }catch (MessagingException e) { e.printStackTrace(); System.out.println("에러"); }

    }
    }

    이런식으로 보고 했습니다. 근데
    protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, password); } 여기서 PasswordAuthentication와 (user, password);에 빨간줄이 긁혀요. 도와주세요 ㅠㅠ

    • 개발자 ktko 2018.10.08 14:43 신고

      음 오류 로그를 보내주셔야 할 것같은데요 ? 그리고 제 블로그 말고 다른 블로그들도 있으니 한번 보시는 것도 좋을것같습니다 !

    • dd 2018.10.11 14:50

      대략 살펴보니
      위에서
      user와 passwd를 String으로 선언했는데
      PasswordAuthentication(user,passwd)에서 passwd가 String이 아니라 char[]가 와야한다고 하는거같아요

    • 흐츠흐 2018.11.14 10:20

      PasswordAuthentication

      패키지 보세요.
      java.net. 은 char[] 사용해야 하고요
      javax.mail. 은 string 가능합니다.

  3. 덜덜 2019.01.22 14:20

    덕분에 잘테스트했습니다.감사합니다

  4. Nick 2019.04.03 17:37

    다중메일을 보내는 방법이 addArray[0] = new InternetAddress("ktko0@ktko0.com");와 같이 코드에 이메일을 적어서 보내는 방법말고 GUI 텍스트필드에 ,를 기준으로 나눠서 여러명으로 보내는 방법은 없는가요?

  5. 금융경제학 2020.08.04 18:56 신고

    너무 깔끔한 정리 감사합니다 큰 도움이었습니다!

  6. 감사 2021.04.25 12:44

    합니다

  7. 2021.06.01 13:08

    비밀댓글입니다