Java实现发送邮件到邮箱(已测!!!支持QQ邮箱163邮箱以及Gmail邮箱等等知名邮箱.......)

电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等。但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。

  1. 电子邮件协议

电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。

  1. JavaMail

我们平时通过 Java 代码打开一个 http 网页链接时,通常可以使用已经对 http 协议封装好的 HttpURLConnection 类来快速地实现。Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,需要我们自己去官方下载,这里我从 JavaEE 官方的 Github 仓库下载。

JavaMail 下载地址: https://github.com/javaee/javamail/releases

这里我下载的版本是 1.6.2 版本,包含了 SMTP, IMAP, 和 POP3 协议的实现的 jar 包:

1、先开启邮箱协议(演示使用的是QQ邮箱)如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、测试类:

import utils.Mailer;
import utils.SendMailer;

public class Main {
	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		//具体去看实体类的参数描述(里面有具体解释)
		Mailer mailer = new Mailer("邮件服务器地址", "发件人邮箱",
				"发件人授权码", "端口", "ssl", "UTF-8", "发送人昵称");
		Email email = new Email();
		//设置收件人
		email.setAddress("收件人邮箱");
		//设置头部
		email.setTitle("小轩系统");
		// 设置文本内容
		// email.setBody("Xuan测试发送邮件");
		// 设置Html网页内容
		email.setHtmlBody("<h1>Xuan测试发送邮件</h1></hr><h1>分界线</h1>");
		SendMailer send = new SendMailer(mailer);
		// 发送文本内容
		send.sendTextBody(email);
		// 发送Html网页内容
		// send.sendHtmlBody(email);
	}
}

3、发送邮件内容实体类:

/**
 * 发送邮件内容实体类
 * 
 * @author Xuan
 * 
 */
public class Email {
	// 地址
	private String address;
	// 标题
	private String title;
	// 文本格式
	private String body;
	// html格式
	private String htmlBody;

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getBody() {
		return body;
	}

	public void setBody(String body) {
		this.body = body;
	}

	public String getHtmlBody() {
		return htmlBody;
	}

	public void setHtmlBody(String htmlBody) {
		this.htmlBody = htmlBody;
	}

}

4、发送邮件的配置实体类 可自己迭代开发:

/**
 * 发送邮件的配置实体类 可自己迭代开发
 * 
 * @author Xuan
 * 
 */
public class Mailer {
	public Mailer() {
		super();
	}

	public Mailer(String host, String username, String password, String port,
			String encryption, String charset, String nickname) {
		super();
		this.host = host;
		this.username = username;
		this.password = password;
		this.port = port;
		this.encryption = encryption;
		this.charset = charset;
		this.nickname = nickname;
	}

	private String host;// 发送邮件服务器 smtp.qq.com格式
	private String username;// 发件人邮箱
	private String password;// 发件人邮箱的授权码(不是密码!!是开启smtp的时候获得的授权码)
	private String port;// 发件采用的端口号465或587
	private String encryption;// SSL
	private String charset;// 设置字符集
	private String nickname;// 发件人别名

	public String getHost() {
		return host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPort() {
		return port;
	}

	public void setPort(String port) {
		this.port = port;
	}

	public String getEncryption() {
		return encryption;
	}

	public void setEncryption(String encryption) {
		this.encryption = encryption;
	}

	public String getCharset() {
		return charset;
	}

	public void setCharset(String charset) {
		this.charset = charset;
	}

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

}

5、发送邮件的发送器类:

import java.util.Date;
import java.util.Properties;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import Email;

/**
 * 发送邮件的发送器类
 * 
 * @author Xuan
 * 
 */
public class SendMailer {
	private Mailer mailer;

	public SendMailer() {
		super();
	}

	public SendMailer(Mailer mailer) {
		super();
		this.mailer = mailer;
	}

