javamail主要是經過STMP、POP協議和郵件服務器交換數據,從而達到發送、接受郵件的。javamail的核心由兩大類:一、發送:鏈接會話、服務器驗證、發送地址、郵件信息、發送類。二、接受:服務器鏈接、消息。html
a)STMP和POP3是網絡協議中應用層部分,和HTTP是同層。java
b)SMTP 的全稱是「Simple Mail Transfer Protocol」,即簡單郵件傳輸協議。它是一組用於從源地址到目的地址傳輸郵件的規範,經過它來控制郵件的中轉方式。SMTP 協議屬於 TCP/IP 協議簇,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。SMTP 服務器就是遵循 SMTP 協議的發送郵件服務器。SMTP 認證,簡單地說就是要求必須在提供了帳戶名和密碼以後才能夠登陸 SMTP 服務器,這就使得那些垃圾郵件的散播者無可乘之機。增長 SMTP 認證的目的是爲了使用戶避免受到垃圾郵件的侵擾服務器
c)POP3,全名爲「Post Office Protocol - Version 3」,即「郵局協議版本3」。是TCP/IP協議族中的一員,由RFC1939 定義。本協議主要用於支持使用客戶端遠程管理在服務器上的電子郵件。提供了SSL加密的POP3協議被稱爲POP3S。POP 協議支持「離線」郵件處理。其具體過程是:郵件發送到服務器上,電子郵件客戶端調用郵件客戶機程序以鏈接服務器,並下載全部未閱讀的電子郵件。這種離線訪問模式是一種存儲轉發服務,將郵件從郵件服務器端送到我的終端機器上,通常是PC機或 MAC。一旦郵件發送到 PC 機或MAC上,郵件服務器上的郵件將會被刪除。但目前的POP3郵件服務器大均可以「只下載郵件,服務器端並不刪除」,也就是改進的POP3協議。網絡
a)通用類session
javax.mail.Session:會話類是JavaMail API的主要類,它不建立子類。 Session 對象充當鏈接工廠的JavaMail API,它能夠同時處理配置設置和身份驗證。會話類是JavaMail API的主要類,它不建立子類。 Session 對象充當鏈接工廠的JavaMail API,它能夠同時處理配置設置和身份驗證。有點像socket,不管是發送仍是接受都須要這個類socket
java.util.Properties:設置通訊協議、主機地址、端口、身份認證等.this
javax.mail.Authenticator:郵件服務器分配的帳戶信息。是抽象了,須要繼承實現getPasswordAuthentication()得到PasswordAuthentication。加密
a)發送相關類spa
javax.mail.Address:發送地址(郵件服務器帳戶)、接受者地址。.net
javax.mail.internet.MimeMessage:郵件內容、包括郵件的全部信息.
javax.mail.Transport:發送器
b)接受相關類
javax.mail.Store:pop3對象,至關於郵箱。
javax.mail.Folder:郵箱裏面的文件夾對象。
javax.mail.Message:郵件。
public void TestSend() throws Exception { // 一.郵件服務器網絡設置 Properties props = new Properties(); this.setPropertis(props); // 二.鏈接session Session session = Session.getInstance(props, new Authenticator() { // 三.因爲authenticator是抽象了 protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("123@163.com", "123"); } }); // 4、地址: // 4.1.發送地址:這裏是郵件服務器地址 // Address addressfrom = new InternetAddress("xxxx@163.com"); // Address addressFrom=new InternetAddress("xxxx@qq.com","sender");//名字和郵件顯示在一塊兒 Address addressFrom = new InternetAddress("xxxx@qq.com", MimeUtility.encodeText("發送者"));// 格式化中文信息 // 4.2.接受者 Address addressToOne = new InternetAddress("xxxx1@qq.com", MimeUtility.encodeText("發送者1")); Address[] addressToCopy = { new InternetAddress("xxxx2@qq.com", MimeUtility.encodeText("發送者2")), new InternetAddress("xxxx3@qq.com", MimeUtility.encodeText("發送者3")), new InternetAddress("xxxx4@qq.com", MimeUtility.encodeText("發送者4")) }; // 5、消息:<郵件消息格式> Message message = new MimeMessage(session);// 建立消息 // 5.1發送者 message.setFrom(addressFrom); // 5.2 接受者 /** * @See 發送設置 Message.RecipientType.TO:收信人 Message.RecipientType.CC:抄送人 * <複製一份> Message.RecipientType.BCC:暗發人<複製一份> */ message.setRecipient(Message.RecipientType.TO, addressToOne); // message.setRecipients(Message.RecipientType.CC, addressToCopy);//重複發送 message.setSubject("你好啊");// 主題 // 內容 this.setMessageContent(message); // 發送: Transport.send(message); } /** * @see 設置網絡信息 * @param props */ private void setPropertis(Properties props) { props.put("mail.stmp.host", "smtp.163.com");// 郵件地址 props.put("mail.smtp.port", 25); // 郵件端口 props.put("mail.stmp.auth", true);// 開啓認證(須要服務器帳戶密碼) props.put("mail.smtp.starttls.enable", true);// 開啓ssl認證 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");// 啓用ssl的socket服務 props.put("mail.smtp.socketFactory.fallback", true);// 開啓回滾 props.put("mail.stmp.timeout", 0);// 超時設置 } public void setMessageContent(Message message) throws MessagingException { // 1.普通 // message.setText("我是普通內容內容"); // 2.帶html內容 //message.setContent("<h1>我是html<h2>", "text/html"); // 3.帶附件:若是帶附件、則正文和附件都降以 MimeBodyPart形式存在 MimeMultipart mmt = new MimeMultipart();// 附件 // 普通附件 MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setText("我是正文"); mmt.addBodyPart(mbp1); // 文本附件<文件、圖片> MimeBodyPart mbp2 = new MimeBodyPart(); String filename = "/home/manisha/file.txt"; FileDataSource fds = new FileDataSource(filename);//附件的數據源 mbp2.setDataHandler(new DataHandler(fds));//將附件添加到bodypart mbp2.setFileName(filename);//設置附件名稱 mmt.addBodyPart(mbp2);//將附件內容添加到附件 message.setContent(mmt); }
public void TestSend() throws Exception { // 一.郵件服務器網絡設置 Properties props = new Properties(); this.setPropertis(props); // 二.鏈接session Session session = Session.getInstance(props, new Authenticator() { // 三.因爲authenticator是抽象了 protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("123@163.com", "123"); } }); // 4、 接受者 Store store = session.getStore("pop3s"); store.connect();//鏈接 // 5、郵件消息文件夾 Folder emailFolder = store.getFolder("INBOX"); /** * @see 文件夾的處理方式 * Folder.READ_ONLY:只讀 * Folder.READ_WRITE:讀寫 * Folder.HOLDS_FOLDERS:包涵其它的文件夾 * Folder.HOLDS_MESSAGES:包涵其它的郵件 */ emailFolder.open(Folder.HOLDS_MESSAGES); // 6、郵件消息 Message[] messages = emailFolder.getMessages(); System.out.println("messages.length---" + messages.length); for (int i = 0, n = messages.length; i < n; i++) { Message message = messages[i]; System.out.println("---------------------------------"); System.out.println("Email Number " + (i + 1)); System.out.println("Subject: " + message.getSubject()); System.out.println("From: " + message.getFrom()[0]); System.out.println("Text: " + message.getContent().toString()); } // 關閉文件夾 emailFolder.close(false); //關閉鏈接 store.close(); } /** * @see 設置網絡信息 * @param props */ private void setPropertis(Properties props) { props.put("mail.stmp.host", "smtp.163.com");// 郵件地址 props.put("mail.smtp.port", 25); // 郵件端口 props.put("mail.stmp.auth", true);// 開啓認證(須要服務器帳戶密碼) props.put("mail.smtp.starttls.enable", true);// 開啓ssl認證 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");// 啓用ssl的socket服務 props.put("mail.smtp.socketFactory.fallback", true);// 開啓回滾 props.put("mail.stmp.timeout", 0);// 超時設置 }