JavaMail实现收发邮件——(一)发送邮件

2018-10-06 09:33:00     

一、准备工作

1.jar包准备,你可以从 Java 网站下载最新版本的jar包,也可以使用本站提供的下载链接:

2.QQ 邮件服务器,你需要在登录QQ邮箱后台在"设置"=》账号中开启上面两个:(授权码在下面代码要使用)

二、分析QQ邮箱

  • 发件人: 发件人的QQ邮箱,只能是一个
  • 收件人: 收件人的邮箱,可以有多个
  • 主题: 可写可不写,如果不写容易被QQ邮件服务器当作垃圾邮件处理
  • 正文: 邮件的主体内容
  • 附件: 就是文件,图片之类的东西
  • 抄送: 同时将这一封邮件发送给其他人,抄送人可见其他抄送人的邮箱
  • 密送: 同时将这一封邮件发送给其他人,密送人看不到其他密送人的邮箱

三、jsp页面

form表单采用post方式提交。收件人邮箱这里设置两个,设置其中一个必填,且name属性要一样。


<form method="post" action="${pageContext.request.contextPath}/SentMail">
	<input type="text" name="mymail" placeholder="发送人邮箱" ><br/><br/>
	<input type="text" name="umail" placeholder="收件人邮箱" required><br/>
	<input type="text" name="umail" placeholder="收件人邮箱" ><br/><br/>
	<input type="text" name="name" placeholder="发送人昵称" ><br/><br/>
	<input type="text" name="theme" placeholder="主题" ><br/><br/>
	<input type="text" name="content" placeholder="正文" ><br/><br/>
	<input type="submit" value="发送">
</form>

四、servlet代码

javamail发送邮件的核心API:
  1. Authenticator类:知道如何获得网络连接认证的对象。通常该类会通过包装用户信息来实现。
  • Authenticator是一个抽象类,可以通过创建它的子类PasswordAuthentication,传递用户名和密码来创建
  • 必须为创建的Session对象注册这个Authenticator对象
  • Session类:定义整个程序所需环境信息,比如主机名,端口号,采用的邮件发送和接收协议。
  • Session类没有子类(使用final修饰)
  • Session类的构建方法是私有的,此处它提供了public static Session getDefaultInstance()方法得到Session对象
  • Message类:表示由消息头、消息体等组合的一封电子邮件。
  • Message是个抽象类,因此多数情况下使用的是它的子类javax.mail.internet.MimeMessage
  • Meesage类实现了javax.mail.Part接口,而MimeMessage类实现了javax.mail.internet.MimePart接口
  • 可以通过message.setContentmimeMessage.setText来存储邮件内容
  • Address类:创建了SessionMessage对象后,需要通过Address类来设置信件的地址信息。
  • Address是个抽象类,因此多数用它的实现类javax.mial.internet.InternetAddress
  • Address可以直接通过一个邮箱地址来创建,如:new InternetAddress("123456@qq.com")
  • 另外可以通过邮箱地址和邮寄人姓名来创建,如:new InternetAddress("123456@qq.com", Manisha)
  • Transport类:传输机制,用来发送邮件。
  • 它是一个抽象类
  • 可以用默认版本的静态方法send发送:Transport.send(message)

