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