Google API를 사용하여 GMail의 목록을 가져올 수 있다. 그런데.. 목록뿐만 아니라 메시지 본문도 가져올수 있다.
Message는 MessagePart로 구성되어있다. 그리고 각 MessagePart에는 Header가 있고, 그 헤더를 통해 MIME타입을 가져와서 읽으면 된다.
public void MyFunction(...){
...
List<String> contents = new ArrayList();
List<MessagePart> parts = myMessage.getPayload().getParts();
readMessagePart( parts, contents, "text/html");
if( contents.isEmpty()){
readMessagePart(parts, contents, "text/plain");
}
}
public void readMessagePart(List<MessagePart> parts, List<String> contents, String mimeType){
for(MessagePart part : parts){
if( part.getMimeType().equals(mimeType)){
byte[] decodeByte = Base64.getUrlDecoder().decode(part.getBody().getData());
content.add(new String(decodeByte));
}
if( part.getParts() != null){
readMessagePart(part.getParts(), contents, mimeType);
}
}
}
위와 같이 작성하면.. 원하는 mimetype의 텍스트를 가져올 수 있다. text만 필요하면 mimetype을 text/plain으로.. html형태로 받아오고싶으면 text/html로 가져올 수 있다.
저기서 보면, part의 하위 part가 있으면 다시 읽어오도록 해 두었는데, 많은 메시지들은 MIME이 multipart/alternative ( text/plain, text/html등이 있음) 이지만, multipart/related로 되어있고, getPart를 하면 multipart/alternative인 MIME을 가진 메시지 파트가 있고, 해당 파트의 child를 탐색해야 원하는 부분을 가져올 수 있는 메시지가 있다. 이런 경우를 대비해서 저렇게 만들었다.
그리고, new String(Byte)로 했을 때, charset이 안맞으면.. 텍스트가 다 깨진다. (당연히...)
이 charset은 MessagePartHeader에 포함되어있다. 헤더 중, 이름이 Content-Type인 헤더를 찾아서 그 안에 저장된 charset을 가져오면 된다.
List<MessagePartHeader> headers = part.getHeaders();
for(MessagePartHeader header : headers){
if( header.getName().equalsIgnoreCase( "content-type")){
String[] headerContents = header.getValue().split(";");
for(String headerContent : headerContents){
if( headerContent.contains("charset=")){
String charSetVal = headerContent.replace("charset=").replace("\"", "").trim();
}
}
}
}
뭐.. 대충 저렇게 접근하면 정보를 얻어갈 수 있다.
반응형
댓글