理解:张三带着身份证和高铁票从北京坐高铁去上海。张三代表Message类,北京到上海的铁轨代表Session类,高铁票Address类,身份证代表Authenticator类,高铁代表Transport类。


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
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;
import javax.mail.internet.MimeUtility;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.mail.util.MailSSLSocketFactory;
@WebServlet("/SentMail")
public class SentMail extends HttpServlet {
private static final long serialVersionUID = 1L;

public SentMail() {
	super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	// 解决以Post方式提交的中文乱码问题
	request.setCharacterEncoding("UTF-8");
	response.setCharacterEncoding("UTF-8");
	response.setContentType("text/html;charset=UTF-8");
	// 发件人昵称
	String mname = request.getParameter("name");
	// 邮件主题
	String theme = request.getParameter("theme");
	// 邮件内容
	String content = request.getParameter("content");
	// 收件人邮箱
	String[] to = request.getParameterValues("umail");
	// 用StringBuffer来存放数组中的非空元素,用“;”分隔
	StringBuffer sb = new StringBuffer();
	for (int i = 0; i < to.length; i++) {
		if ("".equals(to[i])) {
			continue;
		}
		sb.append(to[i]);
		if (i != to.length - 1) {
			sb.append(";");
		}
	}
	// 用String的split方法分割,得到数组
	to = sb.toString().split(";");
	// 发件人邮箱
	String from = request.getParameter("mymail");
	// 指定发送邮件的主机为 smtp.qq.com
	String host = "smtp.qq.com"; // QQ 邮件服务器
	// 获取系统属性
	Properties properties = System.getProperties();
	// 设置邮件服务器
	properties.setProperty("mail.smtp.host", host);
	properties.put("mail.smtp.auth", "true");
	// QQ邮箱,设置SSL加密
	MailSSLSocketFactory sf;
	try {
		sf = new MailSSLSocketFactory();
		sf.setTrustAllHosts(true);
		properties.put("mail.smtp.ssl.enable", "true");
		properties.put("mail.smtp.ssl.socketFactory", sf);
	} catch (GeneralSecurityException e1) {
		e1.printStackTrace();
	}
	// 获取默认session对象
	Session session = Session.getDefaultInstance(properties, new Authenticator() {
		public PasswordAuthentication getPasswordAuthentication() {
			// 发件人邮件用户名、授权码(xxxxxxxx代表QQ邮箱的授权码)
			return new PasswordAuthentication(from, "xxxxxxxx");
		}
	});
	try {
		// 创建默认的 MimeMessage 对象
		MimeMessage message = new MimeMessage(session);
		// 设置发件人的昵称
		String nick = MimeUtility.encodeText(mname);
		// Set From: 设置发件人地址
		message.setFrom(new InternetAddress(nick + " <" + from + ">"));
		// 解析一组收件人的地址
		InternetAddress[] address = new InternetAddress[to.length];
		for (int i = 0; i < to.length; i++) {
			address[i] = new InternetAddress(to[i]);
		}
		// Set To: 设置收件人地址 ,TO代表主要接受者,CC代表抄送接收者,BCC代表暗送接受者
		message.addRecipients(Message.RecipientType.BCC, address);
		// Set Subject: 设置邮件主题
		message.setSubject(theme);
		// 设置发送日期
		message.setSentDate(new Date());
		// 创建消息部分
		BodyPart messageBody = new MimeBodyPart();
		// 消息
		messageBody.setText(content);
		// 创建多重消息
		Multipart multipart = new MimeMultipart();
		// 设置附件部分
		messageBody = new MimeBodyPart();
		File file = new File("file.txt");
		// 构建FileOutputStream对象,文件不存在则自动创建
		FileOutputStream fos = new FileOutputStream(file);
		// 构建爱你OutPutStreamWriter对象,同时解决中文乱码问题
		OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
		// 写入到缓冲区
		osw.write("这是一封邮件。。。");
		// 关闭写入流,同时把缓冲区内容写入到文件中
		osw.close();
		// 关闭输出流,释放资源
		fos.close();
		// 封装文件的简单 DataSource 对象
		DataSource source = new FileDataSource(file);
		// 返回与此 DataHandler 实例关联的 DataSource
		messageBody.setDataHandler(new DataHandler(source));
		messageBody.setFileName(file.getName());
		// 设置消息部分
		multipart.addBodyPart(messageBody);
		// 发送完整消息
		message.setContent(multipart);
		// 发送消息
		Transport.send(message);
		System.out.println("Send message successfully...");
		response.sendRedirect("http://www.baidu.com");
	} catch (MessagingException e) {
		e.printStackTrace();
	}
	doGet(request, response);
  }
}
  • 注意收件人邮箱有一个或多个,所以用数组接收。在jsp页面我们定义了两个收件人邮箱,如果有一个不填就会有一个空元素传递过来,用StringBuffer来处理得到非空元素的数组。
  • 设置SSL加密为邮箱安全考虑,加密数据以防止数据中途被窃取。

ps:本篇博客源码下载链接:https://pan.baidu.com/s/1RbuSeSWlpAfWzWzBJTYRqw 密码:3vr2
GHost博客的搭建

环境系统:Windows Server 2012 64位中文版Ghost版本:GHost-0.7.4node.js版本:v4.2.0nginx版本:v1.8.1一、选择系统GHost博客支持windows、mac、Linux等。我这里用的是阿里云的Windows Server 2012 64位中文版,简单粗暴,没有那么多命令,能够快速上手。二、GHost下载进入到https://github.com/TryGhost/Ghost/releases然后找到GHost-0.7.4版本,下载得到.zip的压缩包。在C盘(因为我只有C盘,尴尬!!!)创建一个空文件夹命名为ghost,解压刚下载的压缩包到该目录下。三、安装node.js进入到https://nodejs.org/en/download/releases/选择Node.

JavaMail实现收发邮件——(二)接收邮件

一、准备工作1.jar包准备,你可以从 Java 网站下载最新版本的jar包,也可以使用本站提供的下载链接:JavaMail mail.jar 1.4.5JAF(版本 1.1.1) activation.jar2.QQ 邮件服务器,你需要在登录QQ邮箱后台在"设置"=》账号中开启上面两个:(授权码在下面代码要使用)二、JSP页面a标签进入邮箱主页,查询所有邮箱。<a href="${pageContext.request.contextPath}/POP3">进入邮箱</a> 三、Servlet代码javamail接受邮件的核心API:Store类:用于执行邮件的接收任务,在程序中调用这个类中的方法可以获取邮箱中的各个邮件夹的信息客户端程序接收邮件时,只需要使用邮件接收 API 得到Store对象,然后调用Store对象的接收方法,就可以从指定的POP3服务器获得邮件数据,

 发表评论