Java로 메일 발송하기

단비·2023년 4월 27일
1

학습

목록 보기
25/66

메일의 전송과정

  • danbi@naver.com -> danbi@gmail.com 으로 메일 발송 시
    naver 메일 서버를 거친 후 gmail 서버를 거쳐서 전달됨


메일 프로토콜의 종류

1. SMTP Protocol(Simple Mail Transfer Protocol)

  • 전자 메일 전송을 위한 표준 프로토콜.
  • 클라이언트트가 서버에 이메일을 전달하는데 사용된다.

2. POP3 Protocol(Post Office Protocol)

  • 서버에서 이메일을 수신할 수 있도록 한다.
  • 서버의 이메일은 삭제됨.

3. IMAY Protocol(Internet Message Access Protocol)

  • 서버에서 이메일을 수신할 수 있도록 한다.
  • 서버에 이메일을 보관함. (트래픽 증가, CPU 사용 증가)



세팅법

1. 구글 계정 정보 확인

  1. 구글 계정으로 접속 후 로그인.
    : https://myaccount.google.com/

  2. [ 보안 ] > [ Google에 로그인 ] > [ 2단계 인증 ]을 클릭 후 등록.
    : https://myaccount.google.com/signinoptions/two-step-verification

  3. [ 보안 ] > [ Google에 로그인 ] > [ 앱 비밀번호 ]을 클릭.
    : https://myaccount.google.com/apppasswords

  4. 앱 비밀번호를 생성할 앱 및 기기를 선택.
    : [ 앱 선택 ]은 '메일'을 선택.
    : [ 기기 선택 ]은 아무거나 선택.

  5. 생성 클릭
    : 발급된 패스워드가 팝업에 패스워드가 발급되며
    : 발급 받은 패스워드는 따로 저장.


2. build.gradle에 dependency 추가

// https://mvnrepository.com/artifact/javax.activation/activation
implementation group: 'javax.activation', name: 'activation', version: '1.1.1'
// https://mvnrepository.com/artifact/javax.mail/mail
implementation group: 'javax.mail', name: 'mail', version: '1.4.7'

3. send 메소드 작성

1. SMTP 서버 정보 설정

// Property에 SMTP 서버 정보 설정
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");

// 연결할 smtp 서버 (naver의 경우 smpt.naver.com)
props.put("mail.smtp.host", "smtp.gmail.com");
// TLS의 포트번호는 587 / SSL의 포트번호는 465
props.put("mail.smtp.port", "465");
// true: SMTP 서버의 인증을 사용한다는 의미(기본값은 fals)
props.put("mail.smtp.auth", "true");

// false: QUIT 명령이 전송되고 연결이 즉시 닫힘
// true(기본값): QUIT 명령에 대한 응답을 기다림
props.put("mail.smtp.quitwait", "false");
// 지정된 소켓 팩토리를 사용할 때 연결할 포트를 지정(설정하지 않으면 기본 포트가 사용)
props.put("mail.smtp.socketFactory.port", "465");
// SMTP 소켓을 만드는 데 사용할 클래스 지정 (기본값은 javax.net.SocketFactory)
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
// true: 소켓을 만들지 못하면 java.net.Socket클래스를 사용하여 소켓이 만들어짐 (기본값은 true)
props.put("mail.smtp.socketFactory.fallback", "false");

2. smtp 서버 로그인 인증 인스턴스 생성

  • Authenticator
    : 네트워크 접속에 필요한 인증을 취득하기 위한 객체
  • PasswordAuthentication의 getPasswordAuthentication
    : 패스워드 인증이 필요한 경우에 호출
Authenticator auth = new Authenticator() {
	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(username, password);
	}
};

3. 전송할 Message 인스턴스 생성

// 메일 세션 생성 (SMTP 정보, 인증정보)
Session session = Session.getInstance(props, auth);

// 메일 송/수신 옵션 설정
Message message = new MimeMessage(session);
// 보내는 사람 설정
message.setFrom(new InternetAddress(fromEmail, fromUsername));
// 받는 사람 설정
// 첫번째 인수에서 TO, CC, BCC 중 선택, 두번째 인수에서 받을 사람 선택
message.setRecipients(MimeMessage.RecipientType.TO, InternetAddress.parse(toEmail, false));
// 제목 설정
message.setSubject(subject);

4. 메일 콘텐츠 설정

  • HTML
    • Multipart
      : 웹 클라이언트가 요청을 보낼 때, http 프로토콜의 바디 부분에 데이터를 여러 부분으로 나눠서 보내는 것
Multipart mParts = new MimeMultipart();
// Multipart의 바디 부분을 세팅하기 위해 MimeBodyPart 선언
MimeBodyPart mTextPart = new MimeBodyPart();

// 텍스트, 인코딩 방법, html&text 유형 선택
mTextPart.setText(sendMsg, bodyEncoding, "html");
mParts.addBodyPart(mTextPart);

// 첫번째 인자를 Multipart타입으로 하지 않고 String으로 전달 후, 두번째 인자로 text/html 설정 가능
// (대신 한글이 깨짐)
message.setContent(mParts);
  • TEXT
message.setText(sendMsg);

5. 전송하기

Transport.send( message );
profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글