由于个人网站之前已经用PHP实现评论邮件通知功能,今天给小程序也加上这个功能,小程序后台接口是用Java做的,所以用java来实现发邮件。要想实现发送邮件功能必须有专门的邮件服务器,可以自己搭也可以用第三方的。这些邮件服务器类就像现实生活中的邮局,主要负责接收用户发送过来的邮件,并把邮件投递到接收者的电子邮箱中。
常用的电子邮件协议有SMTP、POP3和IMAP4,它们都隶属于TCP/IP协议簇,默认状态下分别通过TCP端口25、110和143建立连接。
SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
POP3(Post Office Protocol – Version 3)即邮局协议的第3个版本,由RFC1939 定义,是因特网电子邮件的第一个离线协议标准。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。
IMAP4(Internet Message Access Protocol 4) 即 交互式数据消息访问协议第四个版本。IMAP协议是由斯坦福大学的Mark Crispin教授在1986年开发的,后期版本是华盛顿州立大学进行开发的,现在的版本是“IMAP第四版第一次修订版”(IMAP4rev1)。
实际上SMTP已是事实上的E-Mail传输的标准,这里以SMTP服务器为例来讲解,为了简单方便这里直接使用QQ的邮箱服务器smtp.qq.com,首先要花一毛钱去申请个授权码,之前在讲GitLab配邮件功能时也讲过如何申请授权码,具体操作如下图:
接着引入依赖包implementation “com.sun.mail:javax.mail:1.6.2”,我这里用的是Gradle,你们用maven的在pom.xml中引入:
先看运行后收到邮件效果图:
接下来直接上代码:
package cn.xubingtao.backend.miniprogram.utils;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.util.Properties;
/**
* 邮件工具类
* @Author Xu Bingtao
* @Email 1399898086@qq.com
* @DateTime 2020/6/13 09:39
*/
public class EmailUtil {
public static final String HOST = "smtp.qq.com";
public static final int PORT = 465;
public static final String PROTOCOL = "smtp";
public static final String ISAUTH = "true";
public static final String ISENABLESSL = "true";
public static final String PASSWORD = "16位的授权码,不是登录密码!";
public static final String USERNAME = "1399898086@qq.com";
public static final String FROM = "1399898086@qq.com";//from跟username必须相同不然报:501 Mail from address must be same as authorization user.
public static final String TO = "1399898086@qq.com";
private static final String SUBJECT = "文章有新评论待审批通知";
private static final String CONTENT = "您题为《xx》的文章在小程序中被微信昵称叫:xxx评论录,访问IP为:xxxx,评论内容为:xxx,请您尽快审批。";
private static final String TEXTHTML = "text/html;charset=UTF-8";
private static final boolean ISSETDEBUG = false;
/**
* 发送文本邮件
*/
public static int sendTextEmail(String subject, String content, String to)
throws MessagingException, GeneralSecurityException {
if(StringUtil.isBlank(subject) || StringUtil.isBlank(content) || StringUtil.isBlank(to)) {
return -1;
}
//1.创建一个配置文件并设置相关配置信息
Properties properties = new Properties();
properties.setProperty("mail.host", HOST);
properties.setProperty("mail.transport.protocol", PROTOCOL);
properties.setProperty("mail.smtp.auth", ISAUTH);
MailSSLSocketFactory sf = sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", ISENABLESSL);
properties.put("mail.smtp.ssl.socketFactory", sf);
//2.创建整个应用程序所需的环境信息 Session 对象
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(USERNAME, PASSWORD);
}
});
//开启debug模式会打印发邮件日志
session.setDebug(ISSETDEBUG);
//3、通过session获取Transport连接对象
Transport transport = session.getTransport();
//4、通过邮箱账号和授权码连接邮箱服务器,不加端口或者传-1会默认使用465端口
transport.connect(HOST, USERNAME, PASSWORD);
//5、传入session对象,创建邮件对象并设置相关信息
MimeMessage mimeMessage = new MimeMessage(session);
//5.1设置邮件发送人
mimeMessage.setFrom(new InternetAddress(FROM));
//5.2设置邮件接收人
mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
//5.3设置邮件主题
mimeMessage.setSubject(subject);
//5.4设置邮件内容
mimeMessage.setContent(content, TEXTHTML);
//6.发送邮件
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
//7.关闭连接
transport.close();
return 1;
}
/**
* 发送图文、附件邮件
* @return
* @throws GeneralSecurityException
* @throws MessagingException
*/
public static int sendMIMEEmail() throws GeneralSecurityException, MessagingException, MalformedURLException {
Properties prop = new Properties();
prop.setProperty("mail.host", HOST); //// 设置QQ邮件服务器
prop.setProperty("mail.transport.protocol", PROTOCOL); // 邮件发送协议
prop.setProperty("mail.smtp.auth", ISAUTH); // 需要验证用户名密码
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", ISENABLESSL);
prop.put("mail.smtp.ssl.socketFactory", sf);
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//传入发件人的姓名和授权码
return new PasswordAuthentication(USERNAME, PASSWORD);
}
});
session.setDebug(ISSETDEBUG);
Transport transport = session.getTransport();
transport.connect(HOST, USERNAME, PASSWORD);
MimeMessage mimeMessage = mimeEmail(session);
//5、发送邮件
transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
//6、关闭连接
transport.close();
return 1;
}
private static MimeMessage mimeEmail(Session session) throws MessagingException, MalformedURLException {
//消息的固定信息
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setFrom(new InternetAddress(FROM));
mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(TO));
mimeMessage.setSubject("这是带有图文和附件的邮件");
//邮件内容
//准备图片数据
MimeBodyPart image = new MimeBodyPart();
// DataHandler handler = new DataHandler(new FileDataSource("/Volumes/Mac-Program/Dev/Mac/mail/test/wxxcx.jpg"));
DataHandler handler = new DataHandler(new URL("https://www.xubingtao.cn/wp-content/uploads/2020/06/wxxcx.jpg"));
image.setDataHandler(handler);
//设置图片id
image.setContentID("test.jpg");
//准备文本
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是我的小程序二维码,微信扫码或搜索xubingtao可在小程序上看我的网站<br><img src='cid:test.jpg'>","text/html;charset=utf-8");
//附件
MimeBodyPart appendix = new MimeBodyPart();
appendix.setDataHandler(new DataHandler(new FileDataSource("/Volumes/Mac-Program/Dev/Mac/mail/test/test.txt")));
appendix.setFileName("test.txt");
//拼装邮件正文
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(image);
mimeMultipart.addBodyPart(text);
mimeMultipart.setSubType("related");//文本和图片内嵌成功
//将拼装好的正文内容设置为主体
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(mimeMultipart);
//拼接附件
MimeMultipart allFile = new MimeMultipart();
allFile.addBodyPart(appendix);//附件
allFile.addBodyPart(contentText);//正文
allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
//放到Message消息中
mimeMessage.setContent(allFile);
mimeMessage.saveChanges();//保存修改
return mimeMessage;
}
public static void main(String[] args) throws MessagingException, GeneralSecurityException, MalformedURLException {
// sendTextEmail(SUBJECT,CONTENT,TO);
sendMIMEEmail();
}
}
展开阅读全文
上一篇: 在Mac、Windows、Linux、Docker中搭Gradle构建环境并用IDEA创建一个简单的Java项目
下一篇:长三角之旅