一,邮件协议
电子邮件在传递时,要遵循特定的规则。只有在协议的保证下,电子邮件才能在不同的服务器之间进行传递。
常用的电子邮件协议:
1. SMTP:
Simple Mail Transfer Protocol,简单邮件传输协议。定义了邮件传递的基本规则。主要用于系统之间传递邮件信息,提供来信服务。在发送邮件时,可以选择这个协议。
2.POP3:
Post Office Protocol,邮局协议。规定了用户连接到邮件服务器和接收邮件的规则,是Internet电子邮件的第一个离线协议标准。在接受邮件,可以选择这个协议。
3.IMAP:
Internet Message Access Protocol,互联网消息访问协议。对POP3协议的扩展,主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件。
区别于POP3:可以通过客户端可以直接对服务器上的邮件进行操作,不用把所有邮件下载,使用IMAP可以在邮件服务器上创建自己的邮件目录。
以上的邮件协议JavaMail都支持。
Java中提供了JavaMail API,用来提供邮件的基本服务,对邮件的处理不依赖于具体的协议。
二,开发环境的配置
JavaMail API安装配置:点击打开链接 解压下载的压缩包,找到mail.jar文件。添加到项目的WEB-INF/lib的文件夹下
JavaBeans Activation Framework:点击打开链接 和JavaMail API的配置过程一样。
三,发送邮件
1.先写一个JSP的页面,用来填写发送人,收信人,邮件主题,主题。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JavaMail 发送文本邮件</title>
</head>
<body>
<div align="center">
<font size="1">
使用JavaMail发送文本文件示例:<br>
<form method="post" action="SendTextMail">
收信人:<input type="text" size="40" name="to"/><br>
发信人:<input type="text" size="40" name="from" value="发件人邮箱"/><br>
主题: <input type="text" size="40" name="subject"/><br>
内容: <textarea rows="6" cols="38" name="content"></textarea><br>
<input type="submit" value="发送"/>
<input type="reset" value="取消" />
</form>
</font>
</div>
</body>
</html>
2.编写一个Servlet。在Servlet中接受用户提供的表单内容。在Servlet中提供了邮件使用的SMTP服务器地址,邮箱账户和密码。(因为每个邮箱SMTP服务器的命名规则不同,所有手动的写出)。然后调用TextMail这个JavaBean的功能。根据表单创建邮件,然后将邮件发送到目标地址。(用注释的方法配置Servlet)
package beans;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/SendTextMail")
public class SendTextMail extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置邮箱的SMTP地址
String host="smtp.163.com";
//设置邮箱账户名称
String name="15929243619";
//设置邮箱账号密码
String password="wyf19960722";
//设置邮件内容
TextMail mail=new TextMail(host,name,password);
mail.setFrom(request.getParameter("from"));
mail.setTo(request.getParameter("to"));
mail.setSubjects(request.getParameter("subject"));
mail.setText(request.getParameter("content"));
response.setContentType("text/html");
response.setCharacterEncoding("gb2312");
PrintWriter out=response.getWriter();
//发送邮件
if(mail.send())
{
out.print("<font size='1'>邮件发送成功!</font><br>");
}
else
{
out.print("<font size='1'>邮件发送失败!</font><br>");
}
}
public SendTextMail() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
3.编写JavaBeans的一个类,TextMail。在这个JavaBean中,提供了文件邮件的基本操作方法。代码及其解析:
package beans;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/*
* 向指定邮箱发送邮件
*/
public class TextMail {
private MimeMessage message; //定义MimeMessage属性
private Properties props; //定义Properties属性
private Session session; //定义session属性
private String name="";
private String password="";
//在JavaMail中,首先需要取得与邮件服务器的连接.
public TextMail(String host,String name,String password)
{
this.name=name;
//属性对象,存放着邮件服务器的基本信息
this.password=password;
props=System.getProperties();
//设置SMTP主机
props.put("mail.smtp.host", host);
//设置SMTP验证属性
props.put("mail.smtp.auth",true);
/*为防止垃圾邮件,需要身份认证。Java API通过Authenticator以用户名和密码的方式访问受保护的资源。(因为Authenticator是个抽象类,需要继承才能实现。而且该继承类必须
* 具有返回PasswordAuthentication对象(用于存储认证时要用到的用户名,密码)getPasswordAuthentication()方法。)
* 在Session进行注册,使Session了解在认证时该使用哪个类。*/
MyAuthenicator auth=new MyAuthenicator(name,password);
/*用Session对象来描述邮件的会话状态。
在JavaMail中的Session对象可以利用java.util.Properties对象获得邮件服务器,用户名,密码信息以及其他信息。
Session的构造方法是私有的,可以使用Session的getDefaultInstance()这个静态工厂方法获得默认的session对象。*/
session=Session.getDefaultInstance(props, auth);
/*构造邮件对象,使用javax.mail.internet.MimeMessage(使用MIME类型,MIME信息头的邮箱信息),
* 必须将Session对象作为MimeMessage构造器的参数传入。*/
message=new MimeMessage(session);
}
/*设置邮件各部分:通过传入的字符串构造了一个Address对象,通过setFrom()方法设置发送地址。接收地址类似。
* 设置邮件主题(传入一个字符串参数),
* 设置邮件内容(文本邮件内容-传入简单的字符串参数)*/
//设置邮件发送人
public void setFrom(String from)
{
try
{
message.setFrom(new InternetAddress(from));
}catch(AddressException e)
{
e.printStackTrace();
}catch(MessagingException e)
{
e.printStackTrace();
}
}
//设置邮件收件人
public void setTo(String to)
{
try
{
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
}catch(AddressException e)
{
e.printStackTrace();
}catch(MessagingException e)
{
e.printStackTrace();
}
}
//设置邮件主题
public void setSubjects(String subject)
{
try
{
message.setSubject(subject);
}catch(Exception e)
{
e.printStackTrace();
}
}
//设置邮件正文
public void setText(String text)
{
try
{
message.setText(text);
}catch(Exception e)
{
e.printStackTrace();
}
}
/*使用Transport对象来发送邮件,Transport对象可从Session邮件会话对象中取得,
* 指定Transport的对象使用的是SMTP通信协议。
* 从属性对象中取出邮件服务器主机的地址,mail.smtp.host就是SMTP邮件服务器的地址
* 发送地址: message.getRecipients(Message.RecipientType.TO),从邮件对象中取得发送邮件的目标地址
*/
//发送邮件
public boolean send()
{
try
{
//建立SMTP邮件协议发送对象
Transport transport=session.getTransport("smtp");
//取得邮件服务器的连接
transport.connect((String)props.get("mail.stmp.host"), name, password);
//通过邮件服务器发送邮件
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
transport.close();
return true;
}catch(NoSuchProviderException e)
{
e.printStackTrace();
return false;
}catch(MessagingException e)
{
e.printStackTrace();
return false;
}
}
}
继承类MyAuthenticator:
package beans;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
public class MyAuthenicator extends Authenticator{
String name;
String password;
public MyAuthenicator(String name,String password)
{
this.name=name;
this.password=password;
getPasswordAuthentication();
}
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(name,password);
}
}