導航:首頁 > 編程語言 > java實現pop3客戶端

java實現pop3客戶端

發布時間:2024-11-01 21:53:36

❶ 什麼是java的工廠模式

factory模式不需要建立什麼抄包,完全得靠你對factory模式的理解,工廠模式基本上應該是體現了一個多態的概念,用戶只關心結果,而不需要關心其具體過程...
工廠模式有三個參與者,抽象產品(Proct)、工廠(Creator)和具體產品(ConcreteProct)。客戶只會看到工廠和抽象產品。

public interface Proct{
public String getName();
}

public class ConcreteProct implements Proct{
public String getName(){
return "產品1";
}
}

public class Creator{
public static Proct create1(){
return new ConcreteProct();
}
}

工廠模式的作用在於將創建具體產品的方法由工廠類控制,客戶只需要知道產品的抽象類型

❷ 如何使用Java發送qq郵件

方法:

1.前提准備工作:
首先,郵件的發送方要開啟POP3 和SMTP服務--即發送qq郵件的賬號要開啟POP3 和SMTP服務

2.開啟方法:
登陸qq郵箱
3.點擊 設置

4.點擊—-賬戶

5.找到:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務 —點擊開啟

6.送簡訊 —–點擊確定

7.稍等一會,很得到一個授權碼! –注意:這個一定要記住,一會用到

8.點擊保存修改 —OK 完成

9.java 測試代碼
package cn.cupcat.test;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
public class SendmailUtil {
public static void main(String[] args) throws AddressException, MessagingException {

Properties properties = new Properties();
properties.put("mail.transport.protocol", "smtp");// 連接協議
properties.put("mail.smtp.host", "smtp.qq.com");// 主機名
properties.put("mail.smtp.port", 465);// 埠號
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.ssl.enable", "true");//設置是否使用ssl安全連接 ---一般都使用
properties.put("mail.debug", "true");//設置是否顯示debug信息 true 會在控制台顯示相關信息
//得到回話對象
Session session = Session.getInstance(properties);
// 獲取郵件對象
Message message = new MimeMessage(session);
//設置發件人郵箱地址
message.setFrom(new InternetAddress("[email protected]"));
//設置收件人地址 message.setRecipients( RecipientType.TO, new InternetAddress[] { new InternetAddress("[email protected]") });
//設置郵件標題
message.setSubject("這是第一封Java郵件");
//設置郵件內容
message.setText("內容為: 這是第一封java發送來的郵件。");
//得到郵差對象
Transport transport = session.getTransport();
//連接自己的郵箱賬戶
transport.connect("[email protected]", "vvctybgbvvophjcj");//密碼為剛才得到的授權碼
//發送郵件 transport.sendMessage(message, message.getAllRecipients());
}
}
10.運行就會發出郵件了。。。。
下面是我收到郵件的截圖,當然我把源碼中的郵件地址都是修改了,不是真實的,你們測試的時候,可以修改能你們自己的郵箱。最後,祝你也能成功,如果有什麼問題,可以一起討論!

注意事項

得到的授權碼一定要保存好,程序中要使用

❸ java中List<E>的get(index)用法

TbEmailPop3Smtp invent = (TbEmailPop3Smtp) listfind.get(i);
在這個地方來的後面加上System.out.println(invent.getPkid());作跟蹤調查,源看看輸出什麼,就知道get(i)有沒有用了。

s.getDbEditDAO().edit(invent);
還有這里是把更改的數據存起來嗎?
如果不是,那你需要加一個存到資料庫裡面的步驟。因為你變的list的值,是放在內存裡面的,想查還是查不到的。

如果是將list存起來,那就多作跟蹤語句,就可以判斷。我遇到問題經常這樣處理的哈。

祝你調試程序成功。由於代碼不詳細,只能說到這里。因為我看這段代碼也沒問題。get(i)就是你寫的那樣的用法

樓上的,你搞錯了吧? list能操作對象的屬性?
LZ有問題的話,網路繼續M我

❹ 幫忙介紹一本電子書,裡面有比較詳細的JavaMaiL的解說

目前好像還真是沒有,我也在找呢,在網上看到篇文章,不知能不能幫你:
JavaMail API詳解
摘要:
JavaMail API是讀取、撰寫、發送電子信息的可選包。我們可用它來建立如Eudora、Foxmail、MS Outlook Express一般的郵件用戶代理程序(Mail User Agent,簡稱MUA)。讓我們看看JavaMail API是如何提供信息訪問功能的吧!JavaMail API被設計用於以不依賴協議的方式去發送和接收電子信息,文中著重:如何以不依賴於協議的方式發送接收電子信息,這也是本文所要描述的.

版權聲明:本文可以自由轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig)
原文:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html
關鍵字:java,mail,pop,smtp

一、JavaMail API簡介
JavaMail API是讀取、撰寫、發送電子信息的可選包。我們可用它來建立如Eudora、Foxmail、MS Outlook Express一般的郵件用戶代理程序(Mail User Agent,簡稱MUA)。而不是像sendmail或者其它的郵件傳輸代理(Mail Transfer Agent,簡稱MTA)程序那樣可以傳送、遞送、轉發郵件。從另外一個角度來看,我們這些電子郵件用戶日常用MUA程序來讀寫郵件,而MUA依賴著MTA處理郵件的遞送。
在清楚了到MUA與MTA之間的關系後,讓我們看看JavaMail API是如何提供信息訪問功能的吧!JavaMail API被設計用於以不依賴協議的方式去發送和接收電子信息,這個API被分為兩大部分:

基本功能:如何以不依賴於協議的方式發送接收電子信息,這也是本文所要描述的,不過在下文中,大家將看到這只是一廂情願而已。
第二個部分則是依賴特定協議的,比如SMTP、POP、IMAP、NNTP協議。在這部分的JavaMail API是為了和伺服器通訊,並不在本文的內容中。

