您的位置:首页 > 编程语言 > Java开发

Java轮子-Java发送qq邮件

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

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所说的密码了。





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

首先,在我的代码里,先写两个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.intern
bb37
et.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("xxxxxxxxx@qq.com");
mailBox.setMailPassword("geewtndcrvawqebe");
mail.setSendTo("xxxxxxxxxx@qq.com");
mail.setText("测试 * hello world\n");
mail.setSubject("测试test");
sendMail.setProperties(mailBox);
sendMail.setMail(mail);
sendMail.sendQQSmtpEmail();
}
}
先设置邮箱的属性和邮件的内容,然后,发送。。

效果图,如图所示:



我使用spring boot写的,感兴趣的小伙伴可以去GitHub上down下来看看,以下是地址:
https://github.com/zdxxinlang/SendEmailSpringBoot.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息