본문 바로가기

Android

[Gmail API] Load Mail Attachment Info

메일에 들어가는 첨부파일은 2가지로 구분할 수 있음

1. inline image 

본문내에 이미지가 들어가있는 경우, 이미지의 파일 정보는 attachment로 따로 빠져있음.

메일 본문의 이미지를 보여주려면 인라인 이미지를 로드한 다음 base64로된 이미지 정보를 <img> 태그로 넣어서 표현해야함.

2. attachment file

첨부를 통한 file이며, 확장자에 상관없이 메일에 포함된 첨부파일.

이 첨부 파일 정보 또한 메일 detail info를 부르더라도 파일의 이름이나 사이즈 같이 간략한 정보만 제공되고 다운로드 기능과 연결할 시에는 attachment 정보를 로드해야함.

    public static void loadMailAttachment(Context context, Account account, String mailId, String fileId, GmailNetworkListener listener) {
        try {
            GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(context, Collections.singleton(MAIL_SCOPE));
            credential.setSelectedAccount(account);

            Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build();
            new GetMailAttachmentTask(account, service, mailId, fileId, listener).execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static class GetMailAttachmentTask extends AsyncTask<Void, Void, MessagePartBody> {

        private Account account;
        private Gmail service;
        private String mailId;
        private String fileId;
        private GmailNetworkListener listener;

        public GetMailAttachmentTask(Account account, Gmail service, String mailId, String fileId, GmailNetworkListener listener) {
            this.account = account;
            this.service = service;
            this.mailId = mailId;
            this.fileId = fileId;
            this.listener = listener;
        }

        @Override
        protected MessagePartBody doInBackground(Void... voids) {
            if (listener == null) return null;

            try {
                return service.users().messages().attachments().get(account.name, mailId, fileId).execute();
            } catch (IOException e) {
                e.printStackTrace();
                listener.onFailure(e.toString());
            }
            return null;
        }

        @Override
        protected void onPostExecute(MessagePartBody result) {
            super.onPostExecute(result);
            if (listener != null) {
                listener.onSuccess(result);
            }
        }
    }