如何利用模板发送邮件
目前web应用很多时候都需要像用户发送邮件,尤其是在我们注册的时候,其实这些邮件很多时候内容都是类似的,仅仅是一些有户名等不同,那么我们是否可以利用一个模板呢,模板里面有一些占位符,当我们要发送邮件的时候,仅仅把这些占位符做一替换就行了呢?答案肯定是可以的,请看下面的例子程序:
1. 邮件模板mailTemplate.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | <?xml version= "1.0" encoding= "UTF-8" ?> <email> <ProjectMail> <subject id= "ProjectSubject" > <![CDATA[Hello%toUsername%]]></subject> <content id= "ProjectMailBody" > <![CDATA[<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <META http-equiv=Content-Type content= "text/html; charset=UTF-8" > <META content= "MSHTML 6.00.6000.17063" name=GENERATOR> <STYLE> TABLE { MARGIN-LEFT: 20px; } TD { border: 1px solid #CBCBCB; } .dataString { text-align:left; padding-left:3px; } .tableTittle{ background-color: #FF9900; } </STYLE> </HEAD> <BODY bgColor=#ffffff> <DIV> <FONT face=Arial size=2></FONT> </DIV> <DIV> <FONT face=Arial size=2> Hi %name%, </FONT> </DIV> <br> <DIV> <FONT face=Arial size=2> 欢迎注册 </FONT> </DIV> <br> <DIV> <FONT face=Arial size=2> 该邮件是系统自动发出,请不要直接回复,谢谢 </FONT> </DIV> <br> <table width= "800" border= "1" cellspacing= "0" cellpadding= "0" > <tr class = "tableTittle" > <th width= "25%" > <font size= "2" face= "Arial" class = "dataString" > <p align= "center" > Name </p> </font> </th> <th width= "25%" > <font size= "2" face= "Arial" class = "dataString" > <p align= "center" > Date and time </p> </font> </th> </tr> <#listItems></#listItems> </table> <br> <DIV> <FONT face=Arial size=2></FONT> </DIV> <DIV> <FONT face=Arial size=2> Kind regards, </FONT> </DIV> <DIV> <FONT face=Arial size=2> Bridge </FONT> </DIV> ]]> </content> </ProjectMail> </email> |
2. Java代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 | @Service( "mailService" ) public class MailServiceImpl implements MailService { private static final Logger LOG = LoggerFactory.getLogger(MailServiceImpl. class ); private static final String DO_INVOICE_ITMES = "<#listItems></#listItems>" ; private static final String NAME = "%name%" ; @Override public void sendMail() { List<String> mailCCList = new ArrayList<String>(); String attachmentPath = null; Map<String, String> mail = buildMail(receiverName); String emailContent = mail.get( "mailContent" ); String subject = mail.get( "emailSubject" ); toSendMail(receiverMailAddress, mailCCList, emailContent, subject, attachmentPath, attachmentName); } private void toSendMail(String toAddress, List<String> mailCCList, String emailContent, String subject, String attachmentPath, String attachmentName) { Properties props = new Properties(); // Set the attribute of mail server props.put( "mail.smtp.host" , MAIL_SERVER_HOST)); // Need to be authorized, such ability through validation (must have this one) props.put( "mail.smtp.auth" , "true" ); // Build a session with props objects Session session = Session.getDefaultInstance(props); // Using the session as parameters define the message object MimeMessage message = new MimeMessage(session); Transport transport = null; try { // Load the sender's address message.setFrom( new InternetAddress(MAIL_ADDRESS); // Load the recipient address message.addRecipient(Message.RecipientType.TO, new InternetAddress(toAddress)); if (StringUtil.isNotEmpty(mailCCList)) { InternetAddress[] to_mail = new InternetAddress[mailCCList.size()]; for (int i = 0; i < mailCCList.size(); i++) { to_mail[i] = new InternetAddress(mailCCList.get(i)); } message.addRecipients(Message.RecipientType.CC, to_mail); } // Load the subject message.setSubject(subject); // Add mail each part to the multipart, including the text content // and accessories MimeMultipart multipart = new MimeMultipart(); // Set the HTML content of the message BodyPart contentPart = new MimeBodyPart(); // To set the content and format/encoding of BodyPart contentPart.setContent(emailContent, "text/html;charset=UTF-8" ); multipart.setSubType( "related" ); multipart.addBodyPart(contentPart); // Add attachment if (!StringUtil.isNullOrEmpty(attachmentName)) { contentPart = new MimeBodyPart(); DataSource source = new FileDataSource(attachmentPath); // Add attachment's content contentPart.setDataHandler( new DataHandler(source)); // Add attachment's title contentPart.setFileName(attachmentName); multipart.addBodyPart(contentPart); } // Add multipart object to the message message.setContent(multipart); // Save the mail message.saveChanges(); transport = session.getTransport( "smtp" ); // Connect the mail server transport.connect(MAIL_SERVER_HOST, MAIL_SERVER_USERNAME, MAIL_SERVER_PASSWORD); // Send mail transport.sendMessage(message, message.getAllRecipients()); LOG.info( "Send mail to: " + toAddress + ",success" ); } catch (AddressException e) { LOG.error(e); } catch (NoSuchProviderException e) { LOG.error(e); } catch (MessagingException e) { LOG.error(e); } finally { try { if (null != transport) { transport.close(); } } catch (MessagingException e) { LOG.error(e); } } } private Map<String, String> buildMail(String receiverName) { StringBuilder itemsBuilder = new StringBuilder(); Element emailTemplateRoot = getXMLRootElement( "mailTemplate.xml" ); String emailSubject = emailTemplateRoot.selectSingleNode( "//*[@id='ProjectSubject']" ). getText ().replace(TOUSERNAME, receiverName.toUpperCase()); StringBuilder content = new StringBuilder(); String mailTemplateContent = emailTemplateRoot.selectSingleNode( "//*[@id='ProjectMailBody']" ). getText (); mailTemplateContent = mailTemplateContent.replace(NAME, receiverName).replace(DO_INVOICE_ITMES, itemsBuilder.toString()); content.append(mailTemplateContent); Map<String, String> mail = new HashMap<String, String>(); mail.put( "emailSubject" , emailSubject); mail.put( "mailContent" , content.toString()); return mail; } private String getColumnDataString(String data) { String columnData = null; columnData = "<td class='dataString'><font size='2' face='Arial'><p align='center'>" + data + "</p></font></td>" + "n" ; return columnData; } private Element getXMLRootElement(String emailFile) { SAXReader reader = new SAXReader(); InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(emailFile); Document document = null; try { document = reader.read(inputStream); } catch (DocumentException e) { LOG.error( "Get XML Root Element fail, DocumentException" , e); } return document.getRootElement(); } } |
2015.05.25补记:
写这篇文章时,由于是刚写博客,所以写的各种乱,大家可以参考这篇文章:http://blog.sina.com.cn/s/blog_86e49b8f01018zet.html,其实老夫当年写这篇文章时,也是参考了这篇文章,当时没有加上参考链接,是在惭愧
2018.09.10补记:
有感于上面的代码写的实在是太烂,稍微优化了一下,供需要的小伙伴参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | package cn.bridgeli.demo; import org.apache.commons.lang3.StringUtils; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.NoSuchProviderException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.util. Date ; import java.util.List; import java.util.Properties; public class SendMailUtil { private SendMailUtil() { } /** * smtp 服务器地址 */ private static String host = "" ; /** * 端口 */ private static String port = "465" ; /** * 用户名 */ private static String user = "" ; /** * 密码 */ private static String pwd = "" ; /** * 发件人邮件地址 */ private static String from = "" ; /** * 发送邮件 * * @param receiveUsers 收件人邮箱地址 * @param subject 邮件主题 * @param text 邮件内容 * @param affix 邮件附件地址 * @param affixName 邮件附件名 */ public static void send(List<String> receiveUsers, String subject, String text, String affix, String affixName) { Properties props = new Properties(); // 设置发送邮件的邮件服务器的属性 props.put( "mail.smtp.host" , host); props.put( "mail.transport.protocol" , "smtp" ); // 需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条) props.put( "mail.smtp.auth" , "true" ); //使用ssl采用465端口发送邮件 props.put( "mail.smtp.socketFactory.class" , "javax.net.ssl.SSLSocketFactory" ); props.put( "mail.smtp.socketFactory.fallback" , "false" ); props.put( "mail.smtp.port" , port); props.put( "mail.smtp.socketFactory.port" , port); //用刚刚设置好的props对象构建一个session Session session = Session.getDefaultInstance(props); // 有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使用(你可以在控制台(console)上看到发送邮件的过程) session.setDebug(true); // 用session为参数定义消息对象 MimeMessage message = new MimeMessage(session); Transport transport = null; try { message.setFrom( new InternetAddress(from)); // 加载收件人地址 int size = receiveUsers.size(); InternetAddress[] address = new InternetAddress[size]; for (int i = 0; i < size; i++) { address[i] = new InternetAddress(receiveUsers.get(i)); } // to 为收件人, cc 为抄送, bcc 为密送 message.addRecipients(Message.RecipientType.TO, address); message.setSubject(subject); // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件 Multipart multipart = new MimeMultipart(); // 设置邮件的文本内容 BodyPart contentPart = new MimeBodyPart(); contentPart.setText(text); multipart.addBodyPart(contentPart); // 添加附件 if (StringUtils.isNotBlank(affix) && StringUtils.isNotBlank(affixName)) { BodyPart messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(affix); // 添加附件的内容 messageBodyPart.setDataHandler( new DataHandler(source)); // 添加附件的标题,这里很重要,通过下面的 Base64 编码的转换可以保证你的中文附件标题名在发送时不会变成乱码 sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder(); messageBodyPart.setFileName( "=?GBK?B?" + enc.encode(affixName.getBytes()) + "?=" ); multipart.addBodyPart(messageBodyPart); } // 将multipart对象放到message中 message.setContent(multipart); // 设置发送的日期 message.setSentDate( new Date ()); // 保存邮件 message.saveChanges(); // 发送邮件 transport = session.getTransport( "smtp" ); // 连接服务器的邮箱 transport.connect(host, user, pwd); // 把邮件发送出去 transport.sendMessage(message, message.getAllRecipients()); } catch (NoSuchProviderException e) { e.printStackTrace(); } catch (AddressException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } finally { if (null != transport) { try { transport.close(); } catch (MessagingException e) { e.printStackTrace(); } } } } } |
需要引入的依赖:
1 2 3 4 5 | <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> |
全文完,如果本文对您有所帮助,请花 1 秒钟帮忙点击一下广告,谢谢。
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/22
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/22
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: Java
近期评论