天天看点

实现java mail发送邮件

实现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

项目的结构:

实现java mail发送邮件

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>
           

项目运行后的发送邮件的主页面如下图(可以选择需要的邮箱类型来登录,并发邮件到不同类型的邮箱):

实现java mail发送邮件

需要注意的地方

(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这里下载

如有不妥之处,请各位兄台不吝赐教!