Java Mailによるメール送受信
6402 ワード
ネットアプリケーションの普及に伴い、電子メールがますます多く使われています.Foxmail、OutlookのようなEメールクライアントにEメールを関連付けることが多いが、あるサイトにユーザーを登録した後にサイトから返信メールを送信したり、ネットショッピングをしている間に注文を完了してから数分以内に確認Eメールを送信したりするなど、受信メールを自分でプログラミングする必要があることも多い.このようなニーズに対して,既存のメールクライアントを介してメール送信やプロセッサを自分で作成する必要はない.ここでは、JavaMailを利用してメールの送受信を実現する方法について説明します.
注意:JavaMailが添付メールを送受信するテクニックについてのみ説明するので、コードの一部を与えるだけです.
1.添付ファイル付きメールの送信
私たちが普段送っているメールは主に2つの大部分に分解することができます.1つは送信者、受信者、テーマなどのメールヘッダーで、もう1つはメールの内容で、メールの添付ファイルが含まれています.私たちが普通のメールを送るときにcontentが設定するタイプは「text/html」で、添付ファイルを持っていくと、contentのタイプをMultipartに設定する必要があります.このときcontentには添付ファイルと「text/html」タイプの本文が含まれています.以下のこれは添付ファイルをメールに置く方法を教えてくれます.
添付ファイルを置く際の注意事項は以下の通りです.
mailを送信するときは文字セットの問題に注意する必要があります.contentで設定するだけでなく、ファイル名も設定する必要があります.もし私たちが取り除いたら
2.contentにhtmlページが含まれているメールを送信する
html言語に画像リンクが付いていることはよく知られています(
)では、メールを送信する際には、これらのリンクの画像を特殊に処理する必要があります.そうでなければ、相手がメールを受信したときに画像が見えなくなります.私たちが特殊に処理する方法は、それらを添付ファイルとして送信することですが、添付ファイルには表示されません.これを行うには、まず入力したcontentを解析し、画像のパスを見つける必要があります.そしてcontentを
このコードはになります.私たちは添付ファイルを送るときにmbp 1を使います.setHeader(「Content-ID」,「IMG」)は、画像と添付ファイルを対応させます.どのようにcontentの操作を具体的に解析するかは言うまでもなく、修正したcontentをどのように送信するかの例を示します.
3.メールの状態
メールを読んだ後、削除フラグを設定し、FOLDERを閉じるときにtrueで削除フラグが付いているメールをクリアします.メールの状態はクラスFLAGS.FLAGで定義されています.以下のものが含まれます.
必要に応じて設定できますが、すべてのサーバがこれらのステータスをサポートしているわけではありません.操作を行う前にgetPermanentFlagsメソッドを使用してMessageの状態を得ることができます.次のコードを参照
4.添付ファイル付きメールの受信
添付ファイル付きメールでは、メッセージの内容はMultipart型で、contentと添付ファイルを得るために解析する必要があります(添付ファイル付きメールを送信する逆方向のプロセスです).outlook、foxmailなどのEメールクライアントを使用すると、サーバからダウンロードされ、ローカルハードディスク(HDD)に保存されていることがわかります.オフラインでメールを閲覧するのに便利です.次の例では、サーバ上のメールもローカルに保存します.興味があれば保存されたメールを読み込むためにクライアントのグラフィックインタフェースを作成することができます.
次の例では、添付ファイルの解析方法を紹介します.
注意: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()) ;
}
}