1.引入依赖html
<dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-tools</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.5.5</version> </dependency> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.5.5</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.5.RELEASE</version> </dependency>
2.在spring的xml文件中初始化VelocityEngineFactoryBeanjava
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean"> <property name="velocityProperties"> <props> <prop key="resource.loader">class</prop> <prop key="class.resource.loader.class"> org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader </prop> <prop key="velocimacro.library"></prop> </props> </property> </bean>
3.建立邮件模板,邮件模板为一个vm文件spring
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>工单系统邮件模板</title> <style> *{ margin:0; padding: 0; line-height: 30px; } table{ width: 100%; border-collapse: collapse; border-spacing: 0; padding: 20px; } th,td{ padding: 10px; border:1px solid #e8e8e8; } .title{ color: orange; font-size:20px; } .blue{ color: blue; } .gray-bgc{ background-color: #ccc; color: #000; } .cent-tab{} .cent-tab td{ text-align: center; } </style> </head> <body> <table> <tr> <th class="title"> 邮件标题:客服工单系统-抄送通知 </th> </tr> <tr> <td> <strong><span class="blue"></span>您好! </strong> </td> </tr> <tr> <td> <div style="text-indent:2em;"> ${userOrg}<span class="blue">${userName}${userEmail}</span>,经过客服工单系统给您发送工单信息,请查看。本邮件为系统发送,请勿直接回复,谢谢! </div> <div> 登陆网址:<a class="blue" href="http://kfgd.hengchang6.com">http://kfgd.hengchang6.com</a> </div> <div> 登陆帐号:${loginName}(员工登陆名) </div> </td> </tr> <tr> <td> <strong>工单详情</strong> </td> </tr> <tr> <td class="gray-bgc"> <strong style="font-size:18px;">·</strong>客户信息 </td> </tr> <tr> <td> <table> <tr> <th>保单ID: </th> <td>$detail.insuranceId</td> <th>投保单号: </th> <td>${detail.insuranceNum}</td> </tr> <tr> <th>投保人: </th> <td>$detail.insureName</td> <th>投保人联系方式: </th> <td>${detail.contactMethod}</td> </tr> <tr> <th>被保险人: </th> <td>$detail.customerName</td> <th>受理日期: </th> <td>${detail.acceptDate}</td> </tr> <tr> <th>业务员姓名: </th> <td>${detail.salesmanName}</td> <th>业务员证件号: </th> <td>${detail.customerCid}</td> </tr> <tr> <th>保险公司: </th> <td>${detail.insuranceCompany}</td> <th>保单状态: </th> <td>${detail.insuranceStatus}</td> </tr> <tr> <th>保险产品名称: </th> <td>${detail.insuranceProduct}</td> <th>所属省份公司: </th> <td>${detail.managerArea}</td> </tr> <tr> <th>所属地分公司: </th> <td>${detail.managerCity}</td> <th></th> <td></td> </tr> </table> </td> </tr> <tr> <td class="gray-bgc"> <strong style="font-size:18px;">·</strong>基本信息 </td> </tr> <tr> <td> <table class="cent-tab"> <tr> <th>工单编号: </th> <td>$detail.workorderNumber</td> <th>紧急程度: </th> <td>${detail.urgencyLevel}</td> </tr> <tr> <th>坐席: </th> <td>${detail.createByEmpFlag}</td> <th>建立时间: </th> <td>${detail.applyTime}</td> </tr> <tr> <th>一级工单: </th> <td>${detail.firstLevel}</td> <th>二级工单: </th> <td>${detail.secondLevel}</td> </tr> <tr> <th>是否敏感: </th> <td>${detail.sensitiveDegree}</td> <th>是否标注: </th> <td>${detail.labelDegree}</td> </tr> <tr> <th width='100'> 问题描述: </th> <td colspan="3" style="text-indent:2em;"> ${detail.workorderRemark} </td> </tr> <tr> <th> 追加描述: </th> <td style="text-indent:2em;"> <table> #foreach($member2 in $appendLogs) <tr> <td>$member2.operatorName</td> <td>$member2.organizationName</td> <td>$member2.createTimeStr</td> <td>$member2.processRemark</td> </tr> #end </table> </td> </tr> </table> </td> </tr> <tr> <td class="gray-bgc"> <strong style="font-size:18px;">·</strong>处理记录 </td> </tr> <tr> <td> <table class="cent-tab"> <tr> <th>日期</th> <th>处理动做</th> <th>处理人</th> <th>所属组</th> <th>处理内容</th> </tr> #foreach($member in $processLogs) <tr> <td>$member.createTimeStr</td> <td>$member.processType</td> <td>$member.operatorName</td> <td>$member.organizationName</td> <td>$member.processRemark</td> </tr> #end </table> </td> </tr> </table> </body> </html>
4.根据velocityEngine来生成邮件发送的内容apache
//result为最后生成的邮件内容,也就是根据数据和模板生成的内容 //this.getVelocityEngine()为spring配置文件中配置的模板加载器 //templateName为模板的地址,为一个String //"UTF-8"为编码格式 //model为须要像模板中体检的数据,为一个Map集合 String result = VelocityEngineUtils.mergeTemplateIntoString(this.getVelocityEngine(), templateName, "UTF-8", model);
5.引入依赖api
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>2.7.14</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>2.7.14</version> </dependency>
6.初始化,给transport的属性赋值。transport.protocol=smtps 7.发送邮件服务器
// 若是须要身份认证,则建立一个密码验证器 //参数为发件人的用户名和密码 MailAuthenticator authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); // 根据邮件会话属性和密码验证器构造一个发送邮件的session Session sendMailSession = Session.getDefaultInstance(mailInfo.getProperties(), authenticator); // 根据session建立一个邮件消息 Message mailMessage = new MimeMessage(sendMailSession); // 建立邮件发送者地址 Address from = new InternetAddress(mailInfo.getFromAddress(),mailInfo.getFromNickName(),"UTF-8"); // 设置邮件消息的发送者 mailMessage.setFrom(from); mailMessage.setSentDate(new Date()); // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象 Multipart mainPart = new MimeMultipart(); // // 建立一个包含HTML内容的MimeBodyPart MimeBodyPart html = new MimeBodyPart(); // // 设置HTML内容 html.setContent(result, "text/html; charset=utf-8"); mainPart.addBodyPart(html); //to为到达地址好比某个接受邮箱 InternetAddress address = new InternetAddress(to); mailMessage.setRecipient(Message.RecipientType.TO, address); if (checkAddress(cc)) { mailMessage.setRecipient(Message.RecipientType.CC, new InternetAddress(cc)); } // 设置邮件消息的主题 mailMessage.setSubject(this.getSubject()); // 设置邮件消息发送的时间 mailMessage.setSentDate(new Date()); // 设置邮件消息的主要内容 mailMessage.setContent(mainPart); logger.debug(cc+"邮件准备完毕,开始发送--[{}]"+to,new Date()); // 发送邮件 Transport.send(mailMessage);
其中的getproperties方法session
//该方法的本质为给各类邮件发送的参数赋值 public Properties getProperties() throws GeneralSecurityException { Properties props = new Properties(); //邮件发送服务器的地址和端口 props.put("mail.smtp.host", this.mailServerHost); props.put("mail.smtp.port", this.mailServerPort); //邮件发送猪蹄确认 props.put("mail.smtp.auth", validate ? "true" : "false"); //SSL MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); props.put("mail.smtp.ssl.enable", "true"); props.put("mail.smtp.ssl.socketFactory", sf); props.put("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.transport.protocol", "smtps"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.connectiontimeout", 1000*60*2); props.put("mail.smtp.timeout", 1000*60*2); return props; }