参考
Java 基于JavaMail实现向QQ邮箱发送邮件
java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger for JUnit test case for Java mail
写在前面
现在很多 Web 项目都集成了发送邮件给用户,以便提醒用户一些信息的功能,或者发送验证码给邮箱,来实现注册功能。那么这样的功能要如何实现呢,其实非常简单。
开启管理员邮箱的 SMTP 功能
拿 QQ 邮箱举例,首先管理员(也就是公司,网站服务端)需要开启一个自己的邮箱中的 SMTP 服务。在计算机网络中,SMTP 服务就是用于发送邮件的。
在 QQ 邮箱,设置-账户中,开启 SMTP 功能。
开启后,QQ 会提供给你一个授权码,相当于一个 API 的 KEY,会在接下来的程序中使用到。
主要代码
具体的代码如下,但是特别注意,不同的邮箱具体的代码会有些许的不同,比如 QQ 邮箱必须提供 SSL 加密操作,jar 使用 maven 管理
<!-- 发送邮件依赖的 jar 包-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.6</version>
</dependency>
<!-- MailSSLSocketFactory 加密的 jar 包 -->
<!-- 注意这里的版本是 1.5.3 如果是低版本,比如我之前用的 1.4.4 ,那么下面的核心代码中有类不能使用 -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.3</version>
</dependency>
package com.www.utils;
import com.sun.mail.util.MailSSLSocketFactory;
import org.junit.Test;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;
public class MailUtil {
public void sendMail() throws GeneralSecurityException, MessagingException {
Properties props = new Properties();
// 开启debug调试
props.setProperty("mail.debug", "true");
// 发送服务器需要身份验证
props.setProperty("mail.smtp.auth", "true");
// 设置邮件服务器主机名
props.setProperty("mail.host", "smtp.qq.com");
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", "smtp");
// ssl 加密
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);
Session session = Session.getInstance(props);
Message msg = new MimeMessage(session);
msg.setSubject("标题");
StringBuilder builder = new StringBuilder();
builder.append("内容");
builder.append("\n内容");
msg.setText(builder.toString());
msg.setFrom(new InternetAddress("发送者邮箱"));
Transport transport = session.getTransport();
transport.connect("smtp.qq.com", "发送者邮箱", "授权码");
transport.sendMessage(msg, new Address[] { new InternetAddress("接收者邮箱") });
transport.close();
}
}
效果
存在的问题
不知道为什么原因,我发送的信息都被腾讯当作垃圾邮件存放在垃圾箱中了。