2023年7月31日发(作者:)
java邮件发送和短信发送(⼀)最近刚完成⼀个任务-付款提醒邮件的发送,对于java邮件的发送有了更深刻的认识,的确java提供的邮件发送机制的确让邮件发送这个问题变得灵活⽽⼜简单。并且由于项⽬组其他⼈负责了短信的发送,巧的是这个邮件发送的借⼝与短信发送的借⼝都被封装到了消息发送的借⼝,我也顺便学习了⼀下短信发送的原理,呵呵,算是⼀箭双雕吧。 那先来说说邮件发送。按照按接⼝编程的习惯,当然先要定义⼀个邮件发送的接⼝,再实现其接⼝,完成邮件发送Service层的代码。这个顺序我想⼤家没什么反对意见吧。
⾸先咱们先定义⼀个消息发送接⼝,它是邮件发送与短信发送的上层接⼝。
[java]1. /**
2. * 功能: 系统消息发送服务
3. * ⽤法:
4. * @version 1.0
5. */
6. public interface MessageService {
7.
8. /**
9. * 根据消息模板表中的消息编号取得消息模板,填充,发送
10. *
11. * @param bmtCode 消息模板表中的消息编号
12. * @param params 填充模板内容的参数
13. * @param to 消息的接收⼈
14. * @throws CheckException 模板不存在,或是发送消息出现异常
15. */
16. public void sendMessage(String bmtCode,Map params, to) throws CheckException;
17.
18. }
再来定义⼀下邮件发送器接⼝,由于我这⾥是通过velocity模板发送邮件的,所以如下定义了接⼝:[java]1. /**
2. * 邮件发送器
3. * @usage
4. */
5. public interface TempletEmailSender {
6.
7.
8. /**
9. * @param from 发件⼈邮箱
10. * @param to 收件⼈邮箱
11. * @param subject 邮件主题
12. * @param templet 模板
13. * @param paramMap 模板参数信息
14. * @throws CheckException
15. */
16. public void sendEmailByTemplet(String from, String to, String subject,String templet, Map
17.
18. /**
19. * @param from 发件⼈邮箱
20. * @param to 收件⼈邮箱(多个)
21. * @param subject 邮件主题
22. * @param templet 模板
23. * @param paramMap 模板参数信息
24. * @throws CheckException
25. */
26. public void sendEmailByTemplet(String from, String[] to, String subject,String templet, Map
27.
28.
29. /**
30. * @param mail 邮件对象
31. * @param templet 模板
32. * @param paramMap 模板参数信息
33. * @throws CheckException
34. */
35. public void sendEmailByTemplet(Mail mail,String templet, Map
36.
37.
38. }
接着实现邮件发送的接⼝:
[java]1. /**
2. * 邮件发送器默认实现
3. */
4. public class TempletEmailSenderImpl implements TempletEmailSender{
5. @Autowired
6. @Qualifier("emailSenderImpl_commons")
7. private EmailSender emailSender;
8.
9. @Override
10. public void sendEmailByTemplet(String from, String to,String subject, String templet, Map
11. sendEmailByTemplet(from, new String[]{to}, subject, templet, paramMap);
12.
13. }
14.
15. @Override
16. public void sendEmailByTemplet(String from, String[] to, String subject, String templet, Map
17. // 解析模板
18. String content ;
19. try {
20. content = tance().parseVelocityTemplate(templet, paramMap);
21. } catch (Throwable t) {
22. throw new CheckException(t);
23. }
24. ail(from, to, subject, content);
25.
26. }
⼤家看到了上⾯的实现⾥注⼊了EmailSender,它也是⼀个接⼝,它的实现⾥注⼊了JavaMail提供的邮件发送接⼝。定义了两层是为了区分有模板的发送和⽆模板的发送。我们来看看它是什么样的: [java]1. /**
2. * 邮件发送器
3. * @usage
4. */
5. public interface EmailSender {
6.
7. /**
8. * 发送邮件
9. * @param from 发件⼈
10. * @param to 收件⼈
11. * @param subject 邮件主题
12. * @param mailBody 邮件内容
13. * @throws CheckException 参数校验失败或发送邮件失败时,抛出此异常
14. */
15. void sendEmail(String from, String to, String subject, String mailBody) throws CheckException;
16.
17. /**
18. * 发送邮件
19. * @param from 发件⼈
20. * @param to 多个收件⼈
21. * @param subject 邮件主题
22. * @param mailBody 邮件内容
23. * @throws CheckException 参数校验失败或发送邮件失败时,抛出此异常
24. */
25. void sendEmail(String from, String[] to, String subject, String mailBody) throws CheckException;
26.
27. /**
28. * 发送邮件
29. * @param mail 邮件
30. * @throws CheckException 参数校验失败或发送邮件失败时,抛出此异常
31. */
32. void sendEmail(Mail mail) throws CheckException;
33.
34.
35. }
接着实现这个EmailSender接⼝:
[java]1. **
2. * JAVA MAIL实现
3. */ 4. public class EmailSenderImpl implements EmailSender,InitializingBean{
5. /**
6. * Logger for this class
7. */
8. private static final Logger logger = ger();
9.
10. @Autowired
11. private ConfigService configService;
12.
13. private JavaMailSenderImpl sender; // 实际的发送实现
14.
15.
16. @Override
17. public void sendEmail(String from, String to, String subject, String mailBody) throws CheckException {
18. sendEmail(from, new String[]{to}, subject, mailBody);
19. }
20.
21.
22.
23. @Override
24. public void sendEmail(String from, String[] to, String subject, String mailBody) throws CheckException {
25. // 构造MAIL对象
26. Mail mail = new Mail();
27. m(from);
28. (to);
29. ject(subject);
30. tent(mailBody);
31. sendEmail(mail);
32.
33. }
34.
35. @Override
36. public void sendEmail(Mail mail) throws CheckException {
37. // 检查必要参数
38. if (mail == null ){
39. throw new CheckException("mail can not be null.");
40. }
41. if (y(())){
42. throw new CheckException("收件⼈不能为空");
43. }
44. MimeMessageHelper helper = null;
45. try {
46. helper = new MimeMessageHelper(MimeMessage(), true, "UTF-8");
47. 47.
48. // 发件⼈
49. if (m() != null) {
50. if (mName() == null) {
51. m(m());
52. } else {
53. m(m(), mName());
54. }
55.
56. }
57. // 收件⼈
58. (());
59.
60. // 抄送⼈
61. if (() != null) {
62. (());
63. }
64.
65. // 密送⼈
66. if (() != null) {
67. (());
68. }
69.
70. // 邮件主题
71. ject(ject());
72.
73. // 邮件内容
74. t(tent(), Format());
75.
76. // 附件
77. if (achments() != null) {
78. for ( MailAttachment attachment : achments()) {
79. achment(eName(),e());
80. }
81. }
82.
83. // 发送时间
84. tDate(new Date());
85. } catch (UnsupportedEncodingException e) {
86. ("sendEmail(Mail)", e);
87.
88. throw new CheckException(e) ;
89. } catch (MessagingException e) {
90. ("sendEmail(Mail)", e); 91.
92. throw new CheckException(e) ;
93. }
94.
95. // 发送
96. try {
97. (eMessage());
98. } catch (MailException e) {
99. ("sendEmail(Mail)", e);
100.
101. throw new CheckException(e) ;
102. }
103.
104. }
105.
106. @Override
107. public void afterPropertiesSet() throws Exception {
108. sender = new JavaMailSenderImpl();
109.
110. // configService读出参数
111. Properties pros = new Properties();
112.
113. perty("", fig(_SMTP_USER_ID));
114. perty("", fig(_SMTP_HOST_ID));
115. perty("", fig(_SMTP_PORT_ID));
116. perty("tiontimeout", fig(_SMTP_CONNECTIONTIM117. perty("t", fig(_SMTP_TIMEOUT_ID));
118. perty("", fig(_SMTP_FROM_ID));
119. perty("", fig(_SMTP_AUTH_ID));
120.
121. aMailProperties(pros);
122. sword(fig(_SMTP_PASSWORD_ID));
123.
124. }
125.
126.
127.
128. public ConfigService getConfigService() {
129. return configService;
130. }
131.
132.
133. 134. public void setConfigService(ConfigService configService) {
135. Service = configService;
136. }
O(∩_∩)O~⼤家⼜注意到了 这个接⼝实现⾥⼜注⼊了⼀个接⼝ConfigService 它是去读取邮件发送的相关配置信息,如上所⽰: // configService读出参数 Properties pros = new Properties(); perty("", fig(_SMTP_USER_ID)); perty("", fig(_SMTP_HOST_ID)); perty("", fig(_SMTP_PORT_ID)); perty("tiontimeout",fig(_SMTP_CONNECTIONTIMEOUT_ID)); perty("t", fig(_SMTP_TIMEOUT_ID)); perty("", fig(_SMTP_FROM_ID)); perty("", fig(_SMTP_AUTH_ID));
aMailProperties(pros); sword(fig(_SMTP_PASSWORD_ID));
⽽且由于涉及到参数的数据成员较多,就将他们⼀起封装到了Mail类:[java]1. /**
2. * 功能: 封装邮件对象
3. * ⽤法:
4. * @version 1.0
5. */
6. public class Mail {
7.
8. /**
9. * 发件⼈
10. */
11. private String from;
12. /**
13. * 发件⼈(显⽰)
14. */
15. private String fromName;
16. /**
17. * 收件⼈
18. */
19. private String[] to;
20. /**
21. * 抄送
22. */ 23. private String[] cc;
24. /**
25. * 秘密抄送
26. */
27. private String[] bcc;
28. /**
29. * 邮件主题
30. */
31. private String subject;
32. /**
33. * 邮件内容
34. */
35. private String content;
36. /**
37. * 附件
38. */
39. private MailAttachment[] attachments;
40.
41. /**
42. * 是否以HTML格式发送
43. */
44. boolean isHtmlFormat = true;
45.
46. //getter与setter⽅法省略
47. }
好了 整个接⼝都实现了,其实排除了你发送邮件提供给邮件发送接⼝的⼏个参数,剩下的也就是调⽤java提供的邮件发送的API和⼀些邮件发送必备的配置信息,必不是很难懂吧。⼤家肯定注意到了邮件发送接⼝的velocity模板解析⽅法: content = tance().parseVelocityTemplate(templet, paramMap); 它具体的实现如下所⽰:
[java]1. /**
2. * 功能:解析velocity模板
3. *
4. * ⽤法:
5. *
6. * @version 1.0
7. */
8.
9. public class VelocityParserUtil {
10. /**
11. * Logger for this class 11. * Logger for this class
12. */
13. private static final Logger logger = ger();
14.
15. private static VelocityParserUtil instance = new VelocityParserUtil();
16.
17. private VelocityEngine engine = null;
18.
19. private VelocityParserUtil() {
20. // init engine
21. engine = new VelocityEngine();
22. try {
23. ();
24. } catch (Exception e) {
25. ("VelocityParserUtil() - exception ignored", e); //$NON-NLS-1$
26.
27. }
28. }
29.
30. /**
31. * 返回VelocityParserUtil实例
32. * @return
33. */
34. public static VelocityParserUtil getInstance() {
35. return instance;
36. }
37.
38.
39.
40. /**
41. * 解析velocity模板
42. * @param vtl
43. * @param model
44. * @return String
45. * @throws ParseErrorException
46. * @throws MethodInvocationException
47. * @throws ResourceNotFoundException
48. * @throws IOException
49. */
50. public String parseVelocityTemplate(String vtl, Map model)
51. throws ParseErrorException, MethodInvocationException,
52. ResourceNotFoundException, IOException {
53. if (gEnabled()) {
54. ("parseVelocityTemplate(String, Map) - start"); //$NON-NLS-1$ 54. ("parseVelocityTemplate(String, Map) - start"); //$NON-NLS-1$
55. }
56.
57. VelocityContext velocityContext = new VelocityContext(model);
58. StringWriter result = new StringWriter();
59. te(velocityContext, result, null, vtl);
60.
61. String returnString = ng();
62. if (gEnabled()) {
63. ("parseVelocityTemplate(String, Map) - end"); //$NON-NLS-1$
64. }
65. return returnString;
66.
67. }
68.
69. }
我们会在其他的Service中去调⽤邮件发送的接⼝,只需要在业务层⾥构造好邮件发送的接⼝所需参数,我们的邮件就可以发送出去了。还有⼀点请⼤家注意,我这⾥主要强调的是运⽤velocity模板发送邮件,接⼝所需要的参数templat⼤家不要误解为velocity模板的⽂件名,它其实velocity⽂件的⽂件流,是⼀个已经被读⼊的字符串。⼤家可以参考⼀下测试⽤例,⼤致可以明⽩是怎么回事了。
[java]1. public class TempletEmailSenderTest extends BaseTestBaseForJUnit4{
2. @Autowired
3. @Qualifier("templetEmailSenderImpl_commons")
4. private TempletEmailSender sender;
5.
6. // @Test
7. public void sendEmailByTemplet() throws CheckException{
8. String templet = "$!{user}提醒您付款$!{amount}元";
9. Map paramMap = new HashMap();
10. ("user", "吴欣");
11. ("amount", "99.9");
12.
13. ailByTemplet("@", "@", "模板邮件", templet, paramMap);
14. }
整个邮件的发送⼤家是否明了了呢,呵呵! 后⾯我们会将这个接⼝向上抽象,为了实现我们短信发送的实现,下⼀篇敬请期待哦
2023年7月31日发(作者:)
java邮件发送和短信发送(⼀)最近刚完成⼀个任务-付款提醒邮件的发送,对于java邮件的发送有了更深刻的认识,的确java提供的邮件发送机制的确让邮件发送这个问题变得灵活⽽⼜简单。并且由于项⽬组其他⼈负责了短信的发送,巧的是这个邮件发送的借⼝与短信发送的借⼝都被封装到了消息发送的借⼝,我也顺便学习了⼀下短信发送的原理,呵呵,算是⼀箭双雕吧。 那先来说说邮件发送。按照按接⼝编程的习惯,当然先要定义⼀个邮件发送的接⼝,再实现其接⼝,完成邮件发送Service层的代码。这个顺序我想⼤家没什么反对意见吧。
⾸先咱们先定义⼀个消息发送接⼝,它是邮件发送与短信发送的上层接⼝。
[java]1. /**
2. * 功能: 系统消息发送服务
3. * ⽤法:
4. * @version 1.0
5. */
6. public interface MessageService {
7.
8. /**
9. * 根据消息模板表中的消息编号取得消息模板,填充,发送
10. *
11. * @param bmtCode 消息模板表中的消息编号
12. * @param params 填充模板内容的参数
13. * @param to 消息的接收⼈
14. * @throws CheckException 模板不存在,或是发送消息出现异常
15. */
16. public void sendMessage(String bmtCode,Map params, to) throws CheckException;
17.
18. }
再来定义⼀下邮件发送器接⼝,由于我这⾥是通过velocity模板发送邮件的,所以如下定义了接⼝:[java]1. /**
2. * 邮件发送器
3. * @usage
4. */
5. public interface TempletEmailSender {
6.
7.
8. /**
9. * @param from 发件⼈邮箱
10. * @param to 收件⼈邮箱
11. * @param subject 邮件主题
12. * @param templet 模板
13. * @param paramMap 模板参数信息
14. * @throws CheckException
15. */
16. public void sendEmailByTemplet(String from, String to, String subject,String templet, Map
17.
18. /**
19. * @param from 发件⼈邮箱
20. * @param to 收件⼈邮箱(多个)
21. * @param subject 邮件主题
22. * @param templet 模板
23. * @param paramMap 模板参数信息
24. * @throws CheckException
25. */
26. public void sendEmailByTemplet(String from, String[] to, String subject,String templet, Map
27.
28.
29. /**
30. * @param mail 邮件对象
31. * @param templet 模板
32. * @param paramMap 模板参数信息
33. * @throws CheckException
34. */
35. public void sendEmailByTemplet(Mail mail,String templet, Map
36.
37.
38. }
接着实现邮件发送的接⼝:
[java]1. /**
2. * 邮件发送器默认实现
3. */
4. public class TempletEmailSenderImpl implements TempletEmailSender{
5. @Autowired
6. @Qualifier("emailSenderImpl_commons")
7. private EmailSender emailSender;
8.
9. @Override
10. public void sendEmailByTemplet(String from, String to,String subject, String templet, Map
11. sendEmailByTemplet(from, new String[]{to}, subject, templet, paramMap);
12.
13. }
14.
15. @Override
16. public void sendEmailByTemplet(String from, String[] to, String subject, String templet, Map
17. // 解析模板
18. String content ;
19. try {
20. content = tance().parseVelocityTemplate(templet, paramMap);
21. } catch (Throwable t) {
22. throw new CheckException(t);
23. }
24. ail(from, to, subject, content);
25.
26. }
⼤家看到了上⾯的实现⾥注⼊了EmailSender,它也是⼀个接⼝,它的实现⾥注⼊了JavaMail提供的邮件发送接⼝。定义了两层是为了区分有模板的发送和⽆模板的发送。我们来看看它是什么样的: [java]1. /**
2. * 邮件发送器
3. * @usage
4. */
5. public interface EmailSender {
6.
7. /**
8. * 发送邮件
9. * @param from 发件⼈
10. * @param to 收件⼈
11. * @param subject 邮件主题
12. * @param mailBody 邮件内容
13. * @throws CheckException 参数校验失败或发送邮件失败时,抛出此异常
14. */
15. void sendEmail(String from, String to, String subject, String mailBody) throws CheckException;
16.
17. /**
18. * 发送邮件
19. * @param from 发件⼈
20. * @param to 多个收件⼈
21. * @param subject 邮件主题
22. * @param mailBody 邮件内容
23. * @throws CheckException 参数校验失败或发送邮件失败时,抛出此异常
24. */
25. void sendEmail(String from, String[] to, String subject, String mailBody) throws CheckException;
26.
27. /**
28. * 发送邮件
29. * @param mail 邮件
30. * @throws CheckException 参数校验失败或发送邮件失败时,抛出此异常
31. */
32. void sendEmail(Mail mail) throws CheckException;
33.
34.
35. }
接着实现这个EmailSender接⼝:
[java]1. **
2. * JAVA MAIL实现
3. */ 4. public class EmailSenderImpl implements EmailSender,InitializingBean{
5. /**
6. * Logger for this class
7. */
8. private static final Logger logger = ger();
9.
10. @Autowired
11. private ConfigService configService;
12.
13. private JavaMailSenderImpl sender; // 实际的发送实现
14.
15.
16. @Override
17. public void sendEmail(String from, String to, String subject, String mailBody) throws CheckException {
18. sendEmail(from, new String[]{to}, subject, mailBody);
19. }
20.
21.
22.
23. @Override
24. public void sendEmail(String from, String[] to, String subject, String mailBody) throws CheckException {
25. // 构造MAIL对象
26. Mail mail = new Mail();
27. m(from);
28. (to);
29. ject(subject);
30. tent(mailBody);
31. sendEmail(mail);
32.
33. }
34.
35. @Override
36. public void sendEmail(Mail mail) throws CheckException {
37. // 检查必要参数
38. if (mail == null ){
39. throw new CheckException("mail can not be null.");
40. }
41. if (y(())){
42. throw new CheckException("收件⼈不能为空");
43. }
44. MimeMessageHelper helper = null;
45. try {
46. helper = new MimeMessageHelper(MimeMessage(), true, "UTF-8");
47. 47.
48. // 发件⼈
49. if (m() != null) {
50. if (mName() == null) {
51. m(m());
52. } else {
53. m(m(), mName());
54. }
55.
56. }
57. // 收件⼈
58. (());
59.
60. // 抄送⼈
61. if (() != null) {
62. (());
63. }
64.
65. // 密送⼈
66. if (() != null) {
67. (());
68. }
69.
70. // 邮件主题
71. ject(ject());
72.
73. // 邮件内容
74. t(tent(), Format());
75.
76. // 附件
77. if (achments() != null) {
78. for ( MailAttachment attachment : achments()) {
79. achment(eName(),e());
80. }
81. }
82.
83. // 发送时间
84. tDate(new Date());
85. } catch (UnsupportedEncodingException e) {
86. ("sendEmail(Mail)", e);
87.
88. throw new CheckException(e) ;
89. } catch (MessagingException e) {
90. ("sendEmail(Mail)", e); 91.
92. throw new CheckException(e) ;
93. }
94.
95. // 发送
96. try {
97. (eMessage());
98. } catch (MailException e) {
99. ("sendEmail(Mail)", e);
100.
101. throw new CheckException(e) ;
102. }
103.
104. }
105.
106. @Override
107. public void afterPropertiesSet() throws Exception {
108. sender = new JavaMailSenderImpl();
109.
110. // configService读出参数
111. Properties pros = new Properties();
112.
113. perty("", fig(_SMTP_USER_ID));
114. perty("", fig(_SMTP_HOST_ID));
115. perty("", fig(_SMTP_PORT_ID));
116. perty("tiontimeout", fig(_SMTP_CONNECTIONTIM117. perty("t", fig(_SMTP_TIMEOUT_ID));
118. perty("", fig(_SMTP_FROM_ID));
119. perty("", fig(_SMTP_AUTH_ID));
120.
121. aMailProperties(pros);
122. sword(fig(_SMTP_PASSWORD_ID));
123.
124. }
125.
126.
127.
128. public ConfigService getConfigService() {
129. return configService;
130. }
131.
132.
133. 134. public void setConfigService(ConfigService configService) {
135. Service = configService;
136. }
O(∩_∩)O~⼤家⼜注意到了 这个接⼝实现⾥⼜注⼊了⼀个接⼝ConfigService 它是去读取邮件发送的相关配置信息,如上所⽰: // configService读出参数 Properties pros = new Properties(); perty("", fig(_SMTP_USER_ID)); perty("", fig(_SMTP_HOST_ID)); perty("", fig(_SMTP_PORT_ID)); perty("tiontimeout",fig(_SMTP_CONNECTIONTIMEOUT_ID)); perty("t", fig(_SMTP_TIMEOUT_ID)); perty("", fig(_SMTP_FROM_ID)); perty("", fig(_SMTP_AUTH_ID));
aMailProperties(pros); sword(fig(_SMTP_PASSWORD_ID));
⽽且由于涉及到参数的数据成员较多,就将他们⼀起封装到了Mail类:[java]1. /**
2. * 功能: 封装邮件对象
3. * ⽤法:
4. * @version 1.0
5. */
6. public class Mail {
7.
8. /**
9. * 发件⼈
10. */
11. private String from;
12. /**
13. * 发件⼈(显⽰)
14. */
15. private String fromName;
16. /**
17. * 收件⼈
18. */
19. private String[] to;
20. /**
21. * 抄送
22. */ 23. private String[] cc;
24. /**
25. * 秘密抄送
26. */
27. private String[] bcc;
28. /**
29. * 邮件主题
30. */
31. private String subject;
32. /**
33. * 邮件内容
34. */
35. private String content;
36. /**
37. * 附件
38. */
39. private MailAttachment[] attachments;
40.
41. /**
42. * 是否以HTML格式发送
43. */
44. boolean isHtmlFormat = true;
45.
46. //getter与setter⽅法省略
47. }
好了 整个接⼝都实现了,其实排除了你发送邮件提供给邮件发送接⼝的⼏个参数,剩下的也就是调⽤java提供的邮件发送的API和⼀些邮件发送必备的配置信息,必不是很难懂吧。⼤家肯定注意到了邮件发送接⼝的velocity模板解析⽅法: content = tance().parseVelocityTemplate(templet, paramMap); 它具体的实现如下所⽰:
[java]1. /**
2. * 功能:解析velocity模板
3. *
4. * ⽤法:
5. *
6. * @version 1.0
7. */
8.
9. public class VelocityParserUtil {
10. /**
11. * Logger for this class 11. * Logger for this class
12. */
13. private static final Logger logger = ger();
14.
15. private static VelocityParserUtil instance = new VelocityParserUtil();
16.
17. private VelocityEngine engine = null;
18.
19. private VelocityParserUtil() {
20. // init engine
21. engine = new VelocityEngine();
22. try {
23. ();
24. } catch (Exception e) {
25. ("VelocityParserUtil() - exception ignored", e); //$NON-NLS-1$
26.
27. }
28. }
29.
30. /**
31. * 返回VelocityParserUtil实例
32. * @return
33. */
34. public static VelocityParserUtil getInstance() {
35. return instance;
36. }
37.
38.
39.
40. /**
41. * 解析velocity模板
42. * @param vtl
43. * @param model
44. * @return String
45. * @throws ParseErrorException
46. * @throws MethodInvocationException
47. * @throws ResourceNotFoundException
48. * @throws IOException
49. */
50. public String parseVelocityTemplate(String vtl, Map model)
51. throws ParseErrorException, MethodInvocationException,
52. ResourceNotFoundException, IOException {
53. if (gEnabled()) {
54. ("parseVelocityTemplate(String, Map) - start"); //$NON-NLS-1$ 54. ("parseVelocityTemplate(String, Map) - start"); //$NON-NLS-1$
55. }
56.
57. VelocityContext velocityContext = new VelocityContext(model);
58. StringWriter result = new StringWriter();
59. te(velocityContext, result, null, vtl);
60.
61. String returnString = ng();
62. if (gEnabled()) {
63. ("parseVelocityTemplate(String, Map) - end"); //$NON-NLS-1$
64. }
65. return returnString;
66.
67. }
68.
69. }
我们会在其他的Service中去调⽤邮件发送的接⼝,只需要在业务层⾥构造好邮件发送的接⼝所需参数,我们的邮件就可以发送出去了。还有⼀点请⼤家注意,我这⾥主要强调的是运⽤velocity模板发送邮件,接⼝所需要的参数templat⼤家不要误解为velocity模板的⽂件名,它其实velocity⽂件的⽂件流,是⼀个已经被读⼊的字符串。⼤家可以参考⼀下测试⽤例,⼤致可以明⽩是怎么回事了。
[java]1. public class TempletEmailSenderTest extends BaseTestBaseForJUnit4{
2. @Autowired
3. @Qualifier("templetEmailSenderImpl_commons")
4. private TempletEmailSender sender;
5.
6. // @Test
7. public void sendEmailByTemplet() throws CheckException{
8. String templet = "$!{user}提醒您付款$!{amount}元";
9. Map paramMap = new HashMap();
10. ("user", "吴欣");
11. ("amount", "99.9");
12.
13. ailByTemplet("@", "@", "模板邮件", templet, paramMap);
14. }
整个邮件的发送⼤家是否明了了呢,呵呵! 后⾯我们会将这个接⼝向上抽象,为了实现我们短信发送的实现,下⼀篇敬请期待哦
发布评论