a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 262|回复: 1

[基础知识] 用Spring让JavaMail支持简化邮件发送

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
今天我们谈到Spring提供的邮件发送不仅支持简单邮件的发送、添加附件,而且还可以使用velocity模板控制页面样式。    闲来无事,翻看《Spring in Action》,发现Spring集成了对JAVA Mail的支持,有点小激动的看了一遍,嗯,话说真的简单了很多。- T' X! c, k6 H% h% G7 N8 Z
    Spring的邮件发送的核心是MailSender接口,在Spring3.0中提供了一个实现类Mail 的jar包。; {& \# Y2 D' y: k7 ?) [
    我们首先得声明一个MailSender对象,因为MailSender对象只有两个重载的send(…)方法,显得有些简陋,我们建议选用JavaMailSender接口,或者干脆直接使用实现类,JavaMailSenderImpl。笔者是使用的JavaMailSenderImpl对象,功能丰富。
+ T3 z& J7 v, `+ G4 A    声明JavaMailSenderImpl对象,并在构造函数中初始化(当然也可以使用IoC容器初始化):' t" M/ k- q3 e/ [, ^' U0 a
    public class SpringMailSender {
9 j! J& h6 N8 k7 b$ g3 W    // Spring的邮件工具类,实现了MailSender和JavaMailSender接口
) n. d/ c$ f1 D    private JavaMailSenderImpl mailSender;
. Q9 r3 X/ Y: k3 |( f    public SpringMailSender() {
3 Z* n9 V0 x( H  G    // 初始化JavaMailSenderImpl,当然推荐在spring配置文件中配置,这里是为了简单# }" \4 d% q9 C( D0 q# a2 L
    mailSender = new JavaMailSenderImpl();
7 O, V9 G# r7 ?: I" R    // 设置参数2 V$ L) S! Y& W
    mailSender.setHost("smtp.qq.com");- ?" y9 T8 ~4 ^8 |& ~2 K
    mailSender.setUsername("786553789@qq.com");7 k' D7 K! I8 Y5 d$ N9 o! G+ N( D) ]
    mailSender.setPassword("556WULI779");
* L. G! F2 n0 {' x/ ^    …  ?. c4 C# R3 B: }. ~* R
    得到了MailSender对象之后,就可以发送邮件了,下面是示例代码,没有封装,仅供参考。
  ~' r* x7 b$ R% y! J3 @! N    1、发送简单邮件" v4 o% h$ \3 o7 X3 _2 t5 s
    /**5 @: J" d. Z$ G3 w2 w4 K! V
    * 简单邮件发送
( }% a$ \8 G, M- T    *
/ h, _& m3 w0 Q" E    */% w# G% F4 M; }& p* J
    public void simpleSend() {# k" W5 A1 Y( l+ F+ k, s; [
    // 构建简单邮件对象,见名知意, E/ z/ z8 F+ K. \  n
    SimpleMailMessage smm = new SimpleMailMessage();
/ p5 F8 o& p) F: y    // 设定邮件参数
& A3 v4 s3 U5 Y" ^    smm.setFrom(mailSender.getUsername());
. g0 }; a+ F9 v3 t* `0 @( n    smm.setTo("mosaic@126.com");
* _" Q6 @! B- c! I  W. q) D5 I; I    smm.setSubject("Hello world");- x; C/ Q' t$ e5 V2 |- a
    smm.setText("Hello world via spring mail sender");( E) H! \, N# _6 P
    // 发送邮件
: J4 g3 Y5 D- T    mailSender.send(smm);
; K9 k- D0 x5 s8 b) f    }
& s& R+ u$ F! D$ p    2、发送带附件的邮件0 W8 N" k" ]2 G8 m. Q
    /**
2 f$ G4 l1 S. h. @' x+ m    * 带附件的邮件发送
' X; l* u4 j  m" z1 I; [    *
2 }+ s- E5 b# h& t    * @throws MessagingException' h! d/ Z7 |, {7 e1 b/ W
    */