二、相關協議一覽
在我們步入JavaMail API之前,先看一下API所涉及的協議。以下便是大家日常所知、所樂於使用的4大信息傳輸協議:
SMTP
POP
IMAP
MIME
當然,上面的4個協議,並不是全部,還有NNTP和其它一些協議可用於傳輸信息,但是由於不常用到,所以本文便不提及了。理解這4個基本的協議有助於我們更好的使用JavaMail API。然而JavaMail API是被設計為與協議無關的,目前我們並不能克服這些協議的束縛。確切的說,如果我們使用的功能並不被我們選擇的協議支持,那麼JavaMail API並不可能如魔術師一樣神奇的賦予我們這種能力。

1.SMTP
簡單郵件傳輸協議定義了遞送郵件的機制。在下文中,我們將使用基於Java-Mail的程序與公司或者ISP的SMTP伺服器進行通訊。這個SMTP伺服器將郵件轉發到接收者的SMTP伺服器,直至最後被接收者通過POP或者IMAP協議獲取。這並不需要SMTP伺服器使用支持授權的郵件轉發,但是卻的確要注意SMTP伺服器的正確設置(SMTP伺服器的設置與JavaMail API無關)。

2.POP
POP是一種郵局協議,目前為第3個版本,即眾所周知的POP3。POP定義了一種用戶如何獲得郵件的機制。它規定了每個用戶使用一個單獨的郵箱。大多數人在使用POP時所熟悉的功能並非都被支持,例如查看郵箱中的新郵件數量。而這個功能是微軟的Outlook內建的,那麼就說明微軟Outlook之類的郵件客戶端軟體是通過查詢最近收到的郵件來計算新郵件的數量來實現前面所說的功能。因此在我們使用JavaMail API時需要注意,當需要獲得如前面所講的新郵件數量之類的信息時,我們不得不自己進行計算。

3.IMAP
IMAP使用在接收信息的高級協議,目前版本為第4版,所以也被稱為IMAP4。需要注意的是在使用IMAP時,郵件伺服器必須支持該協議。從這個方面講,我們並不能完全使用IMAP來替代POP,不能期待IMAP在任何地方都被支持。假如郵件伺服器支持IMAP,那麼我們的郵件程序將能夠具有以下被IMAP所支持的特性:每個用戶在伺服器上可具有多個目錄,這些目錄能在多個用戶之間共享。
其與POP相比高級之處顯而易見,但是在嘗試採取IMAP時,我們認識到它並不是十分完美的:由於IMAP需要從其它伺服器上接收新信息,將這些信息遞送給用戶,維護每個用戶的多個目錄,這都為郵件伺服器帶來了高負載。並且IMAP與POP的一個不同之處是POP用戶在接收郵件時將從郵件伺服器上下載郵件,而IMAP允許用戶直接訪問郵件目錄,所以在郵件伺服器進行備份作業時,由於每個長期使用此郵件系統的用戶所用的郵件目錄會佔有很大的空間,這將直接導致郵件伺服器上磁碟空間暴漲。

4.MIME
MIME並不是用於傳送郵件的協議,它作為多用途郵件的擴展定義了郵件內容的格式:信息格式、附件格式等等。一些RFC標准都涉及了MIME:RFC 822, RFC 2045, RFC 2046, RFC 2047,有興趣的Matrixer可以閱讀一下。而作為JavaMail API的開發者,我們並不需關心這些格式定義,但是這些格式被用在了程序中。

5.NNTP和其它的第三方協議
正因為JavaMail API在設計時考慮到與第三方協議實現提供商之間的分離,故我們可以很容易的添加一些第三方協議。SUN維護著一個第三方協議實現提供商的列表:http://java.sun.com/procts/javamail/Third_Party.html,通過此列表我們可以找到所需要的而又不被SUN提供支持的第三方協議:比如NNTP這個新聞組協議和S/MIME這個安全的MIME協議。

三、安裝
1.安裝JavaMail
為了使用JavaMail API,需要從http://java.sun.com/procts/javamail/downloads/index.html下載文件名格式為javamail-[version].zip的文件(這個文件中包括了JavaMail實現),並將其中的mail.jar文件添加到CLASSPATH中。這個實現提供了對SMTP、IMAP4、POP3的支持。
注意:在安裝JavaMail實現之後,我們將在demo目錄中發現許多有趣的簡單實常式序。
在安裝了JavaMail之後,我們還需要安裝JavaBeans Activation Framework,因為這個框架是JavaMail API所需要的。如果我們使用J2EE的話,那麼我們並無需單獨下載JavaMail,因為它存在於J2EE.jar中,只需將J2EE.jar加入到CLASSPATH即可。

2.安裝JavaBeans Activation Framework
從http://java.sun.com/procts/javabeans/glasgow/jaf.html下載JavaBeans Activation Framework,並將其添加到CLASSPATH中。此框架增加了對任何數據塊的分類、以及對它們的處理的特性。這些特性是JavaMail API需要的。雖然聽起來這些特性非常模糊,但是它對於我們的JavaMail API來說只是提供了基本的MIME類型支持。
到此為止,我們應當把mail.jar和activation.jar都添加到了CLASSPATH中。
當然如果從方便的角度講,直接把這兩個Jar文件復制到JRE目錄的lib/ext目錄中也可以。

四、初次認識JavaMail API
1.了解我們的JavaMail環境
A.縱覽JavaMail核心類結構
打開JavaMail.jar文件,我們將發現在javax.mail的包下面存在著一些核心類:Session、Message、Address、Authenticator、Transport、Store、Folder。而且在javax.mail.internet包中還有一些常用的子類。
B.Session
Session類定義了基本的郵件會話。就像Http會話那樣,我們進行收發郵件的工作都是基於這個會話的。Session對象利用了java.util.Properties對象獲得了郵件伺服器、用戶名、密碼信息和整個應用程序都要使用到的共享信息。
Session類的構造方法是私有的,所以我們可以使用Session類提供的getDefaultInstance()這個靜態工廠方法獲得一個默認的Session對象:

Properties props = new Properties();
// fill props with any information
Session session = Session.getDefaultInstance(props, null);

或者使用getInstance()這個靜態工廠方法獲得自定義的Session:

Properties props = new Properties();
// fill props with any information
Session session = Session.getInstance(props, null);

