Java轮子-Java发送qq邮件

xiaoxiao2021-02-28  7

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

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.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("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

转载请注明原文地址: https://www.6miu.com/read-1150290.html

最新回复(0)