IT 개발/AWS

6. AWS EC2(3) - Gmail Error 시 대처(번외 S3 Error 얘기)

미웡할꺼야 2020. 12. 31. 22:11

[참고] 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 관련 보안 그룹이 없으면 생성해서 인스턴스에 연결하면 된다.

  • 필자는 발신 측만 사용하기에 아래 그림처럼 아웃바운드 규칙밖에 없음.

해당 인스턴스에 Mail 관련 보안 그룹이 연결되어 있는지, 값이 맞는지 확인


2) 인스턴스와 보안 그룹에 연결된 VPC ID가 동일한지 확인.

  • 둘 중 하나가 VPC ID가 맞지 않다면 맞춰주면 된다.

인스턴스와 보안 그룹에 연결된 VPC ID가 동일한지 확인


Gmail 설정 확인

Java에서 Gamil 사용 시 계정의 보안 수준을 낮춰야 되기 때문에 부계정으로 사용하는 것을 권장.

 

1) IMAP사용 확인 : Gmail 접속 > 우측 상단 환경설정(톱니바퀴모양) 클릭 > 모든 설정 보기 클릭 > 전달 및 POP/IMAP 탭 클릭 > 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 계정에 대한 액세스 허용을 해야한다(참고).

내 Google 계정에 대한 액세스 허용


프로젝트 확인

1) JavaMail API를 사용하기 위한 라이브러리 확인.

  • 필자는 옛날 방식으로 써서 activation.jar, mail.jar 2개가 있는 것이다.

  • mail.jar파일을 다운받아 라이브러리에 넣든 Maven dependency을 사용하여 pom.xml에 넣든 하면 된다.

lib에 jar파일 확인


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 얘기

출처: CORS Error의 올바른 해결법 - Coding Groot - 티스토리

EC2 인스턴스 Serverwar파일 배포 후 처음 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번 반복, 다시 원상복구시키고 돌렸더니 갑자기 된다. 도대체 원인을 모르겠다....ㅠㅠㅠ