코딩마을방범대
Java로 메일 발송하기 본문
728x90
메일의 전송과정
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. 구글 계정 정보 확인
- 구글 계정으로 접속 후 로그인.
: https://myaccount.google.com/ - [ 보안 ] > [ Google에 로그인 ] > [ 2단계 인증 ]을 클릭 후 등록.
: https://myaccount.google.com/signinoptions/two-step-verification - [ 보안 ] > [ Google에 로그인 ] > [ 앱 비밀번호 ]을 클릭.
: https://myaccount.google.com/apppasswords - 앱 비밀번호를 생성할 앱 및 기기를 선택.
: [ 앱 선택 ]은 '메일'을 선택.
: [ 기기 선택 ]은 아무거나 선택. - 생성 클릭
: 발급된 패스워드가 팝업에 패스워드가 발급되며
: 발급 받은 패스워드는 따로 저장.
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
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 );
728x90
'💡 백엔드 > Java' 카테고리의 다른 글
Date 비교 메소드 (0) | 2023.05.26 |
---|---|
Entity에서 암복호화 & JAVA 비동기 처리(Thread) (0) | 2023.05.26 |
yml 정보 클래스로 가져오기 (0) | 2023.05.26 |
SHA-256 해싱 알고리즘 (0) | 2023.05.26 |
JAVA에서의 암호화 방법 (AES) (0) | 2023.05.26 |