准备
01
前言
在日常开发中,有时会遇到向用户发送邮件的场景,例如发送注册验证码(现在基本都是发手机验证码了)、邀请链接,有时也会遇到发送带附件的邮件等业务场景。本案例以Java发送邮件为例对这些功能做一整理,希望能够对大家有所帮助。
1.代码程序发送邮件原理
首先我们先了解一下用程序实现发送邮件的原理:当我们试图用代码程序发送邮件时,我们的程序就相当的于一个邮件客户端,也就是说这个程序可以帮我们写、发邮件,那么这个客户端要发送邮件必然需要发送者的邮箱地址、密码,以及收件者的邮箱地址,为了安全起见,一般邮箱不会直接使用发送者的密码,而是使用一个授权码代替密码。
2.配置qq邮箱客户端
要实现客户端发送邮件首先需要开启IMAP/SMTP服务,只有开启这个服务,才能使得我们的邮箱具有使用客户端发送邮件的功能。在QQ邮箱中,需要在设置->帐户中开启IMAP/SMTP服务,如图1-1所示。
通过这样配置就可以获取到授权码了。
开发
1.引入maven依赖
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.6</version>
</dependency>
2.发邮件代码
public static void sendSimpleMessage(String receiveMail,String message) throws Exception{
//跟smtp服务器建立一个连接
Properties p = new Properties();
// 开启debug调试,以便在控制台查看MAIL
p.setProperty("mail.debug", "true");
p.setProperty("mail.host", "smtp.qq.com");//指定邮件服务器,默认端口 25
p.setProperty("mail.smtp.auth", "true");//要采用指定用户名密码的方式去认证
// 发送邮件协议名称
p.setProperty("mail.transport.protocol", "smtp");
// 开启SSL加密,否则会失败
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
p.put("mail.smtp.ssl.enable", "true");
p.put("mail.smtp.ssl.socketFactory", sf);
// 创建session
Session session = Session.getInstance(p);
// 通过session得到transport对象
Transport ts = session.getTransport();
// 连接邮件服务器:邮箱类型,帐号,授权码代替密码(更安全)
// 后面的字符是授权码,不能用qq密码
ts.connect("smtp.qq.com", "469757429@qq.com", "此处填写授权码");
//声明一个Message对象(代表一封邮件),从session中创建
MimeMessage msg = new MimeMessage(session);
//邮件信息封装
//1发件人
msg.setFrom( new InternetAddress("469757429@qq.com") );
//2收件人
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(receiveMail) );
//3邮件内容:主题、内容
msg.setSubject("您好!测试邮件已发送至您的邮箱,请留意查收!");
//添加附件部分
//邮件内容部分1---文本内容
MimeBodyPart body0 = new MimeBodyPart(); //邮件中的文字部分
body0.setContent("<p>" + message + "</p><p>感谢您对海博工作室的支持!</p>","text/html;charset=utf-8");
//把上面的2部分组装在一起,设置到msg中
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(body0);
msg.setContent(mm);
// 发送邮件
ts.sendMessage(msg,msg.getAllRecipients());
ts.close();
}
3.编写测试类并运行
@Test
public void testSendMessage() {
try{
MailUtil.sendSimpleMessage("2370775541@qq.com","测试发邮件。");
}catch (Exception e){
e.printStackTrace();
}
}
测试结果: