實作java mail發送郵件
最近在網上找了一下相關資料,學習了一下java mail,這兩天研究了一下,覺得實作java mail發送郵件還是挺簡單的,沒有想象中那麼難,為了以後的友善,還有考慮到有這方面需要的朋友的參考,廢話就不多說了,下面就來跟大家分享一下我的源代碼,也歡迎大家提出程式中不足的地方,互相交流學習,共同進步。
開發環境:
我是用 myeclipse10.7 + tomcat7.0 + jdk1.7作為開發環境的,作業系統是win7,開發該發郵件的項目所需要的jar包有: activation.jar、 mail.jar(這兩個包是開發中必須要用到的,需要放在/lib目錄下), 這兩個jar包的下載下傳位址 http://download.csdn.net/detail/wangcunhuazi/8090791
項目的結構:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CXwBHWZFDatJWMOJjW1ZkMkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TM4YTMygTN3EDOyATM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
javamail:web項目名稱
com.mail.servlet:存放發送郵件的業務處理類
SendMailServlet.java:發送郵件的業務處理類
com.util.mail:存放發送郵件的核心類
前三個java類:發送郵件的核心類,必不可少
Test.java:發送郵件的測試類
/lib:存放開發項目所需的jar包
activation.jar、mail.jar:發送郵件必須的第三方jar包
web.xml:存放項目中的配置資訊,如servlet的映射資訊
index.jsp:發送郵件的入口頁面
sendMail:發送郵件頁面
success.jsp:發送郵件成功後跳轉到的頁面
fail.jsp:發送郵件失敗後跳轉到的頁面
項目的源代碼:
朋友們可以按照上面的項目結構,自己建立一個web項目,然後把下面的每個檔案的源代碼複制粘貼到自己的項目的
相應檔案裡。也可以到這裡 http://download.csdn.net/detail/wangcunhuazi/8090827 來下載下傳整個項目,裡面包含這裡所
說的所有項目結構和源代碼。
(注意:通過上面連結下載下傳到的項目,在導入自己的myeclipse時,第一件事情,請把該項目的項目編碼集改為UTF-8,否則,有可能出現亂碼的情況,修改編碼集的具體操作可以參考這裡 http://blog.csdn.net/wangcunhuazi/article/details/40432341)
SendMailServlet.java
package com.mail.servlet;
import com.util.mail.MailSenderInfo;
import com.util.mail.SimpleMailSender;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.util.mail.MailSenderInfo;
import com.util.mail.SimpleMailSender;
public class SendMailServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//設定字元編碼
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//從頁面擷取參數
String userName = request.getParameter("username");
String serverHost = request.getParameter("serverhost");
String password =request.getParameter("password");
String toAddress =request.getParameter("toaddress");
String subject =request.getParameter("subject");
String content =request.getParameter("content");
//發送方郵箱SMTP伺服器位址
String mailServerHost = "smtp." + serverHost;
//發送方郵箱SMTP伺服器的端口, qq.com、163.com、126.com、sina.com、sohu.com等的端口号都為25
String mailServerPort = "25";
//如果前台頁面中需要添加郵箱類型,如gmail.com,則這裡可以添加以下語句處理
//if(serverHost.equals("gmail.com"))
//{
// mailServerPort = "587";
//}
//發送方的郵箱賬号
userName = userName + "@" + serverHost;
//測試擷取到的使用者名是否正确
System.out.println(userName);
//發送方的郵箱位址
String fromAddress = userName;
//測試擷取到的使用者名是否正确
System.out.println(fromAddress);
//這個類主要是設定郵件
MailSenderInfo mailInfo = new MailSenderInfo();
//伺服器與端口的對應關系: smtp.qq.com -> 25或587 smtp.163.com -> 25
mailInfo.setMailServerHost(mailServerHost); //發送方的SMTP伺服器位址
mailInfo.setMailServerPort(mailServerPort); //發送方SMTP伺服器端口
mailInfo.setValidate(true); //設定SMTP伺服器需要身份驗證
mailInfo.setUserName(userName); //發送方郵箱賬号
mailInfo.setPassword(password); //發送方郵箱密碼
mailInfo.setFromAddress(fromAddress); //發送方郵箱位址
mailInfo.setToAddress(toAddress); //接收方郵箱位址
mailInfo.setSubject(subject); //郵件标題
mailInfo.setContent(content); //郵件内容
//這個類主要來發送郵件
SimpleMailSender sms = new SimpleMailSender();
boolean flag = false;
flag = sms.sendHtmlMail(mailInfo);//發送html格式
//如果郵件發送成功,則跳轉到success.jsp頁面;否則,跳轉到fail.jsp頁面
if(flag)
{
System.out.println("發送html格式mail 成功!");
response.sendRedirect("success.jsp");
}
else
{
System.out.println("發送html格式mail 失敗!");
response.sendRedirect("fail.jsp");
}
}
}
MailSenderInfo.java
package com.util.mail;
/**
* 發送郵件需要使用的基本資訊
*/
import java.util.Properties;
public class MailSenderInfo {
// 發送郵件的伺服器的IP和端口
private String mailServerHost;
private String mailServerPort = "25";
// 郵件發送者的位址
private String fromAddress;
// 郵件接收者的位址
private String toAddress;
// 登陸郵件發送伺服器的使用者名和密碼
private String userName;
private String password;
// 是否需要身份驗證
private boolean validate = false;
// 郵件主題
private String subject;
// 郵件的文本内容
private String content;
// 郵件附件的檔案名
private String[] attachFileNames;
/**
* 獲得郵件會話屬性
*/
public Properties getProperties(){
Properties p = new Properties();
p.put("mail.smtp.host", this.mailServerHost);
p.put("mail.smtp.port", this.mailServerPort);
p.put("mail.smtp.auth", validate ? "true" : "false");
return p;
}
public String getMailServerHost() {
return mailServerHost;
}
public void setMailServerHost(String mailServerHost) {
this.mailServerHost = mailServerHost;
}
public String getMailServerPort() {
return mailServerPort;
}
public void setMailServerPort(String mailServerPort) {
this.mailServerPort = mailServerPort;
}
public boolean isValidate() {
return validate;
}
public void setValidate(boolean validate) {
this.validate = validate;
}
public String[] getAttachFileNames() {
return attachFileNames;
}
public void setAttachFileNames(String[] fileNames) {
this.attachFileNames = fileNames;
}
public String getFromAddress() {
return fromAddress;
}
public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getToAddress() {
return toAddress;
}
public void setToAddress(String toAddress) {
this.toAddress = toAddress;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String textContent) {
this.content = textContent;
}
}
MyAuthenticator.java
package com.util.mail;
import javax.mail.*;
public class MyAuthenticator extends Authenticator{
String userName=null;
String password=null;
public MyAuthenticator(){
}
public MyAuthenticator(String username, String password) {
this.userName = username;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(userName, password);
}
}
SimpleMailSender.java
package com.util.mail;
import java.util.Date;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
/**
* 簡單郵件(不帶附件的郵件)發送器
*/
public class SimpleMailSender {
/**
* 以文本格式發送郵件
* @param mailInfo 待發送的郵件的資訊
*/
public boolean sendTextMail(MailSenderInfo mailInfo) {
// 判斷是否需要身份認證
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
if (mailInfo.isValidate()) {
// 如果需要身份認證,則建立一個密碼驗證器
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根據郵件會話屬性和密碼驗證器構造一個發送郵件的session
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
try {
// 根據session建立一個郵件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 建立郵件發送者位址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 設定郵件消息的發送者
mailMessage.setFrom(from);
// 建立郵件的接收者位址,并設定到郵件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
mailMessage.setRecipient(Message.RecipientType.TO,to);
// 設定郵件消息的主題
mailMessage.setSubject(mailInfo.getSubject());
// 設定郵件消息發送的時間
mailMessage.setSentDate(new Date());
// 設定郵件消息的主要内容
String mailContent = mailInfo.getContent();
mailMessage.setText(mailContent);
// 發送郵件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
/**
* 以HTML格式發送郵件
* @param mailInfo 待發送的郵件資訊
*/
public static boolean sendHtmlMail(MailSenderInfo mailInfo){
// 判斷是否需要身份認證
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
//如果需要身份認證,則建立一個密碼驗證器
if (mailInfo.isValidate()) {
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根據郵件會話屬性和密碼驗證器構造一個發送郵件的session
// Session.getInstance(pro,authenticator);每次發生時擷取一個新的session對象
// Session.getDefaultInstance(pro,authenticator);先看之前有沒有session對象,如果沒有,就new一個;如果有,則直接使用之前那個
Session sendMailSession = Session.getInstance(pro,authenticator);
try {
// 根據session建立一個郵件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 建立郵件發送者位址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 設定郵件消息的發送者
mailMessage.setFrom(from);
// 建立郵件的接收者位址,并設定到郵件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
// Message.RecipientType.TO屬性表示接收者的類型為TO
mailMessage.setRecipient(Message.RecipientType.TO,to);
// 設定郵件消息的主題
mailMessage.setSubject(mailInfo.getSubject());
// 設定郵件消息發送的時間
mailMessage.setSentDate(new Date());
// MiniMultipart類是一個容器類,包含MimeBodyPart類型的對象
Multipart mainPart = new MimeMultipart();
// 建立一個包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 設定HTML内容
html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
mainPart.addBodyPart(html);
// 将MiniMultipart對象設定為郵件内容
mailMessage.setContent(mainPart);
// 發送郵件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
}
Test.java
package com.util.mail;
public class Test {
public static void main(String[] args){
//這個類主要是設定郵件
MailSenderInfo mailInfo = new MailSenderInfo();
//伺服器與端口的對應關系: smtp.qq.com -> 587 smtp.163.com -> 25
mailInfo.setMailServerHost("smtp.163.com"); //發送方的郵件伺服器位址
mailInfo.setMailServerPort("25"); //發送方SMTP伺服器端口
mailInfo.setValidate(true); //設定SMTP伺服器需要身份驗證
mailInfo.setUserName("[email protected]"); //發送方郵箱賬号
mailInfo.setPassword("xxxxxxxxxxxx"); //發送方郵箱密碼
mailInfo.setFromAddress("[email protected]"); //發送方郵箱位址
mailInfo.setToAddress("[email protected]"); //接收方郵箱位址
mailInfo.setSubject("java mail發送郵件的測試"); //郵件标題
mailInfo.setContent("這是我在測試用java mail來發郵件"); //郵件内容
//這個類主要來發送郵件
SimpleMailSender sms = new SimpleMailSender();
//boolean flag1 = false;
//flag1 = sms.sendTextMail(mailInfo);//發送文體格式
//if(flag1)
// System.out.println("發送文體格式mail 成功!");
boolean flag2 = false;
flag2 = sms.sendHtmlMail(mailInfo);//發送html格式
if(flag2)
System.out.println("發送html格式mail 成功!");
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>SendMailServlet</servlet-name>
<servlet-class>com.mail.servlet.SendMailServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SendMailServlet</servlet-name>
<url-pattern>/SendMailServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >
<title>首頁</title>
</head>
<body>
<a href="sendMail.jsp" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >去發一封郵件</a> <br>
</body>
</html>
sendMail.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >
<title>發送郵件</title>
<style type="text/css">
.label{ float: left; width: 200px; text-align: right; }
.b{color: red;}
</style>
</head>
<body>
<form action="SendMailServlet" method="post">
<p><label>請登入您的郵箱</label></p>
<label class="label"><b class="b">*</b> 郵箱賬号:</label> <input type="text" name="username" size="30" maxlength="25" />
<select name="serverhost">
<option value="qq.com">@qq.com</option>
<option value="163.com">@163.com</option>
<option value="sina.com">@sina.com</option>
<option value="sohu.com">@sohu.com</option>
<option value="126.com">@126.com</option>
</select>
<br />
<label class="label"><b class="b">*</b> 郵箱密碼:</label> <input type="password" name="password" size="30" maxlength="25" /><br />
<label class="label"><b class="b">*</b> 收件人郵箱:</label> <input type="text" name="toaddress" size="30" maxlength="25" /><br />
<label class="label">郵件标題:</label> <input type="text" name="subject" size="100" maxlength="200" /><br />
<label class="label">郵件内容:</label> <textarea name="content" rows="15" cols="85"></textarea><br />
<label class="label"><input type="submit" value="發送" /></label>
</form>
</body>
</html>
success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >
<title>發送成功 </title>
</head>
<body>
恭喜,發送郵件成功 !點<a href="sendMail.jsp" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >這裡</a>回去再發一封。
</body>
</html>
fail.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >
<title>發送失敗</title>
</head>
<body>
抱歉,發送郵件失敗 !點<a href="sendMail.jsp" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ><b>這裡</b></a>回去重新發一封。
</body>
</html>
項目運作後的發送郵件的首頁面如下圖(可以選擇需要的郵箱類型來登入,并發郵件到不同類型的郵箱):
需要注意的地方
(1) 想要自己開發發送郵件的項目,在自己的項目中登入自己的郵箱時,請確定自己的該郵箱的中的 POP3/SMTP服務已經開啟,隻有自己郵箱賬号的POP3/SMTP服務是開啟的,在自己開發的項目中才能成功發送郵件,否則會發送失敗,因為要登入到自己的郵箱賬号是需要向郵箱公司那邊發送資訊認證的。有些類型的郵箱是預設開啟的,如163郵箱就是預設開啟的,而QQ郵箱和sina郵箱是需要自己手動開啟的。
(2) 以QQ郵箱為例,開啟郵箱的 POP3/SMTP服務的方法是: 登入自己的賬号,進去郵箱首頁面後,找到“設定” 按進去,然後找到“賬戶”按進去,然後就可以找到“POP3/SMTP服務”,點選“開啟”按鈕,經過相關資訊的認證後,就可以開啟了。 開啟後就可以在自己的項目中登入自己的郵箱賬号來發郵件了。
(3) 請使用上面“開發環境”中的連結提供的activation.jar、mail.jar,因為在開發過程中,我發現有些 activation.jar、mail.jar有問題,導緻了項目的失敗,最後下載下傳了上面的activation.jar、mail.jar來使用,項目成功。
(4) 如果全部用以上源代碼來運作,出現錯誤的話,極大的可能就是您的郵箱的 POP3/SMTP服務沒有開啟。
整個項目的源碼,可以在 http://download.csdn.net/detail/wangcunhuazi/8090827這裡下載下傳
如有不妥之處,請各位兄台不吝賜教!