ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] SMTP 메일 이미지 첨부 방법 3가지
    JAVA 2020. 7. 4. 19:52

     

     

    SMTP 메일 이미지 첨부 에러


     

    자바로 메일을 보내야하는 일이 생겨 SMTP를 사용해 메일을 보내는 코드를 작성했다. 메일내에 이미지를 첨부해서 전송해야 했고 CID 방식을 사용해서 코드를 작성했다.

    로컬에서의 테스트는 깔끔하게 네이버, 구글 등 전송받은 메일이 모두 정상적으로 출력이 되었으나 개발서버에서 테스트를 진행했을 때 일부 메일에서 정상적으로 작동이 되지 않는 일이 생겼다.

    구글신의 도움을 받아 찾아본 결과 3가지의 방법이 있었다.

     

    Inline embedding


    인라인 임베딩 방법은 이미지를 base64로 인코딩 하는 방법이다. 쉽게 말하면 이메일에 이미지를 문자열로 변환하여 HTML 태그를 통해 이메일에 이미지를 내장하는 방법이다. 굉장히 간단하지만 잘 사용하지는 않는다. 이메일

    <img src="data:image/png;base64,iVBADGJHAHFDKJFOIHWIUFHI183uHkjnaksdj01293AASJHKDBIASBDIAHDIUHQWIOUDHNHSBNDAdsCAMAAABThmYtA" alt="img" />

    대략 이런식으로 첨부할 수 있다. 하지만 메일이 무거워지고(용량이 커짐) 대부분의 포털사이트들은 base64로 인코딩하여 이미지를 임베딩하는 것을 차단한다. 그러므로 PASS!

     

    CID(Content-ID)


    구글에 자바에서 SMTP로 이미지 임베딩하는 것을 검색하면 볼 수 있다.

    간단하게 설명하면 이미지를 메일에 첨부하고(파일 첨부하듯이) 이메일의 템플릿의 HTML 태그와 함께 메일이 열릴때 이미지를 해당 태그 위치에 보여주는 방법이다.  실제 사용방법이나 코드는 매우 간단했다. 

    나도 처음엔 CID 방식을 사용해서 코드를 작성했다. 로컬에서는 정말 깔끔했으나 서버에서는 정상적으로 이메일에서 이미지가 불러와지지 않았다. (여러 이메일중 되는 곳도 있고 안되는 곳도 있었음)

    회사 메일은 정상 동작했는데 네이버는 첨부한 이미지가 첨부파일 목록에 알수없는 파일인 채로 첨부된게 보였고, 구글은 이미지 첨부가 정상적으로 전송한 템플릿 위치에 보여졌으나 내가 첨부한 이미지가 첨부파일에 보여졌다.(성공적인(?) 로컬테스트에서는 CID로 첨부한 파일은 사용자가 볼때는 보이지 않았다.)

    로컬에서 SMTP로 메일 발송을 해보실 분들은 CID 임베딩방법을 사용해라.

     

    Linked images 


    이 방법은 정말 간단하다.

    <img src="https://www.google.com/webhp?hl=ko&sa=X&ved=0ahUKEwjyvu2N4bjqAhU7y4sBHVbgCTUQPAgH" alt="img" />

    끝이다. 전송하는 메일안의 HTML 템플릿에 이미지 주소만 넣어주면 된다.

    물론 저런 이미지를 저장할 수 있는 공개된 파일서버가 필요하다.(그게 복잡할수도..) 난 이 방법을 사용하여 메일내의 템플릿에 이미지 첨부에 성공했다.

    단.. Gmail은 애매하다. 구글 정책상 프록시에 등록되지 않은 이상한 주소에서 발송되면 차단해버리는 경우가 있다고 한다. 현재 개발 서버에서 전송이라 그런건지.. 운영으로 넘어가면 그떄 다시 확인을 해봐야될 것같다. (되겠지..?)

     

     

    아 참..


    outlook은 다 안된다. 방법이 있다면(?) 메일을 받는 개인이 메일 설정을 바꿔야하는 것 같다. 물론 안해봐서 모르겠다. 그냥 outlook 메일은 지원 안한다고 쓰는게 맘 편하다고 한다.

    outlook 에서 템플릿이 깨지는 경우 html 구조나 css 설정을 따로 변경해서 맞추고, 이미지는 사용자 개인이 설정을 바꾸면 사용이 가능함을 확인했다.

     

     

     

     

    References


     

     


    잘못된 코드나 내용이 있다면 댓글을 남겨주세요. 즉시 수정하도록 하겠습니다! :)

     

    댓글