2011年6月29日水曜日

groovyとJavaMailでimapプロトコルを使用して指定した受信日以降のメールを取得する

groovyとJavaMailでimapプロトコルを使用して指定した受信日以降のメールを取得するには、以下のコードのようにReceivedDateTermクラスを使用します。

@Grab(group="javax.mail", module="mail", version="latest.integration")
import java.security.*
import java.util.*
import javax.mail.*
import javax.mail.search.*
import javax.mail.internet.*

host = "imap.gmail.com"
port = "993"
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())
Properties props = new Properties()
props.put("mail.imap.host", host)
props.put("mail.imap.port", port)
props.put("mail.imap.socketFactory.port", port);
props.put("mail.imap.socketFactory.class",
"javax.net.ssl.SSLSocketFactory")
props.put("mail.imap.socketFactory.fallback", "false")

Session session = Session.getDefaultInstance(props,
[
getPasswordAuthentication: {
return new PasswordAuthentication("youraccount@gmail.com",
'yourpassword')
}
] as Authenticator
)
Store store = null
try
{
store = session.getStore("imap")
store.connect()
folder = store.getFolder("INBOX")
folder.open(Folder.READ_ONLY)

for( message in folder.search(
new ReceivedDateTerm(ComparisonTerm.GE,
new GregorianCalendar(2011,6-1,25).getTime()
)) ){
// 題名
println("subject:" + message.getSubject())
// 送信日付
println("date:" + message.getSentDate())
// from
println("from:" + message.getFrom()[0].getAddress())
println("content-type:" + message.getContentType())
if( message.getContentType().toLowerCase().startsWith("text/plain") ){
// テキスト形式
println("content:" + message.getContent())
} else {
if( message.getContent() instanceof Multipart){
// Multipartの場合
mp = message.getContent()
for(int ip=0;ip<mp.getCount();ip++){
println("content-type:" + mp.getBodyPart(ip).getContentType())
disposition = mp.getBodyPart(ip).getDisposition()?.toLowerCase()
if( !disposition.equals(Part.ATTACHMENT) &&
!disposition.equals(Part.INLINE) ){
println("content:" + mp.getBodyPart(ip).getContent())
}
}
}
}
}
folder.close(false)
}
finally
{
if( store != null )store.close()
}



動作環境
groovy 1.8.0, OpenJDK1.6.0_22

0 件のコメント:

コメントを投稿