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 package info.magnolia.module.mail.handlers;
35
36 import info.magnolia.module.mail.templates.MgnlEmail;
37
38 import java.util.ArrayList;
39 import java.util.Arrays;
40
41 import javax.mail.Transport;
42
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46
47
48
49
50
51
52 public class ThreadedMailHandler implements MgnlMailHandler {
53
54 Logger log = LoggerFactory.getLogger(ThreadedMailHandler.class);
55
56 ArrayList<MgnlEmail> emails = new ArrayList<MgnlEmail>();
57
58 MailThread thread;
59
60 private ThreadedMailHandler() {
61 this.thread = new MailThread();
62 Thread bb = new Thread(this.thread);
63 bb.start();
64 }
65
66 protected void finalize() throws Throwable {
67 this.thread.setStop(true);
68 super.finalize();
69 }
70
71
72
73
74
75
76 public void prepareAndSendMail(MgnlEmail email) throws Exception {
77 email.setBodyNotSetFlag(true);
78 synchronized (this) {
79 this.emails.add(email);
80 }
81 this.thread.notify();
82 }
83
84
85
86
87
88
89 public void sendMail(MgnlEmail email) throws Exception {
90 synchronized (this) {
91 this.emails.add(email);
92 }
93 this.thread.notify();
94 }
95
96
97
98
99 class MailThread implements Runnable {
100
101 boolean stop = false;
102
103 public void run() {
104 while (!this.stop) {
105 if (ThreadedMailHandler.this.emails.size() == 0) {
106 synchronized (this) {
107 try {
108 wait();
109 }
110 catch (InterruptedException e) {
111 ThreadedMailHandler.this.log.info("Mail Thread was interrupted");
112 }
113 }
114 }
115 else {
116 MgnlEmail email = null;
117 synchronized (this) {
118 if (ThreadedMailHandler.this.emails.size() > 0) {
119 email = ThreadedMailHandler.this.emails.remove(0);
120 }
121 }
122 if (email != null) {
123 try {
124 if (email.isBodyNotSetFlag()) {
125
126 }
127 try {
128 Transport.send(email);
129 ThreadedMailHandler.this.log.info("Mail has been sent to: ["
130 + Arrays.asList(email.getAllRecipients())
131 + "]");
132 }
133 catch (Exception e) {
134 ThreadedMailHandler.this.log.error("Email to: ["
135 + Arrays.asList(email.getAllRecipients())
136 + "] was not sent because of an error", e);
137 }
138 }
139 catch (Exception e) {
140 e.printStackTrace();
141 }
142 }
143 }
144
145 }
146 }
147
148 public boolean isStop() {
149 return this.stop;
150 }
151
152 public void setStop(boolean stop) {
153 this.stop = stop;
154 this.notify();
155 }
156 }
157 }