	/**
	 * 发送文本内容
	 * 
	 * @param email
	 * @throws Exception
	 */
	public void sendTextBody(Email email) throws Exception {
		// 1. 创建一封邮件
		MimeMessage message = new MimeMessage(getSession());
		// 2. From:发件人
		message.setFrom(new InternetAddress(mailer.getUsername(), mailer
				.getNickname(), mailer.getCharset()));
		// 3. To: 收件人(可以增加多个收件人、抄送、密送)
		message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(
				email.getAddress(), mailer.getNickname(), mailer.getCharset()));
		// 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
		message.setSubject(email.getTitle(), mailer.getCharset());
		// 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
		message.setContent(email.getBody(), "text/plain;charset=UTF-8");
		// 6. 设置发件时间
		message.setSentDate(new Date());
		// 7. 保存设置
		message.saveChanges();
		// 8. 根据 Session 获取邮件传输对象
		Transport transport = getSession().getTransport();
		// 9. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
		//
		// PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
		// 仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
		// 类型到对应邮件服务器的帮助网站上查看具体失败原因。
		//
		// PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
		// (1) 邮箱没有开启 SMTP 服务;
		// (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
		// (3) 邮箱服务器要求必须要使用 SSL 安全连接;
		// (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
		// (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
		//
		// PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
		transport.connect(mailer.getUsername(), mailer.getPassword());
		// 10. 发送邮件, 发到所有的收件地址, message.getAllRecipients()
		// 获取到的是在创建邮件对象时添加的所有收件人,
		// 抄送人, 密送人
		transport.sendMessage(message, message.getAllRecipients());
		// 11. 关闭连接
		transport.close();
	}

	/**
	 * 发送网页内容
	 * 
	 * @param email
	 * @throws Exception
	 */
	public void sendHtmlBody(Email email) throws Exception {
		// 1. 创建一封邮件
		MimeMessage message = new MimeMessage(getSession());
		// 2. From:发件人
		message.setFrom(new InternetAddress(mailer.getUsername(), mailer
				.getNickname(), mailer.getCharset()));
		// 3. To: 收件人(可以增加多个收件人、抄送、密送)
		message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(
				email.getAddress(), mailer.getNickname(), mailer.getCharset()));
		// 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
		message.setSubject(email.getTitle(), mailer.getCharset());
		// 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
		message.setContent(email.getHtmlBody(), "text/html;charset=UTF-8");
		// 6. 设置发件时间
		message.setSentDate(new Date());
		// 7. 保存设置
		message.saveChanges();
		// 8. 根据 Session 获取邮件传输对象
		Transport transport = getSession().getTransport();
		// 9. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
		//
		// PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
		// 仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
		// 类型到对应邮件服务器的帮助网站上查看具体失败原因。
		//
		// PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
		// (1) 邮箱没有开启 SMTP 服务;
		// (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
		// (3) 邮箱服务器要求必须要使用 SSL 安全连接;
		// (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
		// (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
		//
		// PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
		transport.connect(mailer.getUsername(), mailer.getPassword());
		// 10. 发送邮件, 发到所有的收件地址, message.getAllRecipients()
		// 获取到的是在创建邮件对象时添加的所有收件人,
		// 抄送人, 密送人
		transport.sendMessage(message, message.getAllRecipients());
		// 11. 关闭连接
		transport.close();
	}

	/**
	 * 获得会话的方法
	 * 
	 * @return
	 */
	private Session getSession() {
		// 1. 创建参数配置对象,用于连接邮件服务器的参数配置
		Properties props = new Properties();
		props.setProperty("mail.transport.protocol", "smtp");
		props.setProperty("mail.smtp.port", mailer.getPort());
		props.setProperty("mail.smtp.socketFactory.class",
				"javax.net.ssl.SSLSocketFactory");
		props.setProperty("mail.smtp.socketFactory.fallback", "false");
		props.setProperty("mail.smtp.socketFactory.port", mailer.getPort());
		props.setProperty("mail.smtp.host", mailer.getHost());
		props.setProperty("mail.smtp.auth", "false");
		// 2.读取配置创建Session会话对象,用于和邮件服务器交互
		Session session = Session.getInstance(props);
		// 3.设置为debug模式, 可以查看详细的发送 log (false为关闭,true为打开)
		session.setDebug(true);
		return session;
	}

}

6、遇到困难可以评论(有信必回)小轩微信17382121839。

发布了47 篇原创文章 · 获赞 57 · 访问量 8898

猜你喜欢

转载自blog.csdn.net/qq_41741884/article/details/93228116