前言
沒錯,有需求才有動力,這一次老大讓我自己研究一下如何使用Java代碼來發送一封郵件.正愁沒事可搞,借著今天是七夕,就好好搞搞這個需求,前后總共用了半天時間搞定了,所以在這淺談一下其填坑過程.
郵件收發協議
說到郵件收發,就不得不說下郵件收發協議,其分為SMTP、POP3、IMAP三種協議,因為這里我們不涉及收取郵箱,所以我們只需要使用SMTP即可.下面我們就對其三個協議的概念做一個總結.
SMTP(發送郵件協議,默認端口25)
POP3(收取郵件協議,默認端口110,不能在線操作)
IMAP(收取郵件協議,默認端口143,運行在TCP/IP協議之上,與POP3的主要區別:可以在線操作,用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對服務器上的郵件進行操作)
JavaEmail發送郵件流程
JavaEmail發送郵件的流程主要是四步,其中第三步可有可無.分別是連接服務器,編輯郵件,添加附件,發送郵件.如下圖所示.
JavaEmail開發配置
由于我創建的是一個Maven項目,所以我在pom.xml中添加了如下的Maven依賴.
<properties>
<javamail.version>1.4.1</javamail.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>${javamail.version}</version>
</dependency>
</dependencies>
但是好像聽說在JDK6.0 以后開發,不需要導入 mail.jar了,因為在官方的JDK中已經包含了這個jar包,但是我沒有找到,所以我建立了依賴.假設兩者都存在的話,會出現如下錯誤.
java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
解決方案就很簡單了,只要刪除 javaee.jar 里面的 mail 目錄和 activation 目錄即可(如果想一勞永逸,去 javaee.jar 所在的硬盤位置把這兩個目錄刪掉)。
發送一份純本文的郵件
不管是發送什么郵件,這里我建議大家使用企業郵箱,因為普通郵箱好像是有發送次數限制的.這里我使用的是QQ企業郵箱,賬號都是公司提供的.這里我們需要去郵箱的設置頁面查看兩個地方.一個是我們的收發服務器地址以及相關信息,二是查看我們是否已經開啟對應的收發服務了.如下圖所示.
?? ????從上圖看出,我們知道,騰訊企業郵箱是發送地址為smtp.exmail.qq.com,使用SSL,端口為465,這里有個坑,那就是如果不使用SSL,那么端口為25,和新浪,網易郵箱端口是一致.
查看完我們想要的之后我們就需要進行連接服務器.首先我們需要設置服務器參數.這里我們使用Properties來存儲服務器連接信息.如下所示.
private static String smtpHost = "smtp.exmail.qq.com";
private static String port = "25";
private static Properties props = System.getProperties();
public static void main( String[] args ) throws AddressException, MessagingException, UnsupportedEncodingException{
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", port);
props.setProperty("mail.transport.protocol", "smtp");
}
然后,我們通過上面服務器信息來連接服務器.
Session session = Session.getInstance(props);// 與郵件服務器連接會話
session.setDebug(true);//打開Debug模式
連接完成之后,我們就需要編輯我們的郵件了.這里需要MimeMessage這個類來實現.代碼如下所示.
MimeMessage message = new MimeMessage(session);// 代表一封郵件
message.setFrom(new InternetAddress("發送郵件的地址"));
message.setRecipients(Message.RecipientType.TO,"接受郵件的地址");
message.setSubject("騷棟發給你一份驚喜");
message.setText("郵件正文內容");
編寫完地址之后,我們就需要發送這封郵件了,這里我們需要使用Transport這個類來實現郵件發送的功能.當然了,我們需要在發送過程中驗證我們的發送賬號以及密碼.如下所示.
Transport transport = session.getTransport();
// 發郵件前進行身份校驗
transport.connect("發送郵件賬號", "賬號密碼");
transport.sendMessage(message, message.getAllRecipients());
?? ????注意:郵件賬號和郵件發送地址可能不同吆~
這樣,我們就成功發送了一個郵件.效果圖如下所示.(完整Demo在文章最底部)
發送一份帶有格式的郵件(html形式)
假定一個純文本已經不能滿足我們的需求了,我們需要搞成有格式的郵件,這時候我們該怎么辦呢?這時候我們就需要使用MimeMultipart和MimeBodyPart這兩個類來進行實現了.
前面的連接服務器,發送郵件不需要發生改變,類似于純文本的即可,改變的是編輯郵件內容.代碼如下所示.
MimeBodyPart content = new MimeBodyPart();
content.setContent("<h1>附件是首好聽的歌曲!</h1>", "text/html;charset=utf-8");
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(content);
mimeMultipart.setSubType("mixed");
message.setContent(mimeMultipart);//添加主題內容
正常執行之后,收件箱得到如下的郵件,我們發現附件是首好聽的歌曲!確實是h1標簽的形式.
發送一份帶有附件的郵件
上面都說了有附件了,那么怎么能不搞搞如何發送一份有附件的郵件呢?和上面添加格式一樣,我們需要使用MimeMultipart和MimeBodyPart這兩個類來進行實現了.
具體部分代碼如下所示.
MimeBodyPart attachment = new MimeBodyPart();
attachment.setDataHandler(new DataHandler
(new FileDataSource("附件的本地地址"))
);
attachment.setFileName(MimeUtility.encodeText("音樂.mp3"));
MimeBodyPart content = new MimeBodyPart();
content.setContent("<h1>附件是首好聽的歌曲!</h1>", "text/html;charset=utf-8");
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(attachment);
mimeMultipart.addBodyPart(content);
mimeMultipart.setSubType("mixed");
message.setContent(mimeMultipart);
這時候我們在發送郵件的話,對應的郵箱中就會出現我們的郵件了.如下圖所示.
文章整體代碼如下所示
package com.infosports.emaildemo;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
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.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
public class App {
private static String smtpHost = "smtp.exmail.qq.com";
private static String formPerson = "郵件發送地址";
private static String toPerson = "郵件接受賬號";
private static String port = "25";
private static Properties props = System.getProperties();
public static void main( String[] args ) throws AddressException, MessagingException, UnsupportedEncodingException{
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", port);
props.setProperty("mail.transport.protocol", "smtp");
Session session = Session.getInstance(props);// 與郵件服務器連接會話
session.setDebug(true);
MimeMessage message = new MimeMessage(session);// 代表一封郵件
message.setFrom(new InternetAddress(formPerson));
message.setRecipients(Message.RecipientType.TO, toPerson);
message.setSubject("騷棟發給你一份驚喜");
// message.setText("郵件正文內容");
//附件部分
MimeBodyPart attachment = new MimeBodyPart();
attachment.setDataHandler(new DataHandler
(new FileDataSource("附件路徑"))
);
attachment.setFileName(MimeUtility.encodeText("音樂.mp3"));
MimeBodyPart content = new MimeBodyPart();
content.setContent("<h1>附件是首好聽的歌曲!</h1>", "text/html;charset=utf-8");
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(attachment);
mimeMultipart.addBodyPart(content);
mimeMultipart.setSubType("mixed");
message.setContent(mimeMultipart);
Transport transport = session.getTransport();
// 發郵件前進行身份校驗
transport.connect(formPerson, "發送賬號密碼");
transport.sendMessage(message, message.getAllRecipients());
}
}
總結
使用JavaEmail發送郵件就談到這里了,有什么不足歡迎來批斗騷棟,這里感謝大家了.希望大家喜歡這篇文章.話不多說了.今天是七夕,祝大家七夕快樂~