实现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
项目的结构:
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项目,然后把下面的每个文件的源代码复制粘贴到自己的项目的
说的所有项目结构和源代码。
(注意:通过上面链接下载到的项目,在导入自己的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("18316022546@163.com"); //发送方邮箱账号
mailInfo.setPassword("xxxxxxxxxxxx"); //发送方邮箱密码
mailInfo.setFromAddress("18316022546@163.com"); //发送方邮箱地址
mailInfo.setToAddress("dgh18316022546@sina.com"); //接收方邮箱地址
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 成功!");
}
}
<?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%>">
<title>首页</title>
</head>
<body>
<a href="sendMail.jsp">去发一封邮件</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%>">
<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%>">
<title>发送成功 </title>
</head>
<body>
恭喜,发送邮件成功 !点<a href="sendMail.jsp">这里</a>回去再发一封。
</body>
</html>
<%@ 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%>">
<title>发送失败</title>
</head>
<body>
抱歉,发送邮件失败 !点<a href="sendMail.jsp"><b>这里</b></a>回去重新发一封。
</body>
</html>
项目运行后的发送邮件的主页面如下图(可以选择需要的邮箱类型来登录,并发邮件到不同类型的邮箱):
需要注意的地方
(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这里下载
如有不妥之处,请各位兄台不吝赐教!