Java實現(xiàn)郵件發(fā)送的過程及代碼詳解
Java實現(xiàn)郵件發(fā)送
一、郵件服務器與傳輸協(xié)議
要在網(wǎng)絡(luò)上實現(xiàn)郵件功能,必須要有專門的郵件服務器。這些郵件服務器類似于現(xiàn)實生活中的郵局,它主要負責接收用戶投遞過來的郵件,并把郵件投遞到郵件接收者的電子郵箱中。
SMTP服務器地址:一般是 smtp.xxx.com,比如163郵箱是smtp.163.com,qq郵箱是smtp.qq.com。
SMTP協(xié)議
通常把處理用戶smtp請求(郵件發(fā)送請求)的服務器稱之為SMTP服務器(郵件發(fā)送服務器)。
POP3協(xié)議
通常把處理用戶pop3請求(郵件接收請求)的服務器稱之為POP3服務器(郵件接收服務器)。
二、Java發(fā)送郵件
使用到的jar包:
- mail.jar
- activation.jar
QQ郵箱需獲取相應的權(quán)限:
QQ郵箱–>郵箱設(shè)置–>賬戶–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務 開啟POP3/SMTP服務,然后獲取16位授權(quán)碼(注意不要將授權(quán)碼泄露,一個賬戶可以擁有多個授權(quán)碼)
Java實現(xiàn)純文本郵件發(fā)送
package org.westos.email; import com.sun.mail.util.MailSSLSocketFactory; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.security.GeneralSecurityException; import java.util.Properties; public class SendEamil { public static void main(String[] args) throws MessagingException, GeneralSecurityException { //創(chuàng)建一個配置文件并保存 Properties properties = new Properties(); properties.setProperty("mail.host","smtp.qq.com"); properties.setProperty("mail.transport.protocol","smtp"); properties.setProperty("mail.smtp.auth","true"); //QQ存在一個特性設(shè)置SSL加密 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", "true"); properties.put("mail.smtp.ssl.socketFactory", sf); //創(chuàng)建一個session對象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("619046217@qq.com","16位授權(quán)碼"); } }); //開啟debug模式 session.setDebug(true); //獲取連接對象 Transport transport = session.getTransport(); //連接服務器 transport.connect("smtp.qq.com","619046217@qq.com","16位授權(quán)碼"); //創(chuàng)建郵件對象 MimeMessage mimeMessage = new MimeMessage(session); //郵件發(fā)送人 mimeMessage.setFrom(new InternetAddress("619046217@qq.com")); //郵件接收人 mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("875203654@qq.com")); //郵件標題 mimeMessage.setSubject("Hello Mail"); //郵件內(nèi)容 mimeMessage.setContent("我的想法是把代碼放進一個循環(huán)里","text/html;charset=UTF-8"); //發(fā)送郵件 transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); //關(guān)閉連接 transport.close(); } }
Java實現(xiàn)文本圖片附件復雜的郵件發(fā)送
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對象
package org.westos.email; import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.*; import java.security.GeneralSecurityException; import java.util.Properties; public class SendComplexEmail { public static void main(String[] args) throws GeneralSecurityException, MessagingException { Properties prop = new Properties(); prop.setProperty("mail.host", "smtp.qq.com"); //// 設(shè)置QQ郵件服務器 prop.setProperty("mail.transport.protocol", "smtp"); // 郵件發(fā)送協(xié)議 prop.setProperty("mail.smtp.auth", "true"); // 需要驗證用戶名密碼 // QQ郵箱設(shè)置SSL加密 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable", "true"); prop.put("mail.smtp.ssl.socketFactory", sf); //1、創(chuàng)建定義整個應用程序所需的環(huán)境信息的 Session 對象 Session session = Session.getDefaultInstance(prop, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //傳入發(fā)件人的姓名和授權(quán)碼 return new PasswordAuthentication("619046217@qq.com","16位授權(quán)碼"); } }); //2、通過session獲取transport對象 Transport transport = session.getTransport(); //3、通過transport對象郵箱用戶名和授權(quán)碼連接郵箱服務器 transport.connect("smtp.qq.com","619046217@qq.com","16位授權(quán)碼"); //4、創(chuàng)建郵件,傳入session對象 MimeMessage mimeMessage = complexEmail(session); //5、發(fā)送郵件 transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); //6、關(guān)閉連接 transport.close(); } public static MimeMessage complexEmail(Session session) throws MessagingException { //消息的固定信息 MimeMessage mimeMessage = new MimeMessage(session); //發(fā)件人 mimeMessage.setFrom(new InternetAddress("619046217@qq.com")); //收件人 mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("619046217@qq.com")); //郵件標題 mimeMessage.setSubject("帶圖片和附件的郵件"); //郵件內(nèi)容 //準備圖片數(shù)據(jù) MimeBodyPart image = new MimeBodyPart(); DataHandler handler = new DataHandler(new FileDataSource("E:\\IdeaProjects\\WebEmail\\resources\\測試圖片.png")); image.setDataHandler(handler); image.setContentID("test.png"); //設(shè)置圖片id //準備文本 MimeBodyPart text = new MimeBodyPart(); text.setContent("這是一段文本<img src='cid:test.png'>","text/html;charset=utf-8"); //附件 MimeBodyPart appendix = new MimeBodyPart(); appendix.setDataHandler(new DataHandler(new FileDataSource("E:\\IdeaProjects\\WebEmail\\resources\\測試文件.txt"))); appendix.setFileName("test.txt"); //拼裝郵件正文 MimeMultipart mimeMultipart = new MimeMultipart(); mimeMultipart.addBodyPart(image); mimeMultipart.addBodyPart(text); mimeMultipart.setSubType("related");//文本和圖片內(nèi)嵌成功 //將拼裝好的正文內(nèi)容設(shè)置為主體 MimeBodyPart contentText = new MimeBodyPart(); contentText.setContent(mimeMultipart); //拼接附件 MimeMultipart allFile = new MimeMultipart(); allFile.addBodyPart(appendix);//附件 allFile.addBodyPart(contentText);//正文 allFile.setSubType("mixed"); //正文和附件都存在郵件中,所有類型設(shè)置為mixed //放到Message消息中 mimeMessage.setContent(allFile); mimeMessage.saveChanges();//保存修改 return mimeMessage; } }
JavaWeb發(fā)送郵件(網(wǎng)站注冊成功發(fā)送提示郵件)
1.User
package org.westos.mail; public class User { private String name; private String password; private String mail; public User() { } public User(String name, String password, String mail) { this.name = name; this.password = password; this.mail = mail; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", password='" + password + '\'' + ", mail='" + mail + '\'' + '}'; } }
2.Servlet
package org.westos.mail; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Servlet extends javax.servlet.http.HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) { //處理前端請求 String username = request.getParameter("username"); String password = request.getParameter("password"); String email = request.getParameter("email"); //將信息封裝進user對象 User user = new User(username, password, email); SendMail sendMail = new SendMail(user); sendMail.start(); //開啟線程 request.setAttribute("msg","發(fā)送成功"); try { request.getRequestDispatcher("msg.jsp").forward(request,response); } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
3.SengMail
package org.westos.mail; import com.sun.mail.util.MailSSLSocketFactory; import javax.mail.*; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.security.GeneralSecurityException; import java.security.PublicKey; import java.util.Properties; public class SendMail extends Thread { //發(fā)件人信息 private String From = "619046217@qq.com"; //發(fā)件人郵箱 private String recipient = "619046217@qq.com"; //郵箱密碼 private String password = "16位授權(quán)碼"; //郵件發(fā)送的服務器 private String host = "smtp.qq.com"; //收件人信息 private User user; public SendMail(User user){ this.user = user; } @Override public void run() { try { Properties properties = new Properties(); properties.setProperty("mail.host","smtp.qq.com"); properties.setProperty("mail.transport.protocol","smtp"); properties.setProperty("mail.smtp.auth","true"); //QQ存在一個特性設(shè)置SSL加密 MailSSLSocketFactory sf = null; try { sf = new MailSSLSocketFactory(); } catch (GeneralSecurityException e) { e.printStackTrace(); } sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", "true"); properties.put("mail.smtp.ssl.socketFactory", sf); //創(chuàng)建一個session對象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(recipient,password); } }); //開啟debug模式 session.setDebug(true); //獲取連接對象 Transport transport = null; try { transport = session.getTransport(); } catch (NoSuchProviderException e) { e.printStackTrace(); } //連接服務器 transport.connect(host,From,password); //創(chuàng)建一個郵件發(fā)送對象 MimeMessage mimeMessage = new MimeMessage(session); //郵件發(fā)送人 mimeMessage.setFrom(new InternetAddress(recipient)); //郵件接收人 mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getMail())); //郵件標題 mimeMessage.setSubject("網(wǎng)站注冊成功"); //郵件內(nèi)容 mimeMessage.setContent("網(wǎng)站注冊成功,密碼為"+user.getPassword()+",請妥善保管密碼","text/html;charset=UTF-8"); //發(fā)送郵件 transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); transport.close(); }catch (Exception e){ e.printStackTrace(); } } }
4.register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>注冊頁面</title> </head> <body> <form action="${pageContext.request.contextPath}/a.do" method="post"> <p>用戶名:<input type="text" name="username" required></p> <p>密碼:<input type="password" name="password" required></p> <p>郵箱:<input type="email" name="email" required></p> <p><input type="submit" value="提交"></p> </form> </body> </html>
5.msg.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${msg} </body> </html>
6.web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>Servlet</servlet-name> <servlet-class>org.westos.mail.Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlet</servlet-name> <url-pattern>/a.do</url-pattern> </servlet-mapping> </web-app>
到此這篇關(guān)于Java實現(xiàn)郵件發(fā)送的過程及代碼詳解的文章就介紹到這了,更多相關(guān)Java實現(xiàn)郵件發(fā)送內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)將數(shù)字日期翻譯成英文單詞的工具類實例
這篇文章主要介紹了Java實現(xiàn)將數(shù)字日期翻譯成英文單詞的工具類,結(jié)合完整實例形式分析了Java日期轉(zhuǎn)換與字符串操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-09-09Spring?Cloud?Ribbon?負載均衡使用策略示例詳解
Spring?Cloud?Ribbon?是基于Netflix?Ribbon?實現(xiàn)的一套客戶端負載均衡工具,Ribbon客戶端組件提供了一系列的完善的配置,如超時,重試等,這篇文章主要介紹了Spring?Cloud?Ribbon?負載均衡使用策略示例詳解,需要的朋友可以參考下2023-03-03