0 t2 ?& {/ b% T. z$ z+ c( x    public void attachedSend() throws MessagingException {4 v) M5 q4 Y3 D, C& ?% x8 [& d
    //使用JavaMail的MimeMessage,支付更加复杂的邮件格式和内容) L+ ]* B) u# A
    MimeMessage msg = mailSender.createMimeMessage();, G) F. w- [" g, m8 m
    //创建MimeMessageHelper对象,处理MimeMessage的辅助类
$ {- y! p$ x! @5 s' X    MimeMessageHelper helper = new MimeMessageHelper(msg, true);
( E  D9 v9 I$ d; Q& R( @1 C" ?6 F    //使用辅助类MimeMessage设定参数; O$ i8 h$ a7 s9 e! p+ M
    helper.setFrom(mailSender.getUsername());) `$ u$ J6 q$ e% q
    helper.setTo("mosaic@126.com");
* |6 c  X5 N# |- A0 O    helper.setSubject("Hello Attachment");
& c  |& b( s" B0 A0 ]! f! ^    helper.setText("This is a mail with attachment");
0 |* D7 j4 ?  H$ R& u' E    //加载文件资源,作为附件; P! T7 J; o4 u( D
    ClassPathResource file = new ClassPathResource(
: K) w, k) U) x  U. k  {, G    "Chrysanthemum.jpg");' ]5 @" O! t! `; d9 [
    //加入附件/ B8 r3 L8 h# G2 [) x7 H
    helper.addAttachment("attachment.jpg", file);
: ]( C+ c% x) I$ E2 A3 z! N# P    //发送邮件& I9 m& L- U; k' l9 P
    mailSender.send(msg);( O1 \5 F  B# `  u
    }, \7 ~7 |4 U$ m0 X+ x
    3、发送富文本邮件( c$ L8 w# L" a# @
    /**发送富文本邮件
  q* Y- i9 }3 _) O3 V    * @throws MessagingException2 g3 E- n  @1 T6 f% q1 l
    */+ w+ T+ a% V6 o
    public void richContentSend() throws MessagingException {
; Z- B4 S$ H  }6 z4 m! E  U8 ~6 F    MimeMessage msg = mailSender.createMimeMessage();- x' l* x; g. X  s( v$ a
    MimeMessageHelper helper = new MimeMessageHelper(msg, true);
' y5 v  s4 m! B( v2 m6 m" ?8 n    helper.setFrom(mailSender.getUsername());- {; W: F; p. E% e, D
    helper.setTo("mosaic@126.com");
3 U$ g! U3 C0 B! i4 y( f! j7 b+ f8 I    helper.setSubject("Rich content mail");! k. |" c7 R( h' T
    //第二个参数true,表示text的内容为html,然后注意标签,src='cid:file',
: G0 g; j5 k6 v2 o# r    'cid'是contentId的缩写,'file'是一个标记,
+ J( O* W6 m4 p! O9 @0 y' q: Q* B, V    需要在后面的代码中调用MimeMessageHelper的addInline方法替代成文件9 G% H, K* C8 ^7 A/ K' U5 m
    helper.setText(* i0 [' T/ ~6 s& x8 P+ d( E% ^
    "Hello Html Email
; s7 t& W- I0 A, n: p; u  R",
& I# E6 D( D' _- O0 F) X3 H. A    true);5 Y* g6 C3 a% _2 e6 t2 [- ^
    FileSystemResource file = new FileSystemResource(
$ i  N' |) L# |6 g5 t5 T* H    "C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg");& x- ^( c, M7 Z& M5 d" N  H
    helper.addInline("file", file);
* t! f/ A6 B* G8 p5 ]! b% C    mailSender.send(msg);
0 @6 E6 G  d2 y" `    }
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

用Spring让JavaMail支持简化邮件发送

4、使用Velocity模板确定邮件风格     使用Velocity模板,需要Velocity的jar包,可以在官方网站下载,并加入ClassPath,然后需要声明一个VelocityEngine对象,具体的参考下面代码,这是笔者第一次使用Velocity,不甚了解,言多有失,望见谅。6 z6 e" v- Q' G/ {
    声明一个VelocityEngine对象,并在构造函数中初始化(IoC is optional)
3 W, q1 ]3 H- E: O" P; z    …
3 c1 f; G& L- Z$ l$ ]. g5 A; c9 G    private VelocityEngine velocityEngine;2 I5 u0 Q0 [9 c6 G% T/ ?
    public SpringMailSender() {
! j/ O, F) {+ s0 m6 B+ {    …
5 o# n' M2 U4 n/ t& W    // Velocity的参数,通过VelocityEngineFactoryBean创建VelocityEngine,也是推荐在配置文件中配置的" i/ K9 u2 Z/ {
    Properties props = System.getProperties();/ K8 C$ K& B8 J* c! I# b0 I
    props.put("resource.loader", "class");2 ?1 _9 V$ d" b  ?% Z9 [
    props
. W1 U6 @  T/ L& K3 s    .put("class.resource.loader.class",
3 u9 K8 J' R3 X- I* G, `% |0 F    "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");9 r# q" z/ ~/ v/ Q: {- H* d
    VelocityEngineFactoryBean v = new VelocityEngineFactoryBean();0 \, r3 ]2 Q7 F9 `$ e# \0 d
    v.setVelocityProperties(props);
4 k0 D1 v0 i* Q: @% R1 u    try {
$ b" T9 U4 X3 t6 ?7 E! }    velocityEngine = v.createVelocityEngine();
0 S4 A; V. L0 X2 ~7 u    } catch (VelocityException e) {: {' r$ N( o7 n; N5 \
    e.printStackTrace();
- t8 x) N9 i# j3 J* G- G0 g1 [4 L    } catch (IOException e) {
5 V* S; y( K5 |    e.printStackTrace();) `: v9 s0 v9 R5 t, o% G
    }- g0 C' T+ l4 e1 J
    }
8 q. _  H; l3 ]- P% E$ n5 r    简单的Velocity模板文件(index.vm):7 M) f8 S9 M0 `2 h& Z0 K" U7 b, T
   
9 B* H# ?# G6 {4 [) A* c    - R2 B/ x& G& H5 b( B6 @
    1 B6 Z! N3 e5 V9 s
    h4{
  Y% G* m4 }2 A, n  E    color:red;
& Z2 o" m3 z; o+ D3 U8 N    background:#efefef;. J. e6 S6 c& x* P
    }
  i2 [' \9 O, U2 T# n    2 _) C# q/ w# ?- U) I
   
4 E" r* g7 e: C; z0 A   
' O- c) w+ z/ K+ q/ @% c" R0 B    ${user}
8 V9 Q2 C, l% L" }1 M# l6 ~5 h4 W2 X# R4 k
2 O4 n1 l: Q( K* x; L) `
$ |6 U6 B% P9 X( m. h) @! ^: c
      s+ ^( w; ^  R4 K
. L4 V" o; ^8 Q# B
    ${content}
% M9 W! K2 l& a. ?" x   
  r+ ^3 Y9 p' U3 N. }) w  U    ' {' G, X! k1 a" g9 D8 g6 S6 m) x
    开起来貌似很容易理解,只是普通的Html文件,使用了一些${placeholder}作为占位符。* [3 M# i5 k% i5 y
    Java要做的,就是加载模板,并将相应的值插入到占位符当中。
; D8 c. F0 Y) K) |/ g4 E    /**1 }" r# U) \; y  y+ L) {
    * 使用Velocity模板发送邮件
+ g( Y3 X) f1 L, {    *
" |9 N+ F( m: V7 T& e* o" ?0 ^    * @throws MessagingException2 S" Q5 J  H- r/ w. a% ]2 p
    */
& n9 x- Y2 I. k/ [    public void templateSend() throws MessagingException {
& W/ P# Z  h8 g    // 声明Map对象,并填入用来填充模板文件的键值对
3 G1 b* \" S7 S    Map model = new HashMap();
0 E9 @- Z5 p7 Z. `) b9 v% L* Y* L    model.put("user", "MZULE");% F: a  o: P# O" ^4 ~
    model.put("content", "Hello");
& H+ E+ k6 d4 _; U3 h8 Y    // Spring提供的VelocityEngineUtils将模板进行数据填充,并转换成普通的String对象
# e0 E) i3 W4 G  C% q: I& d    String emailText = VelocityEngineUtils.mergeTemplateIntoString(
% d- R$ ?; |6 s) o+ K6 o! V3 q4 O    velocityEngine, "index.vm", model);5 k, P' e0 U9 ]6 H2 d
    // 和上面一样的发送邮件的工作
, `& ]6 _+ a* v# q) ]0 t2 e    MimeMessage msg = mailSender.createMimeMessage();& ^8 M4 i% n% }% t" S# j
    MimeMessageHelper helper = new MimeMessageHelper(msg, true);
3 t5 ?& c' l" B$ Y8 p5 @  ?& v) U    helper.setFrom(mailSender.getUsername());0 g; I2 D2 }. l  f- O
    helper.setTo("mosaic@126.com");8 p1 v& A% `( q7 ^" `# ]
    helper.setSubject("Rich content mail");
! K# P- j' q7 k1 R0 D( A: ], U    helper.setText(emailText, true);, z+ [. j$ u* J9 G0 B' w
    mailSender.send(msg);% Y0 A7 U( |3 w
    }
0 ], h6 i5 V; s7 O) [9 L3 a    Spring可谓是大大简化了邮件的发送步骤,虽然我们自己封装可能实现起来并不复杂,但是,有现成的有何必要重新造轮子呢?(当然造轮子可以学到很多)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-5 20:17 , Processed in 0.178095 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表