前言
我们知道,我们前些时间搭建的发送邮件的服务仅仅是我们整个项目的一个工具而已,是我们整个项目的一部分,那么我们如何利用好我们自己做的这个工具呢??
正文
我们首先来分析一下:
我们整个项目是集于Spring-boot来写的,前台的代码是Thymleaf,我们来看我们用到发送邮件的第一个例子,
我们在注册的,由于资金的短缺,没有办法使用验证码的操作,我想,有没有其他的方式可以解决这个问题呢?我的解决的是应用流式的注册策略,那么下面我们整个的业务流程。
我们先进入注册页面,输入用户昵称以及自己的邮箱,输入验证码,如果注册完成,会给我们注册时候的邮箱会发送一条激活的邮件,内部含有激活的链接,之后点击激活的链接完成我们的用户的激活的操作,之后,我们会返回给用户的随机密码,以便用户的登陆。
上面就是整个的操作流程,所以我们用到发邮件主要是我们注册的业务逻辑代码中。
我们看一下,我们发送邮件的命令:
[root@iZ2zea515urn0slvtwbszvZ .certs]# echo "邮件主题" |mail -s "邮件内容,这是测试邮件" zlgtop@163.com
我们发现,这样每次输入命令比较麻烦,那我们就要想办法自己设计一个可以执行的脚本,来执行的我们的命令:
首先我们编辑一个文件,内部写上我么做执行的命令:
echo $1 |mail -s $2 $3
我们看到,把一些基本的信息用参数的形式宣传给我们的命令;
注意,不要忘记,我们给我们编写的文件赋予可以执行的权限
我们测试一下:
[root@iZ2zea515urn0slvtwbszvZ shell]# ./sendMail sgdajgj dagyusdauj 1747896448@qq.com [root@iZ2zea515urn0slvtwbszvZ shell]#
好了,但这里,我们已经准备好了,我们发邮件的工具,其实,我们主要关心的是,我们如何利用Java来点用我们的shell命令
看一下我写的Java代码
这是我们业务逻辑代码的位置
package com.email; /** * 邮件的基本操作 * * @author :breakpoint/赵立刚 * @date : 2019/05/15 */ public interface EmailService { /** * 文件内容 * * @param receiveEmail * @param content * @throws Exception */ void sendEmail(String subject, String receiveEmail, String content) throws Exception; }
上面是我们的接口
package com.email.impl; import com.email.EmailService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.io.IOException; /** * @author :breakpoint/赵立刚 * @date : 2019/06/12 */ @Slf4j @Service("shellEmailService") public class ShellEmailServiceImpl implements EmailService { /** * 通过命令来进行发送邮件 echo "邮件主题" |mail -s "邮件内容,这是测试邮件" zlgtop@163.com * * @param subject * @param receiveEmail * @param content * @throws Exception */ @Override public void sendEmail(String subject, String receiveEmail, String content) throws Exception { ProcessBuilder pb = new ProcessBuilder("/developer/server/shell/sendMail",content,subject,receiveEmail); //pb.directory(new File("/developer/server/shell/")); int runningStatus = 0; String s = null; try { Process p = pb.start(); try { runningStatus = p.waitFor(); } catch (InterruptedException e) { } } catch (IOException e) { log.info(e.getMessage()); } if (runningStatus != 0) { } return; } }
这就是我们要实现的调用的shell命令,利用ProcessBuilder 来执行我们写好的shell命令,这样,我们就完成我们邮件的发送。
是不是比写Java代码发送邮件简单多了,哈哈!!!!!
我们看一下原来的发送邮件过程。。。。
package com.email.impl; import com.email.EmailService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; /** * 邮件的基本操作忘密码的基本操作 * * @author :breakpoint/赵立刚 * @date : 2019/05/15 */ @Slf4j @Service("clientEmailService") public class EmailServiceImpl implements EmailService { private static Properties p = new Properties(); static { p.setProperty("mail.smtp.host", "smtp.163.com"); p.setProperty("mail.smtp.port", "25"); p.setProperty("mail.smtp.socketFactory.port", "25"); p.setProperty("mail.smtp.auth", "true"); p.setProperty("mail.smtp.socketFactory.class", "SSL_FACTORY"); } @Override public void sendEmail(String subject, String receiveEmail, String content) throws Exception { //使用JavaMail发送邮件的5个步骤 //1、创建session Session session = Session.getInstance(p, new Authenticator() { // 设置认证账户信息 @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("zlgtop@163.com", "zhao123"); } }); //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态 session.setDebug(true); System.out.println("创建邮件"); //4、创建邮件 Message message = createSimpleMail(session, subject, receiveEmail, content); Transport.send(message); //5、发送邮件 } /** * @param session * @return * @throws Exception * @Method: createSimpleMail * @Description: 创建一封只包含文本的邮件 * @Anthor:孤傲苍狼 */ private MimeMessage createSimpleMail(Session session, String subject, String receiveEmail, String content) throws Exception { //创建邮件对象 MimeMessage message = new MimeMessage(session); //指明邮件的发件人 message.setFrom(new InternetAddress("zlgtop@163.com")); //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发 message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiveEmail)); //邮件的标题 message.setSubject(subject); //邮件的文本内容 message.setContent(content, "text/html;charset=UTF-8"); //返回创建好的邮件对象 return message; } }
复杂不说,而且易出错。。。。。