zoukankan      html  css  js  c++  java
  • Java +Freemarker实现发送邮件

    jar

           <!--Email相关开始-->
             <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-mail</artifactId>
            </dependency>
            <!--Email相关结束-->
    

    Mail邮件对象

    public class Mail implements Serializable {
        private static final long serialVersionUID = 1L;
        //接收方邮件
        private String email;
        //主题
        private String subject;
        //模板
        private String template;
        // 自定义参数
        private Map<String, Object> params;
        }
    

    实现

    @Component
    public class MailSendService {
        Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Autowired
        private JavaMailSender javaMailSender;
    
        @Autowired
        private FreeMarkerConfigurer freeMarkerConfigurer;
    
       //发件人
        @Value("${spring.mail.username}")
        private String fromMail;
       //主题名称
        //@Value("${mail.subjectName}")
        //private String subjectName;
        /**
         * 根据模板名 获取邮件内容
         */
       private String getMailTextByTemplateName(String templateName, Map<String, Object> params) throws IOException, TemplateException {
            try {
                String mailText = "";
                //通过指定模板名获取FreeMarker模板实例
                Template template = freeMarkerConfigurer.getConfiguration().getTemplate(templateName);
                mailText = FreeMarkerTemplateUtils.processTemplateIntoString(template, params);
                return mailText;
            }catch (TemplateNotFoundException e) {
            //若找不到指定模板则使用默认模板
                    templateName="busi_situation.ftl";
                    Template template = freeMarkerConfigurer.getConfiguration().getTemplate(templateName);
                    return FreeMarkerTemplateUtils.processTemplateIntoString(template, params);
            }
        }
        public Result sendWithHTMLTemplate(Mail mail) {
            try {
                String email = mail.getEmail();
                if (StringUtil.isBlank(email)) {
                    return ResultUtil.error("邮箱email不能为空!");
                }
                if (!email.matches("[\w\.\-]+@([\w\-]+\.)+[\w\-]+")) {
                    return ResultUtil.error("邮箱email格式不正确!");
                }
                //发件人昵称
                String nick = MimeUtility.encodeText(fromMail);
                //发件人
                InternetAddress from = new InternetAddress(nick + "<" + fromMail + ">");
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
                //收件人
                mimeMessageHelper.setTo(email);
                mimeMessageHelper.setFrom(from);
                //图片
                String fileUrl = this.getClass().getClassLoader().getResource("public/static/img/mail/logo.png").getPath();
                FileSystemResource img1 = new FileSystemResource(new File(fileUrl));
                mimeMessageHelper.addInline("logo1", img1);
                FileSystemResource img2 = new FileSystemResource(new File(fileUrl));
                mimeMessageHelper.addInline("logo2", img2);
                
               //附件
       	   String filePath= this.getClass().getClassLoader().getResource("public/static/img/mail/text.txt").getPath();
          	   FileSystemResource file=new FileSystemResource(new File(filePath));
               String fileName=filePath.substring(filePath.lastIndexOf(File.separator));
          	   //添加多个附件可以使用多条
         	   mimeMessageHelper.addAttachment(fileName,file);
    
                Map<String, Object> params = mail.getParams();
                mail.setParams(params);
                mimeMessageHelper.setSubject(subjectName);
                // 使用模板生成html邮件内容
                String result = getMailTextByTemplateName(mail.getTemplate(), mail.getParams());
                mimeMessageHelper.setText(result, true);
                javaMailSender.send(mimeMessage);
                return ResultUtil.success("邮件发送成功");
            } catch (Exception e) {
                logger.error("发送邮件失败" + e.getMessage());
                return ResultUtil.error("发送邮件时发生异常:" + e.getMessage());
            }
        }
    
    }
    

    邮件服务器SSL安全证书认证

    public class MailSocketFactory extends SSLSocketFactory {
    
        private SSLSocketFactory factory;
    
        public MailSocketFactory() {
            try {
                // 获取一个SSLContext实例
                SSLContext sslcontext = SSLContext.getInstance("TLS");
                sslcontext.init(null, new TrustManager[]{new MailTrustManager()}, null);
                //从上述SSLContext对象中得到SSLSocketFactory对象
                factory = sslcontext.getSocketFactory();
            } catch (Exception ex) {
                // ignore
            }
        }
    
        public static SocketFactory getDefault() {
            return new MailSocketFactory();
        }
    
        @Override
        public Socket createSocket() throws IOException {
            return factory.createSocket();
        }
    
        @Override
        public Socket createSocket(Socket socket, String s, int i, boolean flag) throws IOException {
            return factory.createSocket(socket, s, i, flag);
        }
    
        @Override
        public Socket createSocket(InetAddress inaddr, int i, InetAddress inaddr1, int j) throws IOException {
            return factory.createSocket(inaddr, i, inaddr1, j);
        }
    
        @Override
        public Socket createSocket(InetAddress inaddr, int i) throws IOException {
            return factory.createSocket(inaddr, i);
        }
    
        @Override
        public Socket createSocket(String s, int i, InetAddress inaddr, int j) throws IOException {
            return factory.createSocket(s, i, inaddr, j);
        }
    
        @Override
        public Socket createSocket(String s, int i) throws IOException {
            return factory.createSocket(s, i);
        }
    
        @Override
        public String[] getDefaultCipherSuites() {
            return factory.getDefaultCipherSuites();
        }
    
        @Override
        public String[] getSupportedCipherSuites() {
            return factory.getSupportedCipherSuites();
        }
    }
    

    证书信任管理器

    public class MailTrustManager implements X509TrustManager {
        @Override
        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    
        }
        @Override
        public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    
        }
        //返回受信任的X509证书数组。
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    }
    
    

    配置文件

    spring.mail.default-encoding=UTF-8
    spring.mail.host=mail.x'x'x.x'x'x.xxx
    spring.mail.username=x'x'xxxxxxx
    spring.mail.password=x'x'xxxx
    # 协议
    spring.mail.protocol=smtp
    spring.mail.port=x'x'x
    spring.mail.properties.mail.smtp.auth=truexxx
    spring.mail.properties.mail.smtp.starttls.enable=false
    spring.mail.properties.mail.smtp.starttls.required=false
    spring.mail.properties.mail.smtp.socketFactory.port=x'x'x
    ## SSL认证工厂
    spring.mail.properties.mail.smtp.socketFactory.class=com.xxx.msg.impl.MailSocketFactory
    spring.mail.properties.mail.smtp.socketFactory.fallback=false
    

    freemarrker模板

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
        <title>截至邮件发送时间</title>
        <meta http-equiv="keywords" content="data">
        <meta http-equiv="description" content="data">
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    </head>
    
    <body >
    <div class="content">
        <div class="main">
            <div class="status">
                <div class="status-top">
                    <div class="logo flex-align"> <img src="cid:logo1" alt="" width="35" height="35"><span>${data.name}</span></div>
                
                <div class="status-content">
                    <div class="status-content-top flex-align flex-justify-center">
                        <h2>xxx</h2>
                        <span>
                            <i></i>
                            <i></i>
                            <i></i>
                        </span>
                    </div>
                    <div class="status-content-c flex-r flex-jusify-space-bettween">
                        <div class="normal flex-c flex-align flex-justify-center">
                            <p>${data.sum}</p>
                            <span>xxx</span>
                        </div>
                        <div class="success flex-c flex-align flex-justify-center">
                            <p>${data.sum}</p>
                            <span>xxx</span>
                        </div>
                    </div>
                </div>
            </div>
            <div class="dataDec">
                <div>
                    <h4 class="flex-align">xxx</h4>
                    <table>
                        <thead>
                        <tr>
                            <th width="180"  align="left">名称</th>
                        </tr>
                        </thead>
                        <tbody>
                        <#list data as item>
                            <tr>
                                <#list item?keys as itemKey>
                                    <#if itemKey="name" >
                                        <td align="left">${item[itemKey]}</td>
                                    </#if> 
                                </#list>
                            </tr>
                        </#list>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
    </body>
    </html>
    
  • 相关阅读:
    小程序如何实现rem
    Centos7通过yum跟源码编译安装Nginx
    VMware下的Centos7实践Kvm虚拟化(通俗易懂)
    XAI/MLI 可解释机器学习系列1- 开源&paper汇总
    CTR学习笔记&代码实现1-深度学习的前奏LR->FFM
    tensorflow feature_column踩坑合集
    第四篇-用Flutter手撸一个抖音国内版,看看有多炫
    第三篇-用Flutter手撸一个抖音国内版,看看有多炫
    第二篇-用Flutter手撸一个抖音国内版,看看有多炫
    使用Flutter开发的抖音国际版
  • 原文地址:https://www.cnblogs.com/xiaoyinger/p/13177116.html
Copyright © 2011-2022 走看看