美文网首页
使用JavaMail实现发送模板邮件以及保存到发件箱

使用JavaMail实现发送模板邮件以及保存到发件箱

作者: 窗边冷月光 | 来源:发表于2017-08-17 20:29 被阅读0次

    需要用到的jar包
    1.freemarker-2.3.19.jar
    2.javax.mail.jar
    3.javax.activation.jar

    本次测试邮箱是腾讯企业邮箱,其他未经测试。
    做这个功能是因为我女朋友每个月都需要手动去发几十个人的考勤、考核邮件,实在是太过重复的做一件很乏味的事情,所以才有了这个程序,不过,界面是使用的控制台,简单一点。

    核心代码展示

    /**
         * 发送邮件
         * @author hezhao
         * @Time   2017年3月13日 上午11:25:15
         */
        public void send() {
            System.out.println("正在发送邮件至:::["+to+"]  ...");
            
            // 设置邮件服务器
            Properties prop = System.getProperties();
            prop.put("mail.smtp.host", stmpmailServer);
            prop.put("mail.smtp.auth", "true");
            prop.put("mail.transport.protocol", this.send);
            prop.put("mail.smtp.socketFactory.class",
                    "javax.net.ssl.SSLSocketFactory");
            prop.put("mail.smtp.socketFactory.port", this.smtpport);
            prop.put("mail.smtp.socketFactory.fallback", "false");
    
            // 使用SSL,企业邮箱必需!
            // 开启安全协议
            MailSSLSocketFactory sf = null;
            try {
                sf = new MailSSLSocketFactory();
                sf.setTrustAllHosts(true);
            } catch (GeneralSecurityException e1) {
                e1.printStackTrace();
            }
            prop.put("mail.smtp.starttls.enable", "true");
            prop.put("mail.smtp.ssl.socketFactory", sf);
    
            // 获取Session对象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                // 此访求返回用户和密码的对象
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    PasswordAuthentication pa = new PasswordAuthentication(username,
                            password);
                    return pa;
                }
            });
            // 设置session的调试模式,发布时取消
            session.setDebug(true);
    
            try {
                // 封装Message对象
                Message message = new MimeMessage(session);
                // message.setFrom(new InternetAddress(from,from)); //设置发件人
    
                // 设置自定义发件人昵称
                String nick_from = "";
                try {
                    nick_from = javax.mail.internet.MimeUtility.encodeText(this.nickname_from);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                message.setFrom(new InternetAddress(nick_from + " <" + from + ">"));
    
                // 设置自定义收件人昵称
                String nick_to = "";
                try {
                    nick_to = javax.mail.internet.MimeUtility.encodeText(this.nickname_to);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(nick_to + " <" + to + ">"));// 设置收件人
                message.setSubject(mailSubject);// 设置主题
                message.setContent(mailContent, "text/html;charset=utf8");// 设置内容(设置字符集处理乱码问题)
                message.setSentDate(new Date());// 设置日期
    
                // 发送
                Transport.send(message);
                System.out.println("发送成功...");
    
                //保存邮件到发件箱
                saveEmailToSentMailFolder(message);
                
                if(mailSubject.contains("考勤")){
                    FileLog.writeLog(this.nickname_to + " <" + to + ">发送成功");
                }else{
                    FileLog.writeLog(this.nickname_to + " <" + to + ">发送成功");
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("发送邮件异常...");
                
                if(mailSubject.contains("考勤")){
                    FileLog.writeLog(this.nickname_to + " <" + to + ">发送失败");
                }else{
                    FileLog.writeLog(this.nickname_to + " <" + to + ">发送失败");
                }
            }
        }
    

    保存至发件箱

    /**
         * 获取用户的发件箱文件夹
         * 
         * @param message
         *            信息
         * @param store
         *            存储
         * @return
         * @throws IOException
         * @throws MessagingException
         */
        private Folder getSentMailFolder(Message message, Store store)
                throws IOException, MessagingException {
            // 准备连接服务器的会话信息
            Properties props = new Properties();
            props.setProperty("mail.store.protocol", get);
            props.setProperty("mail.imap.host", imapmailServer);
            props.setProperty("mail.imap.port", "143");
    
            /** QQ邮箱需要建立ssl连接 */
            props.setProperty("mail.imap.socketFactory.class",
                    "javax.net.ssl.SSLSocketFactory");
            props.setProperty("mail.imap.socketFactory.fallback", "false");
            props.setProperty("mail.imap.starttls.enable", "true");
            props.setProperty("mail.imap.socketFactory.port", imapport);
    
            // 创建Session实例对象
            Session session = Session.getInstance(props);
            URLName urln = new URLName(get, imapmailServer, 143, null,
                    username, password);
            // 创建IMAP协议的Store对象
            store = session.getStore(urln);
            store.connect();
    
            // 获得发件箱
            Folder folder = store.getFolder("Sent Messages");
            // 以读写模式打开发件箱
            folder.open(Folder.READ_WRITE);
    
            return folder;
        }
    
        /**
         * 保存邮件到发件箱
         * 
         * @param message
         *            邮件信息
         */
        private void saveEmailToSentMailFolder(Message message) {
    
            Store store = null;
            Folder sentFolder = null;
            try {
                sentFolder = getSentMailFolder(message, store);
                message.setFlag(Flag.SEEN, true); // 设置已读标志
                sentFolder.appendMessages(new Message[] { message });
                
                System.out.println("已保存到发件箱...");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
    
                // 判断发件文件夹是否打开如果打开则将其关闭
                if (sentFolder != null && sentFolder.isOpen()) {
                    try {
                        sentFolder.close(true);
                    } catch (MessagingException e) {
                        e.printStackTrace();
                    }
                }
                // 判断邮箱存储是否打开如果打开则将其关闭
                if (store != null && store.isConnected()) {
                    try {
                        store.close();
                    } catch (MessagingException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    

    获取模板内容

       /**
         * 得到模板内容
         * @author hezhao
         * @Time   2017年3月13日 下午1:01:08
         * @param fileName
         * @param map
         * @return
         */
        public String getMailText(String fileName,Map<String,Object> map){
            String htmlText = null;
            try {
                Template template = config.getTemplate(fileName);
                htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TemplateException e) {
                e.printStackTrace();
            }
            return htmlText;
        }
    
    

    替换模板内容

    FreemarkerUtil freemarkerUtil = null;
    try {
         freemarkerUtil = (FreemarkerUtil) context.getBean("freemarkerUtil");
    } catch (Exception e) {
        System.out.println("出现异常!!!");
        e.printStackTrace();
    }           
    String mailContent = freemarkerUtil.getMailText(fileName, map);
    
    

    HTML模板(这个还是景洲帮我实现的)

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8" />
        </head>
        <style>
            table{border-collapse:collapse; text-align: center;font-size:12px;}
            .yellow{background: #FFFF00;}
            .blod{font-weight: bold;}
        </style>
        <body>
        <table width="1160"  border="1">
          <tr>
            <td colspan="11" align="center" style="font-size: 22px;">${title}</td>
          </tr>
          <tr>
            <td rowspan="2" class="yellow">序号</td>
            <td rowspan="2" class="yellow">部门</td>
            <td rowspan="2" class="yellow">姓名</td>
            <td rowspan="2" class="yellow">入职时间</td>
            <td colspan="5" class="blod" style="font-size: 14px;">考勤结果汇总</td>
            <td> </td>
            <td rowspan="2" >备注</td>
          </tr>
          <tr>
            <td>正常出勤</td>
            <td>请假小时</td>
            <td>迟到分钟</td>
            <td>迟到扣款</td>
            <td>旷工天数</td>
            <td>休年假天数</td>
          </tr>
          <tr>
            <td>${no}</td>
            <td>${dept}</td>
            <td>${name}</td>
            <td>${intotime}</td>
            <td class="yellow blod">${workday}</td>
            <td class="blod">${outhour}</td>
            <td class="blod">${deletemin}</td>
            <td class="blod">${deletemoney}</td>
            <td class="blod">${kg}</td>
            <td class="blod">${year}</td>
            <td>${remark}</td>
          </tr>
        </table>
        
        <div>
            <br />
        </div>
        
        <hr style="width: 210px; height: 1px;" color="#b5c4df" size="1" align="left">
        
        <div style="font-size: 14px;font-family: 'lucida Grande', Verdana;">
            <span>${bottom}</span>
        </div>
            
        </body>
    </html>
    

    相关文章

      网友评论

          本文标题:使用JavaMail实现发送模板邮件以及保存到发件箱

          本文链接:https://www.haomeiwen.com/subject/ogbnrxtx.html