首页 > 代码库 > JavaMail
JavaMail
在B/S模式的应用中,收发邮件是一件比较常见的功能,在Java Web中可以使用JavaMail,在使用Java发送邮件,必须知道发送方和收件方的邮箱地址,另外,发送发还要知道自己的邮箱地址,但是无需知道收件方的密码
了解一下基础知识
邮件传输
在Internet上,邮件是以SMTP(简单邮件传输协议)来传输的,所以,发送方需要知道自己邮件服务商的SMTP服务器地址。163的SMTP服务器地址是smtp.163.com,腾讯的是smtp.qq.com,其他的可以在其网站上查询
邮件收取
在Internet上,邮件是以POP(邮局协议,目前使用的是第3个版本,也称POP3)来收取的。如果是使用Java收邮件,就需要知道POP服务器地址,163的是:pop3.163.com ,而腾讯的是:pop3.qq.com
也就是说只是单纯发邮件,只需要知道发送方的SMTP地址,如果要收邮件才须知道POP服务器
邮件表达
邮件是根据MIME(多用途因特网邮件扩展)来标准表达的,它对传输内容的信息,附件及其他内容定义了格式
准备工作
要想使用JavaMail需要在下载Javamail开发包(javax.mail.jar),和JavaBeans Activation Framework(JAF)(解压后使用activation.jar),JAF是用来处理带附件的邮件的,将在这两个jar包放在WEB-INF/lib目录下就行了
javax.mail.Session类是用来创建邮件对象,实现邮件对象中数据的封装并可以指定一些属性
javax.mail.Transport类用于发送邮箱,可以根据Session类对象的getTransport()方法生成
javax.mail.internet.InternetAddress用于封装邮箱地址
javax.mail.internet.MineMessage是邮件的消息类
发送简单的内容
这里我是用Jsp来写的,以后可以灵活改变,值得注意的是包不要导错了,建议使用javax.mail.*和javax.mail.internet.*(要导入这两个包中的内容)
<%@page import="javax.mail.*"%><%@page import="javax.mail.internet.*"%><%@ 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> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="http://www.mamicode.com/styles.css"> --> </head> <body> <% String to_mail="1105062331@qq.com"; //接受方地址(灵活改变) String title="这是一封邮件"; //邮件标题 String content="<strong>你好,欢迎注册本购物网站</strong>"; //邮件内容 /*1.创建邮箱的连接会话 javax.mail.Session*/ Properties prop=new Properties(); prop.put("mail.smtp.auth", "true"); //指定登录时必须验证 Session s=Session.getInstance(prop); /*2.创建邮件:根据Session建立*/ MimeMessage message=new MimeMessage(s); //设置邮件发送方(灵活改变) message.setFrom(new InternetAddress("18337953723@163.com")); //设置邮箱的接收方 message.setRecipient(Message.RecipientType.TO, new InternetAddress(to_mail)); //设置邮箱标题 message.setSubject(title); //设置邮箱内容 message.setContent(content,"text/plain;charset=utf-8"); message.setSentDate(new Date()); //设置邮箱发送时间 message.saveChanges(); //保存发送 /*3.连接到发送方的smtp服务器,用javax.mail.Transport来传输*/ Transport tran=s.getTransport("smtp"); //发送方smtp服务器地址,账号,密码(灵活改变) tran.connect("smtp.163.com", "18337953723", "return0;"); /*4.发邮件*/ tran.sendMessage(message, message.getAllRecipients()); tran.close(); out.print("发送成功"); %> </body></html>
发送带HTML的邮件
使用带HTML格式的邮件可以使内容更丰富更具表现力。不过要使用MimeMultipart对象来存放BodyPart,即HTML文件内容,而且设置内容时要设置对象格式:text/html;charset=utf-8,在发送简单内容时使用的是text/plain;charset=utf-8
<%@page import="javax.mail.internet.*"%><%@page import="javax.mail.*"%><%@ 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>发送带HTMl的邮件</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="http://www.mamicode.com/styles.css"> --> </head> <body> <% String to_mail="1105062331@qq.com"; //接受方地址(灵活改变) String title="这是一封邮件"; //邮件标题 String content="<strong>你好</strong>,<em>欢迎注册本购物网站</em>"; //邮件内容(带HTML) /*1.创建邮箱的连接会话 javax.mail.Session*/ Properties prop=new Properties(); prop.put("mail.smtp.auth", "true"); //指定登录时必须验证 Session s=Session.getInstance(prop); /*2.创建邮件:根据Session建立*/ MimeMessage message=new MimeMessage(s); //设置邮件发送方(灵活改变) message.setFrom(new InternetAddress("18337953723@163.com")); //设置邮箱的接收方 message.setRecipient(Message.RecipientType.TO, new InternetAddress(to_mail)); //设置邮箱标题 message.setSubject(title); //给消息对象设置内容 //新建一个存放信件内容的BodyPart对象 BodyPart mdp=new MimeBodyPart(); //给BodyPart对象设置内容和编码格式 mdp.setContent(content,"text/html;charset=utf-8"); //新建一个MimeMultipart对象来存放BodyPart对象 Multipart mm=new MimeMultipart(); //将Bodypart加入到MimeMultipart对象中(可以加入多个) mm.addBodyPart(mdp); //把mm作为消息对象的内容 message.setContent(mm); message.setSentDate(new Date()); //设置邮箱发送时间 message.saveChanges(); //保存发送 /*3.连接到发送方的smtp服务器,用javax.mail.Transport来传输*/ Transport tran=s.getTransport("smtp"); //发送方SMTP服务器,账号,密码 tran.connect("smtp.163.com", "18337953723", "return0;"); /*4.发邮件*/ tran.sendMessage(message, message.getAllRecipients()); tran.close(); out.print("发送成功"); %> </body></html>
发送带附件的邮件
发送带附件的邮件就需要使用Javax.activation包(就是JAF中的),在这里发送方将c:/balloons.jpg发送出去
<%@page import="javax.activation.DataHandler"%><%@page import="javax.activation.FileDataSource"%><%@page import="javax.mail.internet.*"%><%@page import="javax.mail.*"%><%@ 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> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="http://www.mamicode.com/styles.css"> --> </head> <body> <% String to_mail="1105062331@qq.com"; //接受方地址(灵活改变) String title="这是一封带附件邮件"; //邮件标题 String content="<strong>你好</strong>,<em>欢迎注册本购物网站</em>"; //邮件内容(带HTML) String path1="c:/balloons.jpg"; //选择的附件(灵活改变) /*1.创建邮箱的连接会话 javax.mail.Session*/ Properties prop=new Properties(); prop.put("mail.smtp.auth", "true"); //指定登录时必须验证 Session s=Session.getInstance(prop); /*2.创建邮件:根据Session建立*/ MimeMessage message=new MimeMessage(s); //设置邮件发送方(灵活改变) message.setFrom(new InternetAddress("18337953723@163.com")); //设置邮箱的接收方 message.setRecipient(Message.RecipientType.TO, new InternetAddress(to_mail)); //设置邮箱标题 message.setSubject(title); //设置邮件内容是包含附件的,附件用MimeMultipart来承载 MimeMultipart mm=new MimeMultipart(); message.setContent(mm); //将mm设置为内容 MimeBodyPart mbp=new MimeBodyPart(); //向mbp内添加文件 FileDataSource fbs=new FileDataSource(path1); DataHandler dh=new DataHandler(fbs); mbp.setDataHandler(dh); mbp.setFileName(MimeUtility.encodeText("图片.jpg")); //传到对方显示的文件名,使用MimeUtility工具类手工编码 //添加附件 mm.addBodyPart(mbp); BodyPart mdp=new MimeBodyPart(); //给BodyPart对象设置内容和编码格式 mdp.setContent(content,"text/html;charset=utf-8"); mm.addBodyPart(mdp); message.setSentDate(new Date()); //设置邮箱发送时间 message.saveChanges(); //保存发送 /*3.连接到发送方的smtp服务器,用javax.mail.Transport来传输*/ Transport tran=s.getTransport("smtp"); //发送行SMTP服务器,账号,密码(灵活改变) tran.connect("smtp.163.com", "18337953723", "return0;"); /*4.发邮件*/ tran.sendMessage(message, message.getAllRecipients()); tran.close(); out.print("发送成功"); %> </body></html>
值得注意的是:发送带附件使用的是MimeBodyPart类,而发送带HTML格式内容要使用BodyPart类,这两个类都可以使用new MimeBodyPart()new出来。还有一个就是附件中文名乱码问题
mbp.setFileName(MimeUtility.encodeText("图片.jpg")); //传到对方显示的文件名,使用MimeUtility工具类手工编码
如果不进行编码,接收方的附件名就是乱码
读取邮件
通过JavaMail来读取邮件服务器的邮件,实际使用并不多
javax.mail.Store类用于读取邮件,可由Session类对象的getStore()方法生成
javax.mail.Folder类用于保存某文件夹中的所有邮件,常用方法是getMessage()用于返回文件夹下所有邮件,是以Message数组返回
<%@page import="javax.mail.Message"%><%@page import="javax.mail.Folder"%><%@page import="javax.mail.Store"%><%@page import="javax.mail.Session"%><%@ 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> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="http://www.mamicode.com/styles.css"> --> </head> <body> <% //将邮箱的邮件数显示,需要知道密码 /*1.创建会话*/ Session s=Session.getInstance(System.getProperties(),null); //得到系统默认属性 /*邮箱传输使用smtp,接受使用pop3*/ /*2.连接到pop服务器,获取邮件*/ Store store=s.getStore("pop3"); //需要获得邮件POP服务器地址,邮箱地址,密码(灵活改变) store.connect("pop3.163.com","18337953723@163.com","return0;"); //得到收件箱里面的邮件,INBOX是关键字,还有其他关键字(灵活改变) Folder folder=store.getFolder("INBOX"); folder.open(Folder.READ_WRITE); //可以显示,可以删除 /*3.显示邮件的内容*/ Message[] megs=folder.getMessages(); out.print("邮件共有"+megs.length+"封<HR>"); for(int i=0;i<megs.length;i++){ Message meg=megs[i]; out.print(meg.getSubject()+"<BR>"); out.print("<HR>"); } store.close(); %> </body></html>
JavaMail