Java Mailによるメール送受信


ネットアプリケーションの普及に伴い、電子メールがますます多く使われています.Foxmail、OutlookのようなEメールクライアントにEメールを関連付けることが多いが、あるサイトにユーザーを登録した後にサイトから返信メールを送信したり、ネットショッピングをしている間に注文を完了してから数分以内に確認Eメールを送信したりするなど、受信メールを自分でプログラミングする必要があることも多い.このようなニーズに対して,既存のメールクライアントを介してメール送信やプロセッサを自分で作成する必要はない.ここでは、JavaMailを利用してメールの送受信を実現する方法について説明します.
注意:JavaMailが添付メールを送受信するテクニックについてのみ説明するので、コードの一部を与えるだけです.
1.添付ファイル付きメールの送信
私たちが普段送っているメールは主に2つの大部分に分解することができます.1つは送信者、受信者、テーマなどのメールヘッダーで、もう1つはメールの内容で、メールの添付ファイルが含まれています.私たちが普通のメールを送るときにcontentが設定するタイプは「text/html」で、添付ファイルを持っていくと、contentのタイプをMultipartに設定する必要があります.このときcontentには添付ファイルと「text/html」タイプの本文が含まれています.以下のこれは添付ファイルをメールに置く方法を教えてくれます.
private Multipart getMultipart() throws MessagingException,UnsupportedEncodingException { 
MimeMultipart mp = new MimeMultipart(); 
try 
{ 
//  content     
MimeBodyPart contentMbp = new MimeBodyPart(); 
//      ,       
contentMbp.setContent(_mailContent.getContent(),
"text/html; charset=GB2312"); 
mp.addBodyPart(contentMbp); 
//     
for (int i=0;i<_mailAttachment.getAttachPath().size();i++)
{ 
MimeBodyPart mbp = new MimeBodyPart(); 
FileDataSource fds = new FileDataSource((String)
_mailAttachment.getAttachPath().get(i)); 
mbp.setDataHandler(new DataHandler(fds)); 
mbp.setFileName(MimeUtility.encodeWord(fds.getName(),
"GB2312",null)); 
mp.addBodyPart(mbp); 
}
} 
catch(MessagingException ie) 
{ 
System.out.println("Set Content Message error..."+ie.getMessage()); 
throw ie; 
} 
catch(UnsupportedEncodingException ie) 
{ 
System.out.println("Encode the fileName error..."+ie.getMessage()); 
throw ie; 
} 
return mp; 
}

添付ファイルを置く際の注意事項は以下の通りです.
mailを送信するときは文字セットの問題に注意する必要があります.contentで設定するだけでなく、ファイル名も設定する必要があります.もし私たちが取り除いたら
mbp.setFileName(MimeUtility.encodeWord(fds.getName(),"GB2312",null));
という言葉で、あなたが選んだ添付ファイルはメールに持ち込まれますが、添付ファイルには見えません.メールのサイズを見ることで知ることができます.私たちはこの特徴を利用してcontentに書かれたhtml言語であり、画像情報を含むメールを送信することを実現します.
2.contentにhtmlページが含まれているメールを送信する
html言語に画像リンクが付いていることはよく知られています(
)では、メールを送信する際には、これらのリンクの画像を特殊に処理する必要があります.そうでなければ、相手がメールを受信したときに画像が見えなくなります.私たちが特殊に処理する方法は、それらを添付ファイルとして送信することですが、添付ファイルには表示されません.これを行うには、まず入力したcontentを解析し、画像のパスを見つける必要があります.そしてcontentを
このコードはになります.私たちは添付ファイルを送るときにmbp 1を使います.setHeader(「Content-ID」,「IMG」)は、画像と添付ファイルを対応させます.どのようにcontentの操作を具体的に解析するかは言うまでもなく、修正したcontentをどのように送信するかの例を示します.
//    html   content。      。 
for(int i=0;i<_mailContent.getImgHash().size();i++) 
{ 
MimeBodyPart mbp1 = new MimeBodyPart();
//       
FileDataSource fds = new FileDataSource(
(String)_mailContent.getImgHash().get("IMG"+i)); 
//   MimeBodyPart 
mbp1.setDataHandler(new DataHandler(fds)); 
//       html     
mbp1.setHeader("Content-ID","IMG"+i); 
mp.addBodyPart(mbp1); 
}

