java實現郵件傳送
本文例項為大家分享了java實現郵件傳送的具體程式碼,供大家參考,具體內容如下
1.使用socket通訊功能實現java的郵件傳輸
1.1 什麼是socet
Socket的英文原義是“孔”或“插座”。在網路程式設計中,網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。
Socket套接字是通訊的基石,是支援TCP/IP協議的網路通訊的基本操作單元。它是網路通訊過程中端點的抽象表示,包含進行網路通訊必須的五種資訊:連線使用的協議,本地主機的IP地址,本地程序的協議埠,遠地主機的IP地址,遠地程序的協議埠。
Socket本質是程式設計介面(API),對TCP/IP的封裝,TCP/IP也要提供可供程式設計師做網路開發所用的介面,這就是Socket程式設計介面;HTTP是轎車,提供了封裝或者顯示資料的具體形式;Socket是發動機,提供了網路通訊的能力。
1.2.Socket的原理
Socket實質上提供了程序通訊的端點。程序通訊之前,雙方首先必須各自建立一個端點,否則是沒有辦法建立聯絡並相互通訊的。正如打電話之前,雙方必須各自擁有一臺電話機一樣
套接字之間的連線過程可以分為三個步驟:伺服器監聽,客戶端請求,連線確認。
1、伺服器監聽:是伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態。
2、客戶端請求:是指由客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連線請求。
3、連線確認:是指當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求,它就響應客戶端套接字的請求,建立一個新的執行緒,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連線就建立好了。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。
1.3. 基於java的socket網路程式設計實現
Server端Listen監聽某個埠是否有連線請求,Client端向Server 端發出連線請求,Server端向Client端發回Accept接受訊息。這樣一個連線就建立起來了。Server端和Client端都可以通過Send,Write等方法與對方通訊。
對於一個功能齊全的Socket,都要包含以下基本結構,其工作過程包含以下四個基本的步驟:
1、建立Socket;
2、 開啟連線到Socket的輸入/出流;
3、按照一定的協議對Socket進行讀/寫操作;
4、關閉Socket。
2.具體程式碼實現
我們將用程式碼完成郵件的傳送。這在實際專案中應用的非常廣泛,比如註冊需要傳送郵件進行賬號啟用,再比如OA專案中利用郵件進行任務提醒等等。
2.1.使用Java傳送 E-mail 十分簡單,但是首先你應該準備
JavaMail API
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency>
Java Activation Framework
<dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency>
得到兩個jar包
2.2.獲取對應郵箱的許可權 (以qq郵箱為例)
QQ郵箱需要安全驗證,我們需要獲取他對應的許可權;
進入QQ郵箱–>郵箱設定–>賬戶,下滑找到POP3/IMAP/SMTP/Exchange/CardDav/CalDav服務,開啟POP3/SMTP服務,如圖所示:
2.3.下面開始進入程式設計階段:
package com.cn.own.util; import com.cn.own.model.EmailModel; import com.sun.mail.util.MailSSLSocketFactory; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class JavaSocket { private final static String emailKey="16位的授權碼"; private final static String emailId_send="發件人郵箱";//注:要和你的16位授權碼對應的郵箱 private final static String emailId_receive="收件人郵箱"; public static void sendEmail(EmailModel emailModel) throws Exception{ Properties prop = new Properties(); prop.setProperty("mail.host","smtp.qq.com"); //// 設定QQ郵件伺服器 prop.setProperty("mail.transport.protocol","smtp"); // 郵件傳送協議 prop.setProperty("mail.smtp.auth","true"); // 需要驗證使用者名稱密碼 // 關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable","true"); prop.put("mail.smtp.ssl.socketFactory",sf); //使用JavaMail傳送郵件的5個步驟 //建立定義整個應用程式所需的環境資訊的 Session 物件 Session session = Session.getDefaultInstance(prop,new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { //發件人郵件使用者名稱、授權碼 return new PasswordAuthentication(emailId_send,emailKey); } }); //開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態 session.setDebug(true); //2、通過session得到transport物件 Transport ts = session.getTransport(); //3、使用郵箱的使用者名稱和授權碼連上郵件伺服器 ts.connect("smtp.qq.com",emailId_send,emailKey); //4、建立郵件 //建立郵件物件 MimeMessage message = new MimeMessage(session); //指明郵件的發件人 message.setFrom(new InternetAddress(emailId_receive)); //指明郵件的收件人,現在發件人和收件人是一樣的,那就是自己給自己發 message.setRecipient(Message.RecipientType.TO,new InternetAddress(emailId_receive)); //郵件的標題 message.setSubject(emailModel.getTitle()); //郵件的文字內容 message.setContent(emailModel.getMessage(),"text/html;charset=UTF-8"); //5、傳送郵件 ts.sendMessage(message,message.getAllRecipients()); // re=ts ts.close(); } }
下面附上EmailModel
package com.cn.own.model; public class EmailModel { private String title;//郵件標題 private String message;//郵件內容 public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
下面我們用一個單元測試進行測試:
package com.cn.own.junitTest; import com.cn.own.util.JavaSocket; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class Test { @org.junit.Test public void testSendEmail() throws Exception{ JavaSocket.sendEmail(new EmailModel("title","message")); } }
至此就結束了簡單的文字型別的郵件傳送
3.帶圖片和附件的郵件
先認識兩個類一個名詞:
MIME(多用途網際網路郵件擴充套件型別)
MimeBodyPart類
javax.mail.internet.MimeBodyPart類 表示的是一個MIME訊息,它和MimeMessage類一樣都是從Part介面繼承過來。
MimeMultipart類
javax.mail.internet.MimeMultipart是抽象類 Multipart的實現子類,它用來組合多個MIME訊息。一個MimeMultipart物件可以包含多個代表MIME訊息的MimeBodyPart物件。
3.1.程式碼實現
3.1.1 建立包含內嵌圖片的郵件
前面的例子中是單獨的使用HTML或者是純文字內容,但是有時候我們需要在純文字中使用內嵌的方式顯示一些圖片,因此就要將純文字和內嵌圖片單獨存放在MimeBodyPart中然後再將其存放在一個Mimemultipart物件中即可。
import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.util.Properties; public class SendImageEmail { public static void main(String[] args) throws Exception { Properties prop = new Properties(); prop.setProperty("mail.host",sf); //使用JavaMail傳送郵件的5個步驟 //1、建立定義整個應用程式所需的環境資訊的 Session 物件 Session session = Session.getDefaultInstance(prop,new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { //發件人郵件使用者名稱、授權碼 return new PasswordAuthentication("[email protected]","授權碼"); } }); //開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態 session.setDebug(true); //2、通過session得到transport物件 Transport ts = session.getTransport(); //3、使用郵箱的使用者名稱和授權碼連上郵件伺服器 ts.connect("smtp.qq.com","[email protected]","授權碼"); //4、建立郵件 //建立郵件 MimeMessage message = new MimeMessage(session); // 設定郵件的基本資訊 //發件人 message.setFrom(new InternetAddress("[email protected]")); //收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]")); //郵件標題 message.setSubject("帶圖片的郵件"); // 準備郵件資料 // 準備圖片資料 MimeBodyPart image = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource("src/resources/bz.jpg")); image.setDataHandler(dh); image.setContentID("bz.jpg"); // 準備正文資料 MimeBodyPart text = new MimeBodyPart(); text.setContent("這是一封郵件正文帶圖片<img src='cid:bz.jpg'>的郵件","text/html;charset=UTF-8"); // 描述資料關係 MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); //設定到訊息中,儲存修改 message.setContent(mm); message.saveChanges(); //5.傳送郵件 ts.sendMessage(message,message.getAllRecipients()); ts.close(); } }
3.2.2 帶圖片和附件的複雜郵件傳送
import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.security.GeneralSecurityException; import java.util.Properties; public class SendFileMail { public static void main(String[] args) throws MessagingException,GeneralSecurityException { //建立一個配置檔案儲存並讀取資訊 Properties properties = new Properties(); //設定qq郵件伺服器 properties.setProperty("mail.host","smtp.qq.com"); //設定傳送的協議 properties.setProperty("mail.transport.protocol","smtp"); //設定使用者是否需要驗證 properties.setProperty("mail.smtp.auth","true"); //=================================只有QQ存在的一個特性,需要建立一個安全的連結 // 關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable","true"); properties.put("mail.smtp.ssl.socketFactory",sf); //=================================準備工作完畢 //1.建立一個session會話物件; Session session = Session.getDefaultInstance(properties,new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("[email protected]","授權碼"); } }); //可以通過session開啟Dubug模式,檢視所有的過程 session.setDebug(true); //2.獲取連線物件,通過session物件獲得Transport,需要捕獲或者丟擲異常; Transport tp = session.getTransport(); //3.連線伺服器,需要丟擲異常; tp.connect("smtp.qq.com","授權碼"); //4.連線上之後我們需要傳送郵件; MimeMessage mimeMessage = imageMail(session); //5.傳送郵件 tp.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); //6.關閉連線 tp.close(); } public static MimeMessage imageMail(Session session) throws MessagingException { //訊息的固定資訊 MimeMessage mimeMessage = new MimeMessage(session); //郵件傳送人 mimeMessage.setFrom(new InternetAddress("[email protected]")); //郵件接收人,可以同時傳送給很多人,我們這裡只發給自己; mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]")); mimeMessage.setSubject("我也不知道是個什麼東西就發給你了"); //郵件主題 /* 編寫郵件內容 1.圖片 2.附件 3.文字 */ //圖片 MimeBodyPart body1 = new MimeBodyPart(); body1.setDataHandler(new DataHandler(new FileDataSource("src/resources/yhbxb.png"))); body1.setContentID("yhbxb.png"); //圖片設定ID //文字 MimeBodyPart body2 = new MimeBodyPart(); body2.setContent("請注意,我不是廣告<img src='cid:yhbxb.png'>","text/html;charset=utf-8"); //附件 MimeBodyPart body3 = new MimeBodyPart(); body3.setDataHandler(new DataHandler(new FileDataSource("src/resources/log4j.properties"))); body3.setFileName("log4j.properties"); //附件設定名字 MimeBodyPart body4 = new MimeBodyPart(); body4.setDataHandler(new DataHandler(new FileDataSource("src/resources/1.txt"))); body4.setFileName(""); //附件設定名字 //拼裝郵件正文內容 MimeMultipart multipart1 = new MimeMultipart(); multipart1.addBodyPart(body1); multipart1.addBodyPart(body2); multipart1.setSubType("related"); //1.文字和圖片內嵌成功! //new MimeBodyPart().setContent(multipart1); //將拼裝好的正文內容設定為主體 MimeBodyPart contentText = new MimeBodyPart(); contentText.setContent(multipart1); //拼接附件 MimeMultipart allFile =new MimeMultipart(); allFile.addBodyPart(body3); //附件 allFile.addBodyPart(body4); //附件 allFile.addBodyPart(contentText);//正文 allFile.setSubType("mixed"); //正文和附件都存在郵件中,所有型別設定為mixed; //放到Message訊息中 mimeMessage.setContent(allFile); mimeMessage.saveChanges();//儲存修改 return mimeMessage; } }
至此所有的郵件功能均已實現
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。