從上面的兩個例子中不難發現,getDefaultInstance()和getInstance()方法的第二個參數都是null,這是因為在上面的例子中並沒有使用到郵件授權,下文中將對授權進行詳細介紹。
從很多的實例看,在對mail server進行訪問的過程中使用共享的Session是足夠的,即使是工作在多個用戶郵箱的模式下也不例外。

C.Message
當我們建立了Session對象後,便可以被發送的構造信息體了。在這里SUN提供了Message類型來幫助開發者完成這項工作。由於Message是一個抽象類,大多數情況下,我們使用javax.mail.internet.MimeMessage這個子類,該類是使用MIME類型、MIME信息頭的郵箱信息。信息頭只能使用US-ASCII字元,而非ASCII字元將通過編碼轉換為ASCII的方式使用。
為了建立一個MimeMessage對象,我們必須將Session對象作為MimeMessage構造方法的參數傳入:

MimeMessage message = new MimeMessage(session);

注意:對於MimeMessage類來講存在著多種構造方法,比如使用輸入流作為參數的構造方法。

在建立了MimeMessage對象後,我們需要設置它的各個part,對於MimeMessage類來說,這些part就是MimePart介面。最基本的設置信息內容的方法就是通過表示信息內容和米么類型的參數調用setContent()方法:

message.setContent("Hello", "text/plain");

然而,如果我們所使用的MimeMessage中信息內容是文本的話,我們便可以直接使用setText()方法來方便的設置文本內容。

message.setText("Hello");

前面所講的兩種方法,對於文本信息,後者更為合適。而對於其它的一些信息類型,比如HTML信息,則要使用前者。
別忘記了,使用setSubject()方法對郵件設置郵件主題:

message.setSubject("First");

D.Address
到這里,我們已經建立了Session和Message,下面將介紹如何使用郵件地址類:Address。像Message一樣,Address類也是一個抽象類,所以我們將使用javax.mail.internet.InternetAddress這個子類。
通過傳入代表郵件地址的字元串,我們可以建立一個郵件地址類:

Address address = new InternetAddress("[email protected]");

如果要在郵件地址後面增加名字的話,可以通過傳遞兩個參數:代表郵件地址和名字的字元串來建立一個具有郵件地址和名字的郵件地址類:

Address address = new InternetAddress("[email protected]", "George Bush");

本文在這里所講的郵件地址類是為了設置郵件信息的發信人和收信人而准備的,在建立了郵件地址類後,我們通過message的setFrom()和setReplyTo()兩種方法設置郵件的發信人:

message.setFrom(address);
message.setReplyTo(address);

若在郵件中存在多個發信人地址,我們可用addForm()方法增加發信人:

Address address[] = ...;
message.addFrom(address);

為了設置收信人,我們使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量來區分收信人的類型:

message.addRecipient(type, address)

下面是Message.RecipientType的三個常量:
Message.RecipientType.TO
Message.RecipientType.CC
Message.RecipientType.BCC
因此,如果我們要發送郵件給總統,並發用一個副本給第一夫人的話,下面的方法將被用到:

Address toAddress = new InternetAddress("[email protected]");
Address ccAddress = new InternetAddress("[email protected]");
message.addRecipient(Message.RecipientType.TO, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);

JavaMail API並沒有提供檢查郵件地址有效性的機制。當然我們可以自己完成這個功能:驗證郵件地址的字元是否按照RFC822規定的格式書寫或者通過DNS伺服器上的MX記錄驗證等。

E.Authenticator
像java.net類那樣,JavaMail API通過使用授權者類(Authenticator)以用戶名、密碼的方式訪問那些受到保護的資源,在這里「資源」就是指郵件伺服器。在javax.mail包中可以找到這個JavaMail的授權者類(Authenticator)。
在使用Authenticator這個抽象類時,我們必須採用繼承該抽象類的方式,並且該繼承類必須具有返回PasswordAuthentication對象(用於存儲認證時要用到的用戶名、密碼)getPasswordAuthentication()方法。並且要在Session中進行注冊,使Session能夠了解在認證時該使用哪個類。
下面代碼片斷中的MyAuthenticator就是一個Authenticator的子類。

Properties props = new Properties();
// fill props with any information
Authenticator auth = new MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);

F.Transport
在發送信息時,Transport類將被用到。這個類實現了發送信息的協議(通稱為SMTP),此類是一個抽象類,我們可以使用這個類的靜態方法send()來發送消息:

Transport.send(message);

當然,方法是多樣的。我們也可由Session獲得相應協議對應的Transport實例。並通過傳遞用戶名、密碼、郵件伺服器主機名等參數建立與郵件伺服器的連接,並使用sendMessage()方法將信息發送,最後關閉連接:

message.saveChanges(); // implicit with send()
Transport transport = session.getTransport("smtp");
transport.connect(host, username, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();

評論:上面的方法是一個很好的方法,尤其是在我們在同一個郵件伺服器上發送多個郵件時。因為這時我們將在連接郵件伺服器後連續發送郵件,然後再關閉掉連接。send()這個基本的方法是在每次調用時進行與郵件伺服器的連接的,對於在同一個郵件伺服器上發送多個郵件來講可謂低效的方式。
注意:如果需要在發送郵件過程中監控mail命令的話,可以在發送前設置debug標志:

session.setDebug(true)。

G.Store和Folder
接收郵件和發送郵件很類似都要用到Session。但是在獲得Session後,我們需要從Session中獲取特定類型的Store,然後連接到Store,這里的Store代表了存儲郵件的郵件伺服器。在連接Store的過程中,極有可能需要用到用戶名、密碼或者Authenticator。

// Store store = session.getStore("imap");
Store store = session.getStore("pop3");
store.connect(host, username, password);

在連接到Store後,一個Folder對象即目錄對象將通過Store的getFolder()方法被返回,我們可從這個Folder中讀取郵件信息:

Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[] = folder.getMessages();

上面的例子首先從Store中獲得INBOX這個Folder(對於POP3協議只有一個名為INBOX的Folder有效),然後以只讀(Folder.READ_ONLY)的方式打開Folder,最後調用Folder的getMessages()方法得到目錄中所有Message的數組。

注意:對於POP3協議只有一個名為INBOX的Folder有效,而對於IMAP協議,我們可以訪問多個Folder(想想前面講的IMAP協議)。而且SUN在設計Folder的getMessages()方法時採取了很智能的方式:首先接收新郵件列表,然後再需要的時候(比如讀取郵件內容)才從郵件伺服器讀取郵件內容。
在讀取郵件時,我們可以用Message類的getContent()方法接收郵件或是writeTo()方法將郵件保存,getContent()方法只接收郵件內容(不包含郵件頭),而writeTo()方法將包括郵件頭。

System.out.println(((MimeMessage)message).getContent());

在讀取郵件內容後,別忘記了關閉Folder和Store。

folder.close(aBoolean);
store.close();

傳遞給Folder.close()方法的boolean 類型參數表示是否在刪除操作郵件後更新Folder。

H.繼續向前進!
在講解了以上的七個Java Mail核心類定義和理解了簡單的代碼片斷後,下文將詳細講解怎樣使用這些類實現JavaMail API所要完成的高級功能。

五、使用JavaMail API
在明確了JavaMail API的核心部分如何工作後,本人將帶領大家學習一些使用Java Mail API任務案例。
1.發送郵件
在獲得了Session後,建立並填入郵件信息,然後發送它到郵件伺服器。這便是使用Java Mail API發送郵件的過程,在發送郵件之前,我們需要設置SMTP伺服器:通過設置Properties的mail.smtp.host屬性。

String host = ...;
String from = ...;
String to = ...;

// Get system properties
Properties props = System.getProperties();

// Setup mail server
props.put("mail.smtp.host", host);

// Get session
Session session = Session.getDefaultInstance(props, null);

// Define message
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
message.setSubject("Hello JavaMail");
message.setText("Welcome to JavaMail");
// Send message
Transport.send(message);

由於建立郵件信息和發送郵件的過程中可能會拋出異常,所以我們需要將上面的代碼放入到try-catch結構塊中。

2.接收郵件
為了在讀取郵件,我們獲得了session,並且連接到了郵箱的相應store,打開相應的Folder,然後得到我們想要的郵件,當然別忘記了在結束時關閉連接。

String host = ...;
String username = ...;
String password = ...;

// Create empty properties
Properties props = new Properties();

// Get session
Session session = Session.getDefaultInstance(props, null);

// Get the store
Store store = session.getStore("pop3");
store.connect(host, username, password);

// Get folder
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);

// Get directory
Message message[] = folder.getMessages();

for (int i=0, n=message.length; i<n; i++) {
System.out.println(i + ": " + message[i].getFrom()[0]
+ "\t" + message[i].getSubject());
}

// Close connection
folder.close(false);
store.close();

上面的代碼所作的是從郵箱中讀取每個郵件,並且顯示郵件的發信人地址和主題。從技術角度講,這里存在著一個異常的可能:當發信人地址為空時,getFrom()[0]將拋出異常。

下面的代碼片斷有效的說明了如何讀取郵件內容,在顯示每個郵件發信人和主題後,將出現用戶提示從而得到用戶是否讀取該郵件的確認,如果輸入YES的話,我們可用Message.writeTo(java.io.OutputStream os)方法將郵件內容輸出到控制台上,關於Message.writeTo()的具體用法請看JavaMail API。

BufferedReader reader = new BufferedReader (
new InputStreamReader(System.in));

// Get directory
Message message[] = folder.getMessages();
for (int i=0, n=message.length; i<n; i++) {
System.out.println(i + ": " + message[i].getFrom()[0]
+ "\t" + message[i].getSubject());

System.out.println("Do you want to read message? " +
"[YES to read/QUIT to end]");
String line = reader.readLine();
if ("YES".equals(line)) {
message[i].writeTo(System.out);
} else if ("QUIT".equals(line)) {
break;
}
}

3.刪除郵件和標志
設置與message相關的Flags是刪除郵件的常用方法。這些Flags表示了一些系統定義和用戶定義的不同狀態。在Flags類的內部類Flag中預定義了一些標志:
Flags.Flag.ANSWERED
Flags.Flag.DELETED
Flags.Flag.DRAFT
Flags.Flag.FLAGGED
Flags.Flag.RECENT
Flags.Flag.SEEN
Flags.Flag.USER
但需要在使用時注意的:標志存在並非意味著這個標志被所有的郵件伺服器所支持。例如,對於刪除郵件的操作,POP協議不支持上面的任何一個。所以要確定哪些標志是被支持的——通過訪問一個已經打開的Folder對象的getPermanetFlags()方法,它將返回當前被支持的Flags類對象。
刪除郵件時,我們可以設置郵件的DELETED標志:

message.setFlag(Flags.Flag.DELETED, true);

但是首先要採用READ_WRITE的方式打開Folder:

folder.open(Folder.READ_WRITE);

在對郵件進行刪除操作後關閉Folder時,需要傳遞一個true作為對刪除郵件的擦除確認。

folder.close(true);

Folder類中另一種用於刪除郵件的方法expunge()也同樣可刪除郵件,但是它並不為sun提供的POP3實現支持,而其它第三方提供的POP3實現支持或者並不支持這種方法。
另外,介紹一種檢查某個標志是否被設置的方法:Message.isSet(Flags.Flag flag)方法,其中參數為被檢查的標志。

4.郵件認證
我們在前面已經學會了如何使用Authenticator類來代替直接使用用戶名和密碼這兩字元串作為Session.getDefaultInstance()或者Session.getInstance()方法的參數。在前面的小試牛刀後,現在我們將了解到全面認識一下郵件認證。
我們在此取代了直接使用郵件伺服器主機名、用戶名、密碼這三個字元串作為連接到POP3 Store的方式,使用存儲了郵件伺服器主機名信息的屬性文件,並在獲得Session時傳入自定義的Authenticator實例:

// Setup properties
Properties props = System.getProperties();
props.put("mail.pop3.host", host);