3.メールの状態
メールを読んだ後、削除フラグを設定し、FOLDERを閉じるときにtrueで削除フラグが付いているメールをクリアします.メールの状態はクラスFLAGS.FLAGで定義されています.以下のものが含まれます.
Flags.Flag.ANSWERED 
Flags.Flag.DELETED 
Flags.Flag.DRAFT 
Flags.Flag.FLAGGED 
Flags.Flag.RECENT 
Flags.Flag.SEEN 
Flags.Flag.USER 

必要に応じて設定できますが、すべてのサーバがこれらのステータスをサポートしているわけではありません.操作を行う前にgetPermanentFlagsメソッドを使用してMessageの状態を得ることができます.次のコードを参照
Message m = folder.getMessage(1); 
// set the DELETED flag 
m.setFlag(Flags.Flag.DELETED, true); 
// Check if DELETED flag is set of this message 
if (m.isSet(Flags.Flag.DELETED)) 
System.out.println("DELETED message"); 
// Examine ALL system flags for this message 
Flags flags = m.getFlags(); 
Flags.Flag[] sf = flags.getSystemFlags(); 
for (int i = 0; i < sf.length; i++) 
{ 
if (sf[i] == Flags.Flag.DELETED) 
System.out.println("DELETED message"); 
else if (sf[i] == Flags.Flag.SEEN) 
System.out.println("SEEN message"); 
}

4.添付ファイル付きメールの受信
添付ファイル付きメールでは、メッセージの内容はMultipart型で、contentと添付ファイルを得るために解析する必要があります(添付ファイル付きメールを送信する逆方向のプロセスです).outlook、foxmailなどのEメールクライアントを使用すると、サーバからダウンロードされ、ローカルハードディスク(HDD)に保存されていることがわかります.オフラインでメールを閲覧するのに便利です.次の例では、サーバ上のメールもローカルに保存します.興味があれば保存されたメールを読み込むためにクライアントのグラフィックインタフェースを作成することができます.
次の例では、添付ファイルの解析方法を紹介します.
private void getAttachFile(Part messagePart,BufferedOutputStream writeAttachObj) 
throws IOException, MessagingException 
{ 
Object content = messagePart.getContent() ; 
try 
{ 
//           multi     ,
//               html  content    
if (content instanceof Multipart) 
{ 
Multipart contentTmp = (Multipart) content ; 
//   MULTI     ,BodyPart(0).getContent()    content 
System.out.println("content==" + contentTmp.getBodyPart(0).getContent()) ; 
//getCount()    content bodyPart   ,content     
//bodyPart,           。                ,
//               。                。
for (int i = 0 ; i < contentTmp.getCount() ; i++) 
{ 
if (contentTmp.getBodyPart(i).isMimeType("multipart/*")) 
{ 
Multipart multipart = (Multipart) 
contentTmp.getBodyPart(i).getContent() ;
//                    。
for (int k = 0 ; k < multipart.getCount() ; k++) 
{ 
//content     INPUTSTREAM 。 
saveAttacheFile(multipart.getBodyPart(k).getContentType(), 
multipart.getBodyPart(k).getDisposition(), 
multipart.getBodyPart(k).getFileName(), 
multipart.getBodyPart(k).getInputStream(), 
writeAttachObj); 
} 
} 
else 
{ 
saveAttacheFile(contentTmp.getBodyPart(i).getContentType(), 
contentTmp.getBodyPart(i).getDisposition(), 
contentTmp.getBodyPart(i).getFileName(), 
contentTmp.getBodyPart(i).getInputStream(), 
writeAttachObj); 
} 
} 
} 
//             ,       
else 
{ 
writeAttachObj.write(("content = "+content+"
").getBytes()); 
writeAttachObj.flush(); 
} 
} 
catch (Exception ie) 
{ 
System.out.println("exception====" + ie.getMessage()) ; 
} 
}