1. 程式人生 > >48、郵件的傳送

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對郵件傳送有更好的封裝。