// Setup authentication, get session
Authenticator auth = new PopupAuthenticator();
Session session = Session.getDefaultInstance(props, auth);

// Get the store
Store store = session.getStore("pop3");
store.connect();

PopupAuthenticator類繼承了抽象類Authenticator,並且通過重載Authenticator類的getPasswordAuthentication()方法返回PasswordAuthentication類對象。而getPasswordAuthentication()方法的參數param是以逗號分割的用戶名、密碼組成的字元串。

import javax.mail.*;
import java.util.*;

public class PopupAuthenticator extends Authenticator {

public PasswordAuthentication getPasswordAuthentication(String param) {
String username, password;

StringTokenizer st = new StringTokenizer(param, ",");
username = st.nextToken();
password = st.nextToken();

return new PasswordAuthentication(username, password);
}

}

5.回復郵件
回復郵件的方法很簡單:使用Message類的reply()方法,通過配置回復郵件的收件人地址和主題(如果沒有提供主題的話,系統將默認將「Re:」作為郵件的主體),這里不需要設置任何的郵件內容,只要復制發信人或者reply-to到新的收件人。而reply()方法中的boolean參數表示是否將郵件回復給發送者(參數值為false),或是恢復給所有人(參數值為true)。
補充一下,reply-to地址需要在發信時使用setReplyTo()方法設置。

MimeMessage reply = (MimeMessage)message.reply(false);
reply.setFrom(new InternetAddress("[email protected]"));
reply.setText("Thanks");
Transport.send(reply);

6.轉發郵件
轉發郵件的過程不如前面的回復郵件那樣簡單,它將建立一個轉發郵件,這並非一個方法就能做到。
每個郵件是由多個部分組成,每個部分稱為一個郵件體部分,是一個BodyPart類對象,對於MIME類型郵件來講就是MimeBodyPart類對象。這些郵件體包含在成為Multipart的容器中對於MIME類型郵件來講就是MimeMultiPart類對象。在轉發郵件時,我們建立一個文字郵件體部分和一個被轉發的文字郵件體部分,然後將這兩個郵件體放到一個Multipart中。說明一下,復制一個郵件內容到另一個郵件的方法是僅復制它的DataHandler(數據處理者)即可。這是由JavaBeans Activation Framework定義的一個類,它提供了對郵件內容的操作命令的訪問、管理了郵件內容操作,是不同的數據源和數據格式之間的一致性介面。

// Create the message to forward
Message forward = new MimeMessage(session);

// Fill in header
forward.setSubject("Fwd: " + message.getSubject());
forward.setFrom(new InternetAddress(from));
forward.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));

// Create your new message part
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(
"Here you go with the original message:\n\n");

// Create a multi-part to combine the parts
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);

// Create and fill part for the forwarded content
messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(message.getDataHandler());

// Add part to multi part
multipart.addBodyPart(messageBodyPart);

// Associate multi-part with message
forward.setContent(multipart);

// Send message
Tran

❺ java發送郵件時出現的錯誤,埠什麼的都開了

今天在做內網郵箱發送功能時報如下錯誤:
554 Relay rejected for policy reasons.
測試時給內容郵箱發送正常,給126發送就報如上錯誤,後來查看是許可權限制的問題。
在網上查找到郵件發送時的常見問題總結,備注一下。
介紹郵件系統常見的錯誤代碼及解釋,還有客戶端報錯相關信息
按照下列「Q」代表問題,「A」代表解答。

Q:the server says:550 relaying mail to <> is not allowed
Q:The server says:550 <>... relaying denied
Q:the server says:550 5.7.1 relaying not permitted:
A:使用某些Smtp伺服器時,限制了收件人的地址,只能換一個Smtp伺服器。

Q:The server says:550 <>:local user only
Q:The server says:550 <>:Invalid User
Q:The server says:550 Invalid recipient
A:使用163.NET,163.com,yeah.Net和netease.com之類的Smtp伺服器時,只能用自身的信箱發信,所以要在Outlook Express的「帳戶屬性」中的「個人信息」裡面填寫正確的郵件地址。

Q:the server says:551 delivery not allowed to non-local recipient
Q:The server says:553 Relay restriction.
Q:The server says:553 From <>, message blocked.
Q:The server says:553 sorry,you are not allow to use this SMTP to relay your eami
Q:The server says:553 sorry, that domain isn't in my list of allowed rcpthosts
A:使用21cn.com,china.com,371.net,sina.com等大多數信箱的smtp伺服器時,只能用自身的信箱發信,所以要在Outlook Express的「帳戶屬性」中的「個人信息」裡面填寫正確的郵件地址。

Q:The server says:505 client was not authenticated
Q:The server says:553 authentication is required to send mail as <>
A:使用263.net和sohu.com的Smtp伺服器時,不但要用自身的郵箱發信,而且要加入身份驗證,所以即要在「個人信息」中填寫正確郵箱地址,又要選中「SMTP伺服器需要認證」。

Q:The server says:535 Error:authenticatin failed
Q:The server says:535 Authentication unsuccessful
Q:The server says:452 Insufficient system storage
A:在使用Esmtp認證的過程中出錯,檢查一下Esmtp設置,多試幾次。

Q:The server says:553 <>...domain name required
Q:The server says:550 Unable to relay for ...
A:多出現在用Wingate代理伺服器發送郵件時。雖然在Wingate中「POP3 郵箱帳號」要使用「用戶名#POP3地址」的格式,但在「帳戶屬性」中的「個人信息」中還是要填寫一般的格式。

Q:The server says:553 mailbox name not allowed
A:收件人郵箱地址不允許,需檢查收件人地址是否正確。

Q:the server says:553 sorry, your envelop sender is in my badmailfrom list
A:伺服器限制了收件人的地址,只能換一個smtp伺服器發信。

Q:the server says:554 Transaction failed
Q:The server says:451 Requested action aborted,errno=28
A:傳輸失敗,檢查網路問題。

Q:the server says:503 error:needmail command
Q:The server says:503 need mail before RCPT.
Q:The server says:503 Bad sequence of commands
A:消息命令順序出錯,一般出現在其他錯誤之後,先檢查之前出現的錯誤提示。

