메일 프로토콜의 종류
구글 계정으로 접속 후 로그인.
: https://myaccount.google.com/
[ 보안 ] > [ Google에 로그인 ] > [ 2단계 인증 ]을 클릭 후 등록.
: https://myaccount.google.com/signinoptions/two-step-verification
[ 보안 ] > [ Google에 로그인 ] > [ 앱 비밀번호 ]을 클릭.
: https://myaccount.google.com/apppasswords
앱 비밀번호를 생성할 앱 및 기기를 선택.
: [ 앱 선택 ]은 '메일'을 선택.
: [ 기기 선택 ]은 아무거나 선택.
생성 클릭
: 발급된 패스워드가 팝업에 패스워드가 발급되며
: 발급 받은 패스워드는 따로 저장.
// 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'
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 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. 메일 콘텐츠 설정
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);
message.setText(sendMsg);
5. 전송하기
Transport.send( message );