48、郵件的傳送
學習過程:
一、郵件簡介
郵件實現並不是一個必須要完成的功能,這裡就簡單介紹一下。不過由於現在的郵件伺服器安全性已經升級了,所以有些伺服器不一定能正常運行了。
和操作資料庫一樣,其實我們並不是要開發一個郵件伺服器,java實現的只是一個客戶端,我們要做的事情是連線到郵件伺服器,讓郵件伺服器傳送或者接受郵件,所以實現起來是非常簡單的。優先我們先連線一下連線郵件伺服器的兩個最基本的協議。
當前常用的電子郵件協議有SMTP、POP3、IMAP4,它們都隸屬於TCP/IP協議簇,預設狀態下,分別通過TCP埠25、110和143建立連線。下面分別對其進行簡單介紹。
1、SMTP協議。
SMTP的全稱是“Simple Mail Transfer Protocol”,翻譯一下就是簡單郵件傳輸協議。SMTP就是郵件傳送的標準協議。它是一組用於從源地址到目的地址傳輸郵件的規範,通過它來控制郵件的中轉方式。郵件服務一般支援SMTP協議,所以我們可以使用SMTP協議連線誒郵件伺服器就可以傳送郵件了。
2、POP協議。
接受郵件我們使用POP協議,雖然我們今天不會使用這個協議,但是事實我們也是可以這樣做的,POP郵局協議負責從郵件伺服器中檢索電子郵件。它要求郵件伺服器完成下面幾種任務之一:刪除郵件,檢索郵件,或者僅僅只是詢問是否有新郵件。POP協議還支援多使用者網際網路郵件擴充套件,允許使用者在電子郵件上附帶二進位制檔案,在使用者閱讀郵件時,POP命令所有的郵件資訊立即下載到使用者的計算機上,不在伺服器上保留。
這裡我們需要的傳送郵件所以使用的是SMTP協議,預設的埠是25。
這裡我們可以使用網際網路上面的很多郵件伺服器,只需要你註冊一個帳號就可以了,這裡我們使用QQ的郵件伺服器,相信你一定會有QQ吧,那麼我們又怎麼知道自己的郵件伺服器的訪問地址呢?其實只需要你登入一下QQ郵件就可以查看了。安裝下圖的表示就可以看到了。
1、點選上面的設定連線
2、點選賬號,然後往下拉,看到下面這個資訊。這個勾一定要勾上,這樣客戶端才能連線郵件伺服器,然後點選隔壁的超連結,可以看到更多郵件伺服器的資訊。
獲得授權碼,一會登陸郵箱時候使用這個授權碼
3、點選瞭如何使用Foxmail等軟體收發郵件後,就可以看到一份關於Foxmail配置說明,建議你好好看看這個說明,從這個說明我們可以得到很多資訊的。
比如上面這個說明,我們可以知道qq郵箱的傳送伺服器的地址:smtp.qq.com,使用ssl加密,埠是:465。
二、使用java傳送郵件
這裡我們先不直接在專案中傳送郵件,而是先新建一個mail專案,測試一下郵件傳送的功能,然後在修改我們的系統。
1、導包。
我們需要兩個包:mail.jar和activation.jar,先把這兩個包匯入進來。
2、新建一個servlet。
在這個servlet中實現連線郵件伺服器,併發送一份郵件給另外一個郵箱。
(1)和連線資料庫一樣,首先需要說明連線資訊,這裡所有的連線資訊需要封裝成為一個Properties物件,由於需要ssl加密所有連線的配置稍微複雜一點。
// 1、連結郵件伺服器
final String username = "[email protected]";
final String password = "xxxxxx";//改成獲得的授權碼
String host = "smtp.qq.com";
String port = "465";
Properties props = new Properties();
props.setProperty("mail.smtp.host", host);
props.setProperty("mail.smtp.port", port);
props.setProperty("mail.smtp.auth", "true");// 是否要驗證,true
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.socketFactory.port", port);
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
(2)根據上面的配置資訊生成一個連線會話Session
// 登入郵件伺服器
Session session = Session.getDefaultInstance(props,
new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// TODO Auto-generated method stub
return new PasswordAuthentication(username, password);
}
});
System.out.println(session);
(3)通過session建立一個簡單的郵件物件
//定義郵件物件
Message message=new MimeMessage(session);
try {
message.setSubject("主題的內容,hi");
message.setText("正文.你的商品是撒旦發生的飛灑");
//傳送者
Address formAddress=new InternetAddress(username);
message.setFrom(formAddress);
//收件人
Address toAddress=new InternetAddress("[email protected]");
message.setRecipient(Message.RecipientType.TO, toAddress);
//傳送郵件
Transport.send(message);
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//主題
3、在主頁上面建立一個超連線,指向這個servlet。
<body>
<a href="mailServlet">發郵件</a>
</body>
完成的servlet程式碼如下:
public class MailServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 傳送郵件
// 0、導包
// 1、連結郵件伺服器
final String username = "[email protected]";
final String password = "xxxxxx";//改成獲得的授權碼
String host = "smtp.qq.com";
String port = "465";
Properties props = new Properties();
props.setProperty("mail.smtp.host", host);
props.setProperty("mail.smtp.port", port);
props.setProperty("mail.smtp.auth", "true");// 是否要驗證,true
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.socketFactory.port", port);
//使用SSL
//開啟安全協議
MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
} catch (GeneralSecurityException e1) {
e1.printStackTrace();
}
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);
// 登入郵件伺服器
Session session = Session.getDefaultInstance(props,
new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// TODO Auto-generated method stub
return new PasswordAuthentication(username, password);
}
});
System.out.println(session);
//定義郵件物件
Message message=new MimeMessage(session);
try {
message.setSubject("主題的內容,hi");
message.setText("正文.你的商品是撒旦發生的飛灑");
//傳送者,必須要設定
Address formAddress=new InternetAddress(username);
message.setFrom(formAddress);
//收件人
Address toAddress=new InternetAddress("[email protected]");
message.setRecipient(Message.RecipientType.TO, toAddress);
//傳送郵件
Transport.send(message);
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//主題
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
4、測試,點選這個連線就會發送一個郵箱了。
三、修改系統的程式碼,完成郵件傳送。
你可以簡單的封裝一下,這裡就留給大家自己去實現。這裡就不列出程式碼了,在處理訂單的時候,如果是傳送商品就同時給使用者傳送一個郵件,這裡可能會影響使用者的體驗,建立你可以修改成為通過一個執行緒非同步的進行傳送,這塊內容就留給大家做聯絡吧。
有關郵件傳送很有很多知識點,比如:傳送只是html等多媒體網站,如何在嵌入附件等等,這方面的內容我們以後在講解spring時候再介紹了,因為spring對郵件傳送有更好的封裝。