Java轮子-Java发送qq邮件

来源:互联网 发布:ios pdf阅读器源码 编辑:程序博客网 时间:2024/06/14 22:47

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


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


原创粉丝点击