天天看点

Java轮子-Java发送qq邮件

发送邮件,首先就得搞清楚那堆不同的协议究竟是什么?下面一段引用于网易

POP3

POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。

它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

SMTP

SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。 

  SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

IMAP

IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

本文主要基于smtp协议来做的qq邮件的发送。由上面的介绍已经得知,要想smtp发邮件,就得有三个东西:

1. 发件方邮箱地址。

2. 发件方smtp邮箱的密码,这个密码不是邮箱的密码,你登录到qq邮箱,找到smtp功能,开启之后,会给你生成一个,这个以后再说。

3. 收件方的地址

其中1和3比较容易获取,2的获取,首先你需要登录qq邮箱,然后点击设置-常规-账户,开启smtp服务,然后点击那个生成授权码,就可以得到2所说的密码了。

Java轮子-Java发送qq邮件
Java轮子-Java发送qq邮件

好了,得到这些就可以写代码了。

首先,在我的代码里,先写两个pojo类,分别是邮件类和邮箱类,邮件类设置邮件的内容标题和你要发给的目的邮箱地址。而邮箱类则设置邮箱的一些属性,如使用的协议类型,用户名,密码什么的。这东西可以使用spring boot 从配置文件里读,为了简单一点儿,这里就不写了。直接写死它。以下是pojo类代码。

package com.xxjz.sendemail;


import java.io.Serializable;

public class Mail implements Serializable {
	private static final long serialVersionUID = -543077416549260588L;
	private String sendTo;
	private String subject;
	private String text;
	public String getSendTo() {
		return sendTo;
	}
	public void setSendTo(String sendTo) {
		this.sendTo = sendTo;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	public Mail() {
		super();
	}
	
	
}
           
package com.xxjz.sendemail;


import java.io.Serializable;

public class MailBox implements Serializable {
	private static final long serialVersionUID = -543077416549260588L;
	private String mailSmtpAuth;          // SMTP服务器验证
	private String mailSmtpHost;          //SMTP服务器
	private String mailSmtpPort;          //端口号,QQ邮箱给出了两个端口
	private String mailUser;              //账号
	private String mailPassword;          //密码
	public String getMailSmtpAuth() {
		return mailSmtpAuth;
	}
	public void setMailSmtpAuth(String mailSmtpAuth) {
		this.mailSmtpAuth = mailSmtpAuth;
	}
	public String getMailSmtpHost() {
		return mailSmtpHost;
	}
	public void setMailSmtpHost(String mailSmtpHost) {
		this.mailSmtpHost = mailSmtpHost;
	}
	public String getMailSmtpPort() {
		return mailSmtpPort;
	}
	public void setMailSmtpPort(String mailSmtpPort) {
		this.mailSmtpPort = mailSmtpPort;
	}
	public String getMailUser() {
		return mailUser;
	}
	public void setMailUser(String mailUser) {
		this.mailUser = mailUser;
	}
	public String getMailPassword() {
		return mailPassword;
	}
	public void setMailPassword(String mailPassword) {
		this.mailPassword = mailPassword;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
	
}
           

在发送邮件之前,需要添加javax.mail这个依赖包。由于我使用maven项目,所以就直接上代码,在pom文件中加入:

<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
		<dependency>
		    <groupId>javax.mail</groupId>
		    <artifactId>mail</artifactId>
		    <version>1.4.7</version>
		</dependency>
           

接下来就是发送邮件的核心代码:

package com.xxjz.sendemail;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;



public class SendMail {

	private static volatile SendMail singleton = null;
	private MailBox mailBox = new MailBox();
	private Mail mail = new Mail();

	private SendMail() {
	}

	public static SendMail getSingleton() {
		if (singleton == null) {
			synchronized (SendMail.class) {
				if (singleton == null) {
					singleton = new SendMail();
				}
			}
		}
		return singleton;
	}

	public void setProperties(MailBox b) {
		this.mailBox = b;
	}
	
	public void setMail(Mail b) {
		this.mail = b;
	}

	public void sendQQSmtpEmail() throws Exception {
		// 创建Properties 类用于记录邮箱的一些属性
		final Properties props = new Properties();
		// 表示SMTP发送邮件,必须进行身份验证
		props.put("mail.smtp.auth", mailBox.getMailSmtpAuth());
		// 此处是SMTP服务器
		props.put("mail.smtp.host", mailBox.getMailSmtpHost());
		// 端口号,QQ邮箱给出了两个端口
		props.put("mail.smtp.port", mailBox.getMailSmtpPort());
		// 此处是你的账号
		props.put("mail.user", mailBox.getMailUser());
		// 此处的密码就是前面说的STMP密码
		props.put("mail.password", mailBox.getMailPassword());

		// 构建授权信息,用于进行SMTP进行身份验证
		Authenticator authenticator = new Authenticator() {

			protected PasswordAuthentication getPasswordAuthentication() {
				// 用户名、密码
				String userName = props.getProperty("mail.user");
				String password = props.getProperty("mail.password");
				return new PasswordAuthentication(userName, password);
			}
		};
		// 使用环境属性和授权信息,创建邮件会话
		Session mailSession = Session.getInstance(props, authenticator);
		// 创建邮件消息
		MimeMessage message = new MimeMessage(mailSession);
		// 设置发件人
		InternetAddress form = new InternetAddress(props.getProperty("mail.user"));
		message.setFrom(form);

		// 设置收件人的邮箱
		InternetAddress to = new InternetAddress(mail.getSendTo());
		message.setRecipient(RecipientType.TO, to);

		// 设置邮件标题
		message.setSubject(mail.getSubject());

		// 设置邮件的内容体
		message.setContent(mail.getText(), "text/html;charset=UTF-8");

		// 最后发送邮件
		Transport.send(message);
	}

}
           

好了,现在写个测试类验证一下把。

package com.xxjz.sendemail;

 
public class TEST {
	public static void main(String[] args) throws Exception {
		SendMail sendMail = SendMail.getSingleton();
		MailBox mailBox = new MailBox();
		Mail mail = new Mail();
		mailBox.setMailSmtpAuth("true");
		mailBox.setMailSmtpHost("smtp.qq.com");
		mailBox.setMailSmtpPort("587");
		mailBox.setMailUser("[email protected]");
		mailBox.setMailPassword("geewtndcrvawqebe");
		mail.setSendTo("[email protected]");
		mail.setText("测试 * hello world\n");
		mail.setSubject("测试test");
		sendMail.setProperties(mailBox);
		sendMail.setMail(mail);
		sendMail.sendQQSmtpEmail();
	}
}
           

先设置邮箱的属性和邮件的内容,然后,发送。。

效果图,如图所示:

Java轮子-Java发送qq邮件

我使用spring boot写的,感兴趣的小伙伴可以去GitHub上down下来看看,以下是地址:

https://github.com/zdxxinlang/SendEmailSpringBoot.git