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 paramMap)

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 paramMap)

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 paramMap) throws CheckException;

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 paramMap)

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 paramMap)

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 paramMap)

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 paramMap)

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 paramMap) throws CheckException;

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 paramMap)

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 paramMap)

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. }

整个邮件的发送⼤家是否明了了呢,呵呵! 后⾯我们会将这个接⼝向上抽象,为了实现我们短信发送的实现,下⼀篇敬请期待哦