Q:The Server says:501 syntax.helo hostname
Q:The server says:501 Invalid domain name
Q:The server says:502 unimplemented command
Q:the server says:503 5.0.0 polite people say HELO first
Q:The server says:533 relay restriction
Q:The server says:544 <>:Recipient address rejected: Relay access denied
A:傳輸中的語法錯誤,原因不明。
連接伺服器錯誤,請檢查您的網路設置。如果安裝防火牆/殺毒軟體,請檢查防火牆/殺毒軟體是否允許DreamMail程序訪問 Internet。
賬號「xxx」發送郵件錯誤,錯誤代碼:554;錯誤信息:554 Relay rejected for policy reasons.(檢查郵件系統是否有發送外網郵箱的許可權)

附相關資料
SMTP 有一組固定的響應代碼,表示郵件伺服器對於傳送郵件要求的響應狀況。其中 421、450、451、452、550、551、552、553、554 等 9 組代碼表示您要求郵件伺服器執行的動作不成功。

354
Start Mail input
開始傳輸郵件正文

421
<domain> Service not available, closing transmission channel
括弧內的主機無法提供正常服務,關閉傳送管道,郵件將滯留在主機上

440
郵件址錯誤

445
Server Rejected
被封鎖

450
Client host rejected, Cannot resolve PTR
Temporary Process Error
Resource temporarily unaviable,please try again later
Requested mail action not taken: mailbox unavailable
無法 IP 反查

