前言
沒(méi)錯(cuò),有需求才有動(dòng)力,這一次老大讓我自己研究一下如何使用Java代碼來(lái)發(fā)送一封郵件.正愁沒(méi)事可搞,借著今天是七夕,就好好搞搞這個(gè)需求,前后總共用了半天時(shí)間搞定了,所以在這淺談一下其填坑過(guò)程.
郵件收發(fā)協(xié)議
說(shuō)到郵件收發(fā),就不得不說(shuō)下郵件收發(fā)協(xié)議,其分為SMTP虏等、POP3伏伯、IMAP三種協(xié)議,因?yàn)檫@里我們不涉及收取郵箱,所以我們只需要使用SMTP即可.下面我們就對(duì)其三個(gè)協(xié)議的概念做一個(gè)總結(jié).
SMTP(發(fā)送郵件協(xié)議沦偎,默認(rèn)端口25)
POP3(收取郵件協(xié)議恢口,默認(rèn)端口110稚铣,不能在線(xiàn)操作)
IMAP(收取郵件協(xié)議,默認(rèn)端口143父款,運(yùn)行在TCP/IP協(xié)議之上尾膊,與POP3的主要區(qū)別:可以在線(xiàn)操作,用戶(hù)可以不用把所有的郵件全部下載络凿,可以通過(guò)客戶(hù)端直接對(duì)服務(wù)器上的郵件進(jìn)行操作)
JavaEmail發(fā)送郵件流程
JavaEmail發(fā)送郵件的流程主要是四步,其中第三步可有可無(wú).分別是連接服務(wù)器,編輯郵件,添加附件,發(fā)送郵件.如下圖所示.
JavaEmail開(kāi)發(fā)配置
由于我創(chuàng)建的是一個(gè)Maven項(xiàng)目,所以我在pom.xml中添加了如下的Maven依賴(lài).
<properties>
<javamail.version>1.4.1</javamail.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>${javamail.version}</version>
</dependency>
</dependencies>
但是好像聽(tīng)說(shuō)在JDK6.0 以后開(kāi)發(fā)骡送,不需要導(dǎo)入 mail.jar了,因?yàn)樵诠俜降腏DK中已經(jīng)包含了這個(gè)jar包,但是我沒(méi)有找到,所以我建立了依賴(lài).假設(shè)兩者都存在的話(huà),會(huì)出現(xiàn)如下錯(cuò)誤.
java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
解決方案就很簡(jiǎn)單了,只要?jiǎng)h除 javaee.jar 里面的 mail 目錄和 activation 目錄即可(如果想一勞永逸昂羡,去 javaee.jar 所在的硬盤(pán)位置把這兩個(gè)目錄刪掉)。
發(fā)送一份純本文的郵件
不管是發(fā)送什么郵件,這里我建議大家使用企業(yè)郵箱,因?yàn)槠胀ㄠ]箱好像是有發(fā)送次數(shù)限制的.這里我使用的是QQ企業(yè)郵箱,賬號(hào)都是公司提供的.這里我們需要去郵箱的設(shè)置頁(yè)面查看兩個(gè)地方.一個(gè)是我們的收發(fā)服務(wù)器地址以及相關(guān)信息,二是查看我們是否已經(jīng)開(kāi)啟對(duì)應(yīng)的收發(fā)服務(wù)了.如下圖所示.
?? ????從上圖看出,我們知道,騰訊企業(yè)郵箱是發(fā)送地址為smtp.exmail.qq.com,使用SSL,端口為465,這里有個(gè)坑,那就是如果不使用SSL,那么端口為25,和新浪,網(wǎng)易郵箱端口是一致.
查看完我們想要的之后我們就需要進(jìn)行連接服務(wù)器.首先我們需要設(shè)置服務(wù)器參數(shù).這里我們使用Properties來(lái)存儲(chǔ)服務(wù)器連接信息.如下所示.
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");
}
然后,我們通過(guò)上面服務(wù)器信息來(lái)連接服務(wù)器.
Session session = Session.getInstance(props);// 與郵件服務(wù)器連接會(huì)話(huà)
session.setDebug(true);//打開(kāi)Debug模式
連接完成之后,我們就需要編輯我們的郵件了.這里需要MimeMessage這個(gè)類(lèi)來(lái)實(shí)現(xiàn).代碼如下所示.
MimeMessage message = new MimeMessage(session);// 代表一封郵件
message.setFrom(new InternetAddress("發(fā)送郵件的地址"));
message.setRecipients(Message.RecipientType.TO,"接受郵件的地址");
message.setSubject("騷棟發(fā)給你一份驚喜");
message.setText("郵件正文內(nèi)容");
編寫(xiě)完地址之后,我們就需要發(fā)送這封郵件了,這里我們需要使用Transport這個(gè)類(lèi)來(lái)實(shí)現(xiàn)郵件發(fā)送的功能.當(dāng)然了,我們需要在發(fā)送過(guò)程中驗(yàn)證我們的發(fā)送賬號(hào)以及密碼.如下所示.
Transport transport = session.getTransport();
// 發(fā)郵件前進(jìn)行身份校驗(yàn)
transport.connect("發(fā)送郵件賬號(hào)", "賬號(hào)密碼");
transport.sendMessage(message, message.getAllRecipients());
?? ????注意:郵件賬號(hào)和郵件發(fā)送地址可能不同吆~
這樣,我們就成功發(fā)送了一個(gè)郵件.效果圖如下所示.(完整Demo在文章最底部)
發(fā)送一份帶有格式的郵件(html形式)
假定一個(gè)純文本已經(jīng)不能滿(mǎn)足我們的需求了,我們需要搞成有格式的郵件,這時(shí)候我們?cè)撛趺崔k呢?這時(shí)候我們就需要使用MimeMultipart和MimeBodyPart這兩個(gè)類(lèi)來(lái)進(jìn)行實(shí)現(xiàn)了.
前面的連接服務(wù)器,發(fā)送郵件不需要發(fā)生改變,類(lèi)似于純文本的即可,改變的是編輯郵件內(nèi)容.代碼如下所示.
MimeBodyPart content = new MimeBodyPart();
content.setContent("<h1>附件是首好聽(tīng)的歌曲摔踱!</h1>", "text/html;charset=utf-8");
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(content);
mimeMultipart.setSubType("mixed");
message.setContent(mimeMultipart);//添加主題內(nèi)容
正常執(zhí)行之后,收件箱得到如下的郵件,我們發(fā)現(xiàn)附件是首好聽(tīng)的歌曲虐先!確實(shí)是h1標(biāo)簽的形式.
發(fā)送一份帶有附件的郵件
上面都說(shuō)了有附件了,那么怎么能不搞搞如何發(fā)送一份有附件的郵件呢?和上面添加格式一樣,我們需要使用MimeMultipart和MimeBodyPart這兩個(gè)類(lèi)來(lái)進(jìn)行實(shí)現(xiàn)了.
具體部分代碼如下所示.
MimeBodyPart attachment = new MimeBodyPart();
attachment.setDataHandler(new DataHandler
(new FileDataSource("附件的本地地址"))
);
attachment.setFileName(MimeUtility.encodeText("音樂(lè).mp3"));
MimeBodyPart content = new MimeBodyPart();
content.setContent("<h1>附件是首好聽(tīng)的歌曲!</h1>", "text/html;charset=utf-8");
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(attachment);
mimeMultipart.addBodyPart(content);
mimeMultipart.setSubType("mixed");
message.setContent(mimeMultipart);
這時(shí)候我們?cè)诎l(fā)送郵件的話(huà),對(duì)應(yīng)的郵箱中就會(huì)出現(xiàn)我們的郵件了.如下圖所示.
文章整體代碼如下所示
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 = "郵件發(fā)送地址";
private static String toPerson = "郵件接受賬號(hào)";
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);// 與郵件服務(wù)器連接會(huì)話(huà)
session.setDebug(true);
MimeMessage message = new MimeMessage(session);// 代表一封郵件
message.setFrom(new InternetAddress(formPerson));
message.setRecipients(Message.RecipientType.TO, toPerson);
message.setSubject("騷棟發(fā)給你一份驚喜");
// message.setText("郵件正文內(nèi)容");
//附件部分
MimeBodyPart attachment = new MimeBodyPart();
attachment.setDataHandler(new DataHandler
(new FileDataSource("附件路徑"))
);
attachment.setFileName(MimeUtility.encodeText("音樂(lè).mp3"));
MimeBodyPart content = new MimeBodyPart();
content.setContent("<h1>附件是首好聽(tīng)的歌曲派敷!</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();
// 發(fā)郵件前進(jìn)行身份校驗(yàn)
transport.connect(formPerson, "發(fā)送賬號(hào)密碼");
transport.sendMessage(message, message.getAllRecipients());
}
}
總結(jié)
使用JavaEmail發(fā)送郵件就談到這里了,有什么不足歡迎來(lái)批斗騷棟,這里感謝大家了.希望大家喜歡這篇文章.話(huà)不多說(shuō)了.今天是七夕,祝大家七夕快樂(lè)~