[참고] JavaMail
[참고] A List of SMTP and IMAP Server - Arclab Software
[참고] EC2에 배포한 Django 어플리케이션에서 Gmail SMTP로 발신
운영체제(OS) : Windows 10 64bit, Linux Ubuntu 18.04
개발환경 : JDK8, Tomcat8
개발도구 : PuTTY(푸티)
Java에서 Gmail 사용에 관한 것이므로 참고.
개인 정보 보안을 위해 개발용으로 Google 부계정으로 진행.
AWS - 보안 그룹, EC2 인스턴스 확인
1) 해당 인스턴스에 Mail 관련 보안 그룹이 연결되어 있는지, 값이 맞는지 확인.
-
인바운드 규칙=수신 측 / 아웃바운드 규칙=발신 측.
-
인스턴스에 연결된 Mail 보안 그룹-포트 범위, 프로토콜, 대상이 맞는지 확인(참고).
-
Mail 관련 보안 그룹이 없으면 생성해서 인스턴스에 연결하면 된다.
-
필자는 발신 측만 사용하기에 아래 그림처럼 아웃바운드 규칙밖에 없음.
2) 인스턴스와 보안 그룹에 연결된 VPC ID가 동일한지 확인.
-
둘 중 하나가 VPC ID가 맞지 않다면 맞춰주면 된다.
Gmail 설정 확인
Java에서 Gamil 사용 시 계정의 보안 수준을 낮춰야 되기 때문에 부계정으로 사용하는 것을 권장.
1) IMAP사용 확인 : Gmail 접속 > 우측 상단 환경설정(톱니바퀴모양) 클릭 > 모든 설정 보기 클릭 > 전달 및 POP/IMAP 탭 클릭 > IMAP 액세스=IMAP 사용 체크 > 변경 사항 저장 클릭.
2) 계정 보안 수준 확인 : Google 계정 접속 > 보안 탭 클릭 > 보안 수준이 낮은 앱의 액세스=사용 확인.
3) 내 Google 계정에 대한 액세스 허용 : https://accounts.google.com/displayunlockcaptcha에 접속 > 사용 클릭 > 본인 개발용 Google 계정 다시 로그인.
-
localhost로 메일 전송 후 정상적으로 수신이 되나 EC2 인스턴스 Server에서 메일 전송 후 수신이 안되는 것은 내 Google 계정에 대한 액세스 허용을 하지 않아서 생기는 문제이다.
-
인증된 장치나 IP로 접근 시 CAPTCHA가 허용되어 있지만 반대인 경우 Google 보안 정책상 인증되지 않은 장치나 IP로 Google 계정에 접근 시 CAPTCHA 승인을 받아야 한다. 예를 들어 손님 명단에 없으면 인증받기 전까지 못 들어가는 것과 같은 이치이다.
이 경우 EC2 Server -> Gmail SMTP Server로 순수 Server상에서 처리하는 것이기에 Source에서 손댈 수 있는 상황이 아니다. 그러므로 위에 해당 URL로 접근하여 내 Google 계정에 대한 액세스 허용을 해야한다(참고).
프로젝트 확인
1) JavaMail API를 사용하기 위한 라이브러리 확인.
-
필자는 옛날 방식으로 써서 activation.jar, mail.jar 2개가 있는 것이다.
-
mail.jar파일을 다운받아 라이브러리에 넣든 Maven dependency을 사용하여 pom.xml에 넣든 하면 된다.
2) source 확인.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/*
* 메일 환경 변수 설정.
* Properties Key값
* https://javaee.github.io/javamail/docs/api/com/sun/mail/smtp/package-summary.html
* Gmail IMAP/SMTP 설정값
* https://support.google.com/mail/answer/7126229?hl=ko
*/
Properties props = new Properties();
/* SMTP(SSL용 포트) 서버 정보 설정. */
// props.put("mail.smtp.auth", "true");
// props.put("mail.smtp.host", "smtp.gmail.com");
// props.put("mail.smtp.port", "465");
// props.put("mail.smtp.socketFactory.port", "465");
// props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
/* SMTP(TLS/STARTTLS용 포트) 서버 정보 설정. */
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
// props 설정값을 기준으로 송신자 아이디, 비밀번호를 통해 접근, SMTP 사용 인증 요청.
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("송신자 Google 아이디", "송신자 Google 비밀번호");
}
});
try {
// 메일 메시지 객체 생성.
Message message = new MimeMessage(session);
// 송신자 설정.
message.setFrom(new InternetAddress("송신자 Google 이메일"));
// Message.RecipientType.TO 외 .CC(참조) .BCC(숨은참조)도 있음.
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("수신자 이메일"));
// 메일 제목 설정.
message.setSubject("메일 제목");
// 메일 내용 설정.
message.setContent("메일 내용", "text/html; charset=UTF-8");
// 메시지 전송.
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
|
cs |
번외. S3 Error 얘기
EC2 인스턴스 Server로 war파일 배포 후 처음 S3 파일 업로드 시 위 그림과 같은 error가 발생하였다. 원인을 찾아보니 결론적으로 버킷 권한 정책 및 CORS 정책에 관한 얘기였다.
참고로 "CORS policy: No 'Access-Control-Allow-Origin'"에 대한 error 발생 원인은 CORS Rule: "AllowedOrigin", "AllowedMethod", "AllowedHeader"의 값에 관한 문제다.
해결 방법도 찾아보니 두 개의 정책에서 빠진 값들을 Source상에서 넣어주면 해결된다고 한다.
하지만 Source에서 수정할 필요 없이 AWS Console에서 버킷 권한 정책 및 CORS 정책을 편집하면 된다.
필자의 경우 AWS Console에서 버킷 권한 정책은 자격 증명 풀로 대신 버킷 권한에 접근하는 것으로 하였으며 CORS 정책은 직접 JSON값을 넣어 설정하였다(3. AWS S3 - 버킷 생성 및 연동_5번 항, 9.2번 항).
필자와 거의 비슷하게 한 사람이 YouTube - How to solve S3 CORS file error with "Access-Control-Allow-Origin" header block이다.
일단 정상 작동을 위해 S3 Console_CORS 정책에서 CORS Rule의 값을 계속 수정하면서 S3 Console_CORS 정책 편집 > S3 파일 업로드 > error 발생 과정을 3, 4번 반복, 다시 원상복구시키고 돌렸더니 갑자기 된다. 도대체 원인을 모르겠다....ㅠㅠㅠ
'IT 개발 > AWS' 카테고리의 다른 글
1. AWS VPC - RDS, EC2, Mail 보안 그룹 및 탄력적 IP 생성 (0) | 2020.12.18 |
---|---|
5. AWS EC2(2) - Utuntu 자바(JDK, JRE), 톰캣 설치 및 war파일 배포 (0) | 2020.12.14 |
4. AWS EC2(1) - 인스턴스 생성 및 접속 (0) | 2020.12.11 |
AWS 프리 티어 사용 시 요금 발생(폭탄)을 막기 위한 팁 (0) | 2020.12.11 |
3. AWS S3 - 버킷 생성 및 연동 (0) | 2020.12.07 |