java實現(xiàn)郵件發(fā)送
本文實例為大家分享了java實現(xiàn)郵件發(fā)送的具體代碼,供大家參考,具體內(nèi)容如下
1.使用socket通信功能實現(xiàn)java的郵件傳輸
1.1 什么是socet
Socket的英文原義是“孔”或“插座”。在網(wǎng)絡(luò)編程中,網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個socket。
Socket套接字是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。它是網(wǎng)絡(luò)通信過程中端點的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機的IP地址,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地主機的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口。
Socket本質(zhì)是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動機,提供了網(wǎng)絡(luò)通信的能力。
1.2.Socket的原理
Socket實質(zhì)上提供了進(jìn)程通信的端點。進(jìn)程通信之前,雙方首先必須各自創(chuàng)建一個端點,否則是沒有辦法建立聯(lián)系并相互通信的。正如打電話之前,雙方必須各自擁有一臺電話機一樣
套接字之間的連接過程可以分為三個步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認(rèn)。
1、服務(wù)器監(jiān)聽:是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)。
2、客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求。
3、連接確認(rèn):是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求,它就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。
1.3. 基于java的socket網(wǎng)絡(luò)編程實現(xiàn)
Server端Listen監(jiān)聽某個端口是否有連接請求,Client端向Server 端發(fā)出連接請求,Server端向Client端發(fā)回Accept接受消息。這樣一個連接就建立起來了。Server端和Client端都可以通過Send,Write等方法與對方通信。
對于一個功能齊全的Socket,都要包含以下基本結(jié)構(gòu),其工作過程包含以下四個基本的步驟:
1、創(chuàng)建Socket;
2、 打開連接到Socket的輸入/出流;
3、按照一定的協(xié)議對Socket進(jìn)行讀/寫操作;
4、關(guān)閉Socket。
2.具體代碼實現(xiàn)
我們將用代碼完成郵件的發(fā)送。這在實際項目中應(yīng)用的非常廣泛,比如注冊需要發(fā)送郵件進(jìn)行賬號激活,再比如OA項目中利用郵件進(jìn)行任務(wù)提醒等等。
2.1.使用Java發(fā)送 E-mail 十分簡單,但是首先你應(yīng)該準(zhǔn)備
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.獲取對應(yīng)郵箱的權(quán)限 (以qq郵箱為例)
QQ郵箱需要安全驗證,我們需要獲取他對應(yīng)的權(quán)限;
進(jìn)入QQ郵箱–>郵箱設(shè)置–>賬戶,下滑找到POP3/IMAP/SMTP/Exchange/CardDav/CalDav服務(wù),開啟POP3/SMTP服務(wù),如圖所示:




2.3.下面開始進(jìn)入編程階段:
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位的授權(quán)碼";
private final static String emailId_send="發(fā)件人郵箱";//注:要和你的16位授權(quán)碼對應(yīng)的郵箱
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"); //// 設(shè)置QQ郵件服務(wù)器
prop.setProperty("mail.transport.protocol", "smtp"); // 郵件發(fā)送協(xié)議
prop.setProperty("mail.smtp.auth", "true"); // 需要驗證用戶名密碼
// 關(guān)于QQ郵箱,還要設(shè)置SSL加密,加上以下代碼即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
//使用JavaMail發(fā)送郵件的5個步驟
//創(chuàng)建定義整個應(yīng)用程序所需的環(huán)境信息的 Session 對象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//發(fā)件人郵件用戶名、授權(quán)碼
return new PasswordAuthentication(emailId_send, emailKey);
}
});
//開啟Session的debug模式,這樣就可以查看到程序發(fā)送Email的運行狀態(tài)
session.setDebug(true);
//2、通過session得到transport對象
Transport ts = session.getTransport();
//3、使用郵箱的用戶名和授權(quán)碼連上郵件服務(wù)器
ts.connect("smtp.qq.com", emailId_send, emailKey);
//4、創(chuàng)建郵件
//創(chuàng)建郵件對象
MimeMessage message = new MimeMessage(session);
//指明郵件的發(fā)件人
message.setFrom(new InternetAddress(emailId_receive));
//指明郵件的收件人,現(xiàn)在發(fā)件人和收件人是一樣的,那就是自己給自己發(fā)
message.setRecipient(Message.RecipientType.TO, new InternetAddress(emailId_receive));
//郵件的標(biāo)題
message.setSubject(emailModel.getTitle());
//郵件的文本內(nèi)容
message.setContent(emailModel.getMessage(), "text/html;charset=UTF-8");
//5、發(fā)送郵件
ts.sendMessage(message, message.getAllRecipients());
// re=ts
ts.close();
}
}
下面附上EmailModel
package com.cn.own.model;
public class EmailModel {
private String title;//郵件標(biāo)題
private String message;//郵件內(nèi)容
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;
}
}
下面我們用一個單元測試進(jìn)行測試:
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"));
}
}
至此就結(jié)束了簡單的文本類型的郵件發(fā)送
3.帶圖片和附件的郵件
先認(rèn)識兩個類一個名詞:
MIME(多用途互聯(lián)網(wǎng)郵件擴展類型)
MimeBodyPart類
javax.mail.internet.MimeBodyPart類 表示的是一個MIME消息,它和MimeMessage類一樣都是從Part接口繼承過來。
MimeMultipart類
javax.mail.internet.MimeMultipart是抽象類 Multipart的實現(xiàn)子類,它用來組合多個MIME消息。一個MimeMultipart對象可以包含多個代表MIME消息的MimeBodyPart對象。
3.1.代碼實現(xiàn)
3.1.1 創(chuàng)建包含內(nèi)嵌圖片的郵件
前面的例子中是單獨的使用HTML或者是純文本內(nèi)容,但是有時候我們需要在純文本中使用內(nèi)嵌的方式顯示一些圖片,因此就要將純文本和內(nèi)嵌圖片單獨存放在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", "smtp.qq.com"); //// 設(shè)置QQ郵件服務(wù)器
prop.setProperty("mail.transport.protocol", "smtp"); // 郵件發(fā)送協(xié)議
prop.setProperty("mail.smtp.auth", "true"); // 需要驗證用戶名密碼
// 關(guān)于QQ郵箱,還要設(shè)置SSL加密,加上以下代碼即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
//使用JavaMail發(fā)送郵件的5個步驟
//1、創(chuàng)建定義整個應(yīng)用程序所需的環(huán)境信息的 Session 對象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//發(fā)件人郵件用戶名、授權(quán)碼
return new PasswordAuthentication("545646733@qq.com", "授權(quán)碼");
}
});
//開啟Session的debug模式,這樣就可以查看到程序發(fā)送Email的運行狀態(tài)
session.setDebug(true);
//2、通過session得到transport對象
Transport ts = session.getTransport();
//3、使用郵箱的用戶名和授權(quán)碼連上郵件服務(wù)器
ts.connect("smtp.qq.com", "545646733@qq.com", "授權(quán)碼");
//4、創(chuàng)建郵件
//創(chuàng)建郵件
MimeMessage message = new MimeMessage(session);
// 設(shè)置郵件的基本信息
//發(fā)件人
message.setFrom(new InternetAddress("545646733@qq.com"));
//收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("545646733@qq.com"));
//郵件標(biāo)題
message.setSubject("帶圖片的郵件");
// 準(zhǔn)備郵件數(shù)據(jù)
// 準(zhǔn)備圖片數(shù)據(jù)
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src/resources/bz.jpg"));
image.setDataHandler(dh);
image.setContentID("bz.jpg");
// 準(zhǔn)備正文數(shù)據(jù)
MimeBodyPart text = new MimeBodyPart();
text.setContent("這是一封郵件正文帶圖片<img src='cid:bz.jpg'>的郵件", "text/html;charset=UTF-8");
// 描述數(shù)據(jù)關(guān)系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
//設(shè)置到消息中,保存修改
message.setContent(mm);
message.saveChanges();
//5.發(fā)送郵件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
}
3.2.2 帶圖片和附件的復(fù)雜郵件發(fā)送
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 {
//創(chuàng)建一個配置文件保存并讀取信息
Properties properties = new Properties();
//設(shè)置qq郵件服務(wù)器
properties.setProperty("mail.host","smtp.qq.com");
//設(shè)置發(fā)送的協(xié)議
properties.setProperty("mail.transport.protocol","smtp");
//設(shè)置用戶是否需要驗證
properties.setProperty("mail.smtp.auth", "true");
//=================================只有QQ存在的一個特性,需要建立一個安全的鏈接
// 關(guān)于QQ郵箱,還要設(shè)置SSL加密,加上以下代碼即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);
//=================================準(zhǔn)備工作完畢
//1.創(chuàng)建一個session會話對象;
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("545646733@qq.com", "授權(quán)碼");
}
});
//可以通過session開啟Dubug模式,查看所有的過程
session.setDebug(true);
//2.獲取連接對象,通過session對象獲得Transport,需要捕獲或者拋出異常;
Transport tp = session.getTransport();
//3.連接服務(wù)器,需要拋出異常;
tp.connect("smtp.qq.com","545646733@qq.com","授權(quán)碼");
//4.連接上之后我們需要發(fā)送郵件;
MimeMessage mimeMessage = imageMail(session);
//5.發(fā)送郵件
tp.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
//6.關(guān)閉連接
tp.close();
}
public static MimeMessage imageMail(Session session) throws MessagingException {
//消息的固定信息
MimeMessage mimeMessage = new MimeMessage(session);
//郵件發(fā)送人
mimeMessage.setFrom(new InternetAddress("545646733@qq.com"));
//郵件接收人,可以同時發(fā)送給很多人,我們這里只發(fā)給自己;
mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("545646733@qq.com"));
mimeMessage.setSubject("我也不知道是個什么東西就發(fā)給你了"); //郵件主題
/*
編寫郵件內(nèi)容
1.圖片
2.附件
3.文本
*/
//圖片
MimeBodyPart body1 = new MimeBodyPart();
body1.setDataHandler(new DataHandler(new FileDataSource("src/resources/yhbxb.png")));
body1.setContentID("yhbxb.png"); //圖片設(shè)置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"); //附件設(shè)置名字
MimeBodyPart body4 = new MimeBodyPart();
body4.setDataHandler(new DataHandler(new FileDataSource("src/resources/1.txt")));
body4.setFileName(""); //附件設(shè)置名字
//拼裝郵件正文內(nèi)容
MimeMultipart multipart1 = new MimeMultipart();
multipart1.addBodyPart(body1);
multipart1.addBodyPart(body2);
multipart1.setSubType("related"); //1.文本和圖片內(nèi)嵌成功!
//new MimeBodyPart().setContent(multipart1); //將拼裝好的正文內(nèi)容設(shè)置為主體
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(multipart1);
//拼接附件
MimeMultipart allFile =new MimeMultipart();
allFile.addBodyPart(body3); //附件
allFile.addBodyPart(body4); //附件
allFile.addBodyPart(contentText);//正文
allFile.setSubType("mixed"); //正文和附件都存在郵件中,所有類型設(shè)置為mixed;
//放到Message消息中
mimeMessage.setContent(allFile);
mimeMessage.saveChanges();//保存修改
return mimeMessage;
}
}
至此所有的郵件功能均已實現(xiàn)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java項目導(dǎo)入IDEA的流程配置以及常見問題解決方法
通常一個團隊中可能有人用eclipse,有人用intelliJ,那么經(jīng)常會出現(xiàn)需要導(dǎo)入別人用eclipse建好的web項目,下面這篇文章主要給大家介紹了關(guān)于Java項目導(dǎo)入IDEA的流程配置以及常見問題解決方法的相關(guān)資料,需要的朋友可以參考下2023-05-05
springboot集成開發(fā)實現(xiàn)商場秒殺功能
這篇文章主要介紹了springboot集成實現(xiàn)商品秒殺功能,秒殺系統(tǒng)業(yè)務(wù)流程,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
java.Net.UnknownHostException異常處理問題解決
這篇文章主要介紹了java.Net.UnknownHostException異常處理方法,問題原因是在系統(tǒng)的?/etc/Hostname中配置了主機名,而在/etc/hosts文件中沒有相應(yīng)的配置,本文給大家詳細(xì)講解,需要的朋友可以參考下2023-03-03
java抓取鼠標(biāo)事件和鼠標(biāo)滾輪事件示例
這篇文章主要介紹了java抓取鼠標(biāo)事件和鼠標(biāo)滾輪事件示例,需要的朋友可以參考下2014-05-05
Java Lambda表達(dá)式的方法引用和構(gòu)造器引用實例分析
這篇文章主要介紹了Java Lambda表達(dá)式的方法引用和構(gòu)造器引用,結(jié)合實例形式分析了Lambda表達(dá)式的方法引用和構(gòu)造器引用相關(guān)原理、用法及操作注意事項,需要的朋友可以參考下2019-09-09

