程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深入探討JavaMail API的使用

深入探討JavaMail API的使用

編輯:關於JAVA

在我以前發表的文章《使用JavaMail和Jsp結合編寫簡易電子郵件發送系統》 ,介紹了JavaMail與JSP結合使用的方法。其實,JavaMail API是一個相當大的 系統,單單那麼一片小文是不能介紹完JavaMail的,因此我想以本文與大家深入 的探討一下JavaMail的使用。

問題一、我如何發送一封簡單的信件?

回答:我將在下面的例子中詳細的講解如何發送簡單信件

import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendSimpleMail {
file://msgText是信件的正文,共有兩行
static String msgText = "Dear Mr.FangZhou\nI’m a reader of your net!"
file://從命令行中讀入三個參數,分別為smtpHost,from,to
public static void main(String args[])
throws Exception{
if (args.length != 3) {
System.out.println("usage: java SendSimpleMail ");
return;
}
String smtpHost=args[0];//SMTP服務器名
String from=args[1];//發信人地址
String to =args[2];//收信人地址
// 創建properties對象
Properties props = new Properties();
file://創建郵件服務器
props.put("mail.smtp.host", smtpHost);
file://取得默認的Session
Session session = Session.getDefaultInstance(props, null);
// 創建一條信息,並定義發信人地址和收信人地址
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
message.setRecipients(Message.RecipientType.TO, address);
message.setSubject("Hello,FangZhou");//設定主題
message.setSentDate(new Date());//設定發送時間
message.setText(msgText);//把前面定義的msgText中的文字設定為郵件正文的 內容
file://發送郵件
Transport.send(message);
}
}

問題二、如果我想在郵件中加上附件怎麼辦?

這也是一個相當好的問題,要加入附件的話就要使用MimeBodyPart來創建郵 件,只需把上面的程序稍加修改就可以了,為了簡單起見,我在這裡只是使用了 一條字符串作為附件內容來解釋如何添加附件。

file://msgText是信件的正文,共有兩行

static String msgText = "Dear Mr.FangZhou\nI’m a reader of your net!"
file://msgAttachment是一段字符串作為附件
static String msgAttachment = "This is an attachment string!"
. . . . . . . . .
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setText(msgText); file://把前面定義的msgText中的文字設定為郵件正 文的內容
file://創建附件部分
MimeBodyPart mbp2 = new MimeBodyPart();
file://使用setText(text, charset)來加入附件
mbp2.setText(msgAttachment, "gb2312");
file://創建Multipart
Multipart mp = new MimeMultipart();
mp.addBodyPart(mbp1);
mp.addBodyPart(mbp2);
// 添加 Multipart到Message中
message.setContent(mp);
file://發送郵件
Transport.send(message);
}

問題三、我怎樣從郵件服務器中獲取郵件列表

回答:其實實現這個問題的方法很簡單

1. JavaMail客戶端通過創建一個默認的會話(Session)對象來開始一個郵 件處理任務

Session session = Session.getDefaultInstance(props, authenticator);

2. 客戶端使用Session對象的getStore方法來連接到默認到Store提供者。 GetStore方法返回一個 Store 對象子類,它支持用戶屬性中定義的連接協議。

Store store = session.getStore();

store.connect();

3. 如果連接成功的話,客戶端就能夠列出Store中的可用的文件夾。然後我 們就可以取得或時浏覽特定的Message對象。

// 取得 INBOX 文件夾
Folder inbox = store.getFolder("INBOX");
// 打開 INBOX 文件夾
inbox.open(Folder.READ_WRITE);
Message message[] = inbox.getMessage();
for(int i =0;filenumber=message.length;i < filenumber;i ++)
{
System.out.println(“第”+i +”封信:”+message[i ].getFrom()[0]+”\t” +message[i ].getSubject());
}
...
...

4. 最後,客戶端關閉所有打開的文件夾,並關閉所有Store。

inbox.close(); // 關閉INBOX
store.close(); // 關閉Store

問題四:我想刪除郵箱中的某些郵件,該怎麼辦呢?

在郵件服務器上,我們如果想刪除某封信的話,只需調用setFlag()來設置 Flags.Flag.DELETE為真即可。

例如:Message message = folder.getMessage(1);
message.setFlag(Flags.Flag.DELETED, true); file://設置 Flags.Flag.DELETE為真。
// 檢查這封信的DELETED標記是否設置
if (message.isSet(Flags.Flag.DELETED))
System.out.println("這封信已被刪除,請返回!");

問題五:我想知道我的郵箱中有多少封信我讀過了有多少封信我沒有讀過, 我該怎麼辦?