Requested mail action not taken: mailbox unavailable
所要求的郵件動作無法執行:郵件信箱無法提供服務,郵件將滯留在主機上
451
Domain of sender address [email protected] does not resolve
qq trouble creating files in queue (#4.3.0)
queuename: Cannot create "qfCAA21081" in "/var/spool/mqueue" (euid=0): No space left on device
Requested action aborted, errno=28.
無法解析寄件者郵件地址

Requested action aborted: local error in processing
要求動作中斷:本地端錯誤

Requested action aborted,errno=28
傳送失敗,檢查網路問題。

452
Message for would exceed mailbox quota
Requested action not taken: insufficient system storage
要求動作無法執行:系統空間不足

Insufficient system storage
在使用Esmtp認證的過程中出錯,檢查一下Esmtp設置,多試幾次。

454
Client was not authenticated
安全因素,被封鎖

472
[email protected] no DNS A-data returned
無法 IP 反查

501
Domain of sender address [email protected] does not exist
無法 IP 反查

Mailbox not found
5.1.1 ... User unknown
無此使用者

Syntax error,parameters in command "RCPT TO:[email protected]>"unrecognized or missing
no local part
Syntax error in recipient:
"@" or "." expected after "CC"
"@" or "." expected after "fau" :
email格式l錯誤
503
Either sender or receiver must be local account.
安全因素,許可權不足
[email protected]
無此使用者,不是本主機轉送信件的使用者

error:needmail command
need mail before RCPT
Bad sequence of commands
消息命令順序出錯,一般出現在其他錯誤之後,先檢查之前出現的錯誤提示。

5.0.0 polite people say HELO first
傳輸中的語法錯誤,原因不明
505
client was not authenticated
使用263.net和sohu.com的Smtp伺服器時,不但要用自身的郵箱發信,而且要加入身份驗證,所以即要在"個人信息"中填寫正確郵箱地址,又要選中"SMTP伺服器需要認證"。

521
This system is configured to reject mail from 211.20.70.148
安全因素,被封鎖

535
Error:authenticatin failed
Authentication unsuccessful
在使用Esmtp認證的過程中出錯,檢查一下Esmtp設置,多試幾次。

550
unknown user
User unknown
Invalid User
Recipient unknown
Mailbox disabled for this recipient
Unknown local part
Invalid recipient
Unable to relay for no such user
Recipient unknown
This account is not allowed
recipient unknown
No such mail drop defined,user disabled
I don't know
Relaying is prohibited
Relaying denied
relaying mail to <> is not allowed
<>... relaying denied
5.7.1 relaying not permitted:
REJECT SMTP Protocol Returned a Permanent Error 550 Forwarding percent hack is not permitted
Requested action not taken: mailbox unavailable
無此使用者,所要求動作無法執行:信箱不存在,郵件將退回給寄件者,或者限制了收件人的地址,只能換一個Smtp伺服器。

System is busy
郵件系統錯誤

Subj similar too many!!
太多同主題信件

Relaying denied. IP name lookup failed
IP name lookup failed
DNS FAILURE
cannot route to sender address
無法 IP 反查

Relaying denied
Mailbox unavailable: This site may not be used as a relay agent.
無法轉寄

<>:local user only
<>:Invalid User
Invalid recipient
使用163.net,163.com,yeah.net和netease.com之類的Smtp伺服器時,只能用自身的信箱發信,所以要在Outlook Express的"帳戶屬性"中的"個人信息"裡面填寫正確的郵件地址。

Unable to relay for ...
多出現在用Wingate代理伺服器發送郵件時。雖然在Wingate中"POP3 郵箱帳號"要使用"用戶名#POP3地址"的格式,但在"帳戶屬性"中的"個人信息"中還是要填寫一般的格式。

551
we do not relay ...
delivery not allowed to non-local recipient
無法轉寄,使用21cn.com,china.com,371.net,sina.com等大多數信箱的smtp伺服器時,只能用自身的信箱發信,所以要在Outlook Express的"帳戶屬性"中的"個人信息"裡面填寫正確的郵件地址。

User not local; please try <forward-path>
郵件伺服器知道使用者不屬於本地端,將嘗試括弧內的轉送路徑

552
Requested mail action aborted: exceeded storage allocation
所要求的動作中斷:超出所分配的儲存空間,郵件將退回給寄件者
Sorry, we don't allow mail from your host.
被封鎖

553
sorry, that domain isn't in my list of allowed rcpthosts
mailbox name not allowed
郵件地址錯誤
Requested action not taken: mailbox name not allowed
sorry, your envelop sender is in my badmailfrom list
所要求的動作未執行:信箱不允許該動作執行 ,或者伺服器限制了收件人的地址,只能換一個smtp伺服器發信。

Relay restriction.
From <>, message blocked.
sorry,you are not allow to use this SMTP to relay your eami
sorry, that domain isn't in my list of allowed rcpthosts
使用21cn.com,china.com,371.net,sina.com等大多數信箱的smtp伺服器時,只能用自身的信箱發信,所以要在Outlook Express的"帳戶屬性"中的"個人信息"裡面填寫正確的郵件地址。

authentication is required to send mail as <>
使用263.net和sohu.com的Smtp伺服器時,不但要用自身的郵箱發信,而且要加入身份驗證,所以即要在"個人信息"中填寫正確郵箱地址,又要選中"SMTP伺服器需要認證"。

<>...domain name required
多出現在用Wingate代理伺服器發送郵件時。雖然在Wingate中"POP3 郵箱帳號"要使用"用戶名#POP3地址"的格式,但在"帳戶屬性"中的"個人信息"中還是要填寫一般的格式。

554
delivery error: dd This user doesn't have a yahoo.com account
delivery error: dd Sorry, your message to xxxxyahoo.com cannot be delivered. This account is over quota.
無此使用者

Transaction failed
傳送失敗,檢查網路問題。

571
we don't accept junk mail (mail.sysnet.net.tw)
無效的寄件者

❻ 利用javamail和POP3、SMPT協議實現郵件的收發

一 簡介 SMTP 的全稱是 Simple Mail Transfer Protocol 即簡單郵件傳輸協議 用於郵件發送 SMTP 認證 簡單地說就是要求必須在提供了賬戶名和密碼之後才可以登錄 SMTP 伺服器 POP (Post Office Protocol )協議允許電子郵件客戶端下載伺服器上的郵件 但是在客戶端的操作(如移動郵件 標記已讀等) 不會反饋到伺服器上 比如通過客戶端收取了郵箱中的 封郵件並移動到其他文件夾 郵箱伺服器上的這些郵件是沒有同時被移動的 而IMAP(Internet Mail Access Protocol)提供webmail 與電子郵件客戶端之間的雙向通信 客戶端的操作都會反饋到伺服器上 對郵件進行的操作 伺服器上的郵件也會做相應的動作 同時 IMAP像POP 那樣提供了方便的郵件下載服務 讓用戶能進行離線閱讀 IMAP提供的摘要瀏覽功能可以讓你在閱讀完所有的郵件到達時間 主題 發件人 大小等信息後才作出是否下載的決定 此外 IMAP 更好地支持了從多個不同設備中隨時訪問新郵件 總之 IMAP 整體上為用戶帶來更為便捷和可靠的體驗 POP 更易丟失郵件或多次下載相同的郵件 但 IMAP 通過郵件客戶端與webmail 之間的雙向同步功能很好地避免了這些問題 注 若在web郵箱中設置了 保存到已發送 使用客戶端POP服務發信時 已發郵件也會自動同步到網頁端 已發送 文件夾內 二 利用SMTP協議發送郵件 package like email;import java io File;import java io UnsupportedEncodingException;import java util ArrayList;import java util Properties;import javax activation DataHandler;import javax activation DataSource;import javax activation FileDataSource;import javax mail Authenticator;import javax mail BodyPart;import javax mail Message;import javax mail MessagingException;import javax mail Multipart;import javax mail Session;import javax mail Transport;import javax mail internet AddressException;import javax mail internet InternetAddress;import javax mail internet MimeBodyPart;import javax mail internet MimeMessage;import javax mail internet MimeMultipart;/*** @author like* @E mail k* @CreateTime 下午 : : */public class SMTPSendTest {private static final int RECEIPT = ;private static final String attachmentDir = ;public static void sendEmail(Email emailInfo) throws UnsupportedEncodingException MessagingException {Properties props = new Properties() props put( mail *** tp host emailInfo getSmtpServer()) props put( mail *** tp port emailInfo getSmtpPort()) props put( mail *** tp auth true ) Authenticator auth = new SMTPAuthenticator(emailInfo getUsername() emailInfo getPassword()) Session session = Session getInstance(props auth) session setDebug(false) Message msg = new MimeMessage(session) msg setFrom(new InternetAddress(emailInfo getFrom() emailInfo getFromName())) msg setRecipients(Message RecipientType TO getEmailRecipient(emailInfo getTO())) msg setRecipients(Message RecipientType CC getEmailRecipient(emailInfo getCC())) msg setRecipients(Message RecipientType BCC getEmailRecipient(emailInfo getBCC())) if (emailInfo getReceipt() == RECEIPT) {msg setHeader( Disposition Notification To emailInfo getFrom()) }msg setSubject(emailInfo getSubject()) // 設置郵件內容(包括附件的HTML格式內容)msg setContent(getMultipart(emailInfo getContent() attachmentDir emailInfo getAttachment())) msg saveChanges() Transport send(msg) }/*** 封裝郵件地址** @param address* @return* @throws AddressException*/private static InternetAddress[] getEmailRecipient(ArrayList<String> address) throws AddressException {int toLen = ;if (address != null) {toLen = address size() }InternetAddress[] addressTo = new InternetAddress[toLen];if (toLen != ) {String m_st_email = ;for (int i = ; i < toLen; i++) {m_st_email = (String) address get(i) if (m_st_email != null)addressTo[i] = new InternetAddress(m_st_email trim()) }}return addressTo;}private static Multipart getMultipart(String text String attachParentDir ArrayList<String> attachment) throws MessagingException {

lishixin/Article/program/Java/hx/201311/26993

❼ java如何使用ssl連接qq郵箱

Gmail目前已經啟用了POP3和SMTP服務,與其他郵箱不同的是Gmail提供的POP3和SMTP是使用安全套接字層SSL的,因此常規的JavaMail程序是無法收發郵件的,下面是使用JavaMail如何收取Gmail郵件以及發送郵件的代碼:
1.[代碼]GmailFetch.java跳至[1][2][全屏預覽]
01packagelius.javamail.ssl;
02
03importjava.io.UnsupportedEncodingException;
04importjava.security.*;
05importjava.util.Properties;
06importjavax.mail.*;
07importjavax.mail.internet.InternetAddress;
08importjavax.mail.internet.MimeUtility;
09
10/**
11*用於收取Gmail郵件
12*@authorWinterLau
13*/
14publicclassGmailFetch{
15
16publicstaticvoidmain(Stringargv[])throwsException{
17
18Security.addProvider(newcom.sun.net.ssl.internal.ssl.Provider());
19finalStringSSL_FACTORY="javax.net.ssl.SSLSocketFactory";
20
21//GetaPropertiesobject
22Propertiesprops=System.getProperties();
23props.setProperty("mail.pop3.socketFactory.class",SSL_FACTORY);
24props.setProperty("mail.pop3.socketFactory.fallback","false");
25props.setProperty("mail.pop3.port","995");
26props.setProperty("mail.pop3.socketFactory.port","995");
27
28//以下步驟跟一般的JavaMail操作相同
29Sessionsession=Session.getDefaultInstance(props,null);
30
31//請將紅色部分對應替換成你的郵箱帳號和密碼
32URLNameurln=newURLName("pop3","pop.gmail.com",995,null,
33"[郵箱帳號]","[郵箱密碼]");
34Storestore=session.getStore(urln);
35Folderinbox=null;
36try{
37store.connect();
38inbox=store.getFolder("INBOX");
39inbox.open(Folder.READ_ONLY);
40FetchProfileprofile=newFetchProfile();
41profile.add(FetchProfile.Item.ENVELOPE);
42Message[]messages=inbox.getMessages();
43inbox.fetch(messages,profile);
44System.out.println("收件箱的郵件數:"+messages.length);
45for(inti=0;i<messages.length;i++){
46//郵件發送者
47Stringfrom=decodeText(messages[i].getFrom()[0].toString());
48InternetAddressia=newInternetAddress(from);
49System.out.println("FROM:"+ia.getPersonal()+'('+ia.getAddress()+')');
50//郵件標題
51System.out.println("TITLE:"+messages[i].getSubject());
52//郵件大小
53System.out.println("SIZE:"+messages[i].getSize());
54//郵件發送時間
55System.out.println("DATE:"+messages[i].getSentDate());
56}
57}finally{
58try{
59inbox.close(false);
60}catch(Exceptione){}
61try{
62store.close();
63}catch(Exceptione){}
64}
65}
66
(Stringtext)
{
69if(text==null)
70returnnull;
71if(text.startsWith("=?GB")||text.startsWith("=?gb"))
72text=MimeUtility.decodeText(text);
73else
74text=newString(text.getBytes("ISO8859_1"));
75returntext;
76}
77
78}
2.[代碼]GmailSender.java
01packagelius.javamail.ssl;
02
03importjava.security.Security;
04importjava.util.Date;
05importjava.util.Properties;
06
07importjavax.mail.Authenticator;
08importjavax.mail.Message;
09importjavax.mail.MessagingException;
10importjavax.mail.PasswordAuthentication;
11importjavax.mail.Session;
12importjavax.mail.Transport;
13importjavax.mail.internet.AddressException;
14importjavax.mail.internet.InternetAddress;
15importjavax.mail.internet.MimeMessage;
16
17/**
18*使用Gmail發送郵件
19*@authorWinterLau
20*/
21publicclassGmailSender{
22
23publicstaticvoidmain(String[]args)throwsAddressException,MessagingException{
24Security.addProvider(newcom.sun.net.ssl.internal.ssl.Provider());
25finalStringSSL_FACTORY="javax.net.ssl.SSLSocketFactory";
26//GetaPropertiesobject
27Propertiesprops=System.getProperties();
28props.setProperty("mail.smtp.host","smtp.gmail.com");
29props.setProperty("mail.smtp.socketFactory.class",SSL_FACTORY);
30props.setProperty("mail.smtp.socketFactory.fallback","false");
31props.setProperty("mail.smtp.port","465");
32props.setProperty("mail.smtp.socketFactory.port","465");
33props.put("mail.smtp.auth","true");
34finalStringusername="[郵箱帳號]";
35finalStringpassword="[郵箱密碼]";
36Sessionsession=Session.getDefaultInstance(props,newAuthenticator(){
(){
(username,password);
39}});
40
41//--Createanewmessage--
42Messagemsg=newMimeMessage(session);
43
44//--SettheFROMandTOfields--
45msg.setFrom(newInternetAddress(username+"@mo168.com"));
46msg.setRecipients(Message.RecipientType.TO,
47InternetAddress.parse("[收件人地址]",false));
48msg.setSubject("Hello");
49msg.setText("Howareyou");
50msg.setSentDate(newDate());
51Transport.send(msg);
52
53System.out.println("Messagesent.");
54}
55}

閱讀全文

與java實現pop3客戶端相關的資料

熱點內容
星巴克app余額哪裡查詢 瀏覽:255
asp自動保存文件到本地 瀏覽:895
電腦文件一直顯示被佔用無法發送 瀏覽:746
建行app歷史消費 瀏覽:112
華為p7升級好不好 瀏覽:708
怎麼取消網路密碼怎麼設置密碼 瀏覽:380
大疆osmo2用什麼app連接 瀏覽:827
淘寶釣魚網站源碼下載 瀏覽:272
省心家長app如何綁定校卡 瀏覽:228
工科科研都需要什麼編程 瀏覽:938
ftp下載文件夾 瀏覽:751
怎麼給自己的qq傳文件在哪裡 瀏覽:18
可以鎖好多密碼的軟體 瀏覽:676
微信翻譯不準確 瀏覽:858
蘋果6p怎麼抹除id信息 瀏覽:660
演算法比較cpu和內存使用率的工具 瀏覽:941
基本操作文件找不到 瀏覽:487
404找不到文件怎麼回事 瀏覽:752
買房什麼網站好 瀏覽:972
win10完gtasa 瀏覽:494

友情鏈接