我們知道,Folder對象提供了三個方法, getMessageCount,getNewMessageCount和getUnreadMessageCount。 GetMessageCount方法顯示郵箱中總共有多少封信,getNewMessageCount顯示郵箱 中新郵件的封數;getUnreadMessageCount顯示郵箱中已讀郵件的封數。利用這 三個方法,我們可以很容易的看到郵箱中有多少封信我們已經讀到過,有多少沒 有讀。見下面的程序:

import javax.mail.*;
import javax.mail.internet.*;
public class CheckMyMailBox{
public class void main( )
throws Exception{
Properties props= new
// 創建properties對象
Properties props = new Properties();
file://獲得Session
Session session = Session.getDefaultInstance(props, null);
file://獲得Store
Store store=session.getStore(“pop3”);s
store.connect(Pop3Host,username,password);
file://獲得folder,打開INBOX
Folder inbox= store.getFolder(“INBOX”);
file://以只讀方式打開郵件夾
inbox.open(Folder.READ_ONLY);
file://取得郵箱中總共有多少封信
int numberOfTotal = inbox.getMessageCount();
file://取得郵箱中未讀過的信
int numberOfUnread= inbox.getUnreadMessageCount();
System.out.println(“您的郵箱中共有”+ numberOfTotal+”封郵件,其中有 ”+ numberOfUnread+”封沒有讀過”);
file://關閉連接
inbox.close();
store.close();

問題六:我的郵件中有一個附件,我怎麼把它打開呢?

說到郵件中的附件,我不得不說一說Multipart類,Multipart類是Message類 的子類,提供了在郵件中加入附加的實現方法。一個多部分郵件是一個內容類型 (content-type)被設置為multipart的Message對象。Multipart類是一個容器 類,包含Bodypart類型的對象。Bodypart對象是一個Part接口的實例,它既包括 一個新的Multipart容器對象,又包括一個DataHandler對象。

下圖顯示了一個Multipart郵件的結構。

下圖顯示了一個典型的Multipart郵件的嵌套

當郵件中有附件時,郵件的內容就是Multipart而不是我在前面所說的Part類型 了。我們需要取得Multipart的每一部分並根據以需要和內容進行處理。現在讓 我們看一看在程序上是如何實現的:

import java.io.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class getAttachment{
public static void main(String args[])
{
String host=args[0];
String username=args[1];
String userpassword=args[2];
n=3;//為了簡單起見,我默認第三封信為有附件的郵件
Session session =Session.getInstance(new Properties(),null);
Store store=session.getStore("pop3");
store.connect (host,username,userpassword);
Folder folder=store.getFolder ("INBOX");
folder.open(Folder.READ_ONLY);
Message message[]=folder.getMessage();
Object content=message [n].getContent();
if (content instanceof Multipart)
{
handleMultiPart((Multipart)content);
}
else
{
handlePart(message[n]);
}
folder.close();
store.close();
}
public static void handleMultiPart (Multipart multipart)
{
for(int i=0,i
{
handlePart(multipart.getBodyPart(i));
}
}
public static void handlePart(Part part)
{
String disposit=part.getDisposition();
String conType=part.getContentType();
if(disposit==null){//如果只有正文
System.out.println("沒有:"+conType);
file://檢查 是否為普通郵件
if ((conType.length()>=10)&& (conType.toLowerCase().substring(0,10).equals ("text/plain"))){
part.writeTo(System.out);
}
else {
file://可能為HTML格式的郵件,但是本文還不涉及這方面的內 容故不予以考慮。
System.out.println("其它各是的正 文:"+conType);
part.writeTo(System.out);
}
}
else if (disposit.equals(Part.ATTACHMENT))//否則說明郵件中有附件
{
System.out.println("附件:"+part.getFileName() +:conType);
storeFile(part.getFileName(),part.getInputStream ());
}
else {
System.out.println("其 它:"+disposit);
}
}
public static void storeFile (String fileName,InputStream inputstream)//保存文件
{
File file=new File(fileName);
for(int i=0;file.exists();i++)
{
file= new File(fileName+i);
}
FileOutputStream fileoutputstream =new FileOutputStream(file);
BufferedOutputStream bufferedoutputstream =new BufferedOutputStream (fileoutputstream);
BufferedInputStream bufferedinputstream =new BufferedInputStream(BufferedInputStream);
int n;
while ((n=bufferedinputstream.read())!=-1)
{
bufferedoutputstream.write(n);
}
bufferedoutputstream.flush();
bufferedoutputstream.close();
bufferedinputstream.close();
}
}

本文用了一些問題 和相應的解答,和大家探討了JavaMail Api的使用方法,希望本文對大家的學習 和工作有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved