1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.mail;
18
19 import java.io.PrintStream;
20 import java.io.PrintWriter;
21 import java.util.LinkedHashMap;
22 import java.util.Map;
23
24 import org.springframework.util.ObjectUtils;
25
26
27
28
29
30
31
32
33 @SuppressWarnings("serial")
34 public class MailSendException extends MailException {
35
36 private transient final Map<Object, Exception> failedMessages;
37
38 private Exception[] messageExceptions;
39
40
41
42
43
44
45 public MailSendException(String msg) {
46 this(msg, null);
47 }
48
49
50
51
52
53
54 public MailSendException(String msg, Throwable cause) {
55 super(msg, cause);
56 this.failedMessages = new LinkedHashMap<Object, Exception>();
57 }
58
59
60
61
62
63
64
65
66
67
68
69 public MailSendException(String msg, Throwable cause, Map<Object, Exception> failedMessages) {
70 super(msg, cause);
71 this.failedMessages = new LinkedHashMap<Object, Exception>(failedMessages);
72 this.messageExceptions = failedMessages.values().toArray(new Exception[failedMessages.size()]);
73 }
74
75
76
77
78
79
80
81
82
83 public MailSendException(Map<Object, Exception> failedMessages) {
84 this(null, null, failedMessages);
85 }
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 public final Map<Object, Exception> getFailedMessages() {
107 return this.failedMessages;
108 }
109
110
111
112
113
114
115
116
117
118 public final Exception[] getMessageExceptions() {
119 return (this.messageExceptions != null ? this.messageExceptions : new Exception[0]);
120 }
121
122
123 @Override
124 public String getMessage() {
125 if (ObjectUtils.isEmpty(this.messageExceptions)) {
126 return super.getMessage();
127 }
128 else {
129 StringBuilder sb = new StringBuilder();
130 String baseMessage = super.getMessage();
131 if (baseMessage != null) {
132 sb.append(baseMessage).append(". ");
133 }
134 sb.append("Failed messages: ");
135 for (int i = 0; i < this.messageExceptions.length; i++) {
136 Exception subEx = this.messageExceptions[i];
137 sb.append(subEx.toString());
138 if (i < this.messageExceptions.length - 1) {
139 sb.append("; ");
140 }
141 }
142 return sb.toString();
143 }
144 }
145
146 @Override
147 public String toString() {
148 if (ObjectUtils.isEmpty(this.messageExceptions)) {
149 return super.toString();
150 }
151 else {
152 StringBuilder sb = new StringBuilder(super.toString());
153 sb.append("; message exceptions (").append(this.messageExceptions.length).append(") are:");
154 for (int i = 0; i < this.messageExceptions.length; i++) {
155 Exception subEx = this.messageExceptions[i];
156 sb.append('\n').append("Failed message ").append(i + 1).append(": ");
157 sb.append(subEx);
158 }
159 return sb.toString();
160 }
161 }
162
163 @Override
164 public void printStackTrace(PrintStream ps) {
165 if (ObjectUtils.isEmpty(this.messageExceptions)) {
166 super.printStackTrace(ps);
167 }
168 else {
169 ps.println(super.toString() + "; message exception details (" +
170 this.messageExceptions.length + ") are:");
171 for (int i = 0; i < this.messageExceptions.length; i++) {
172 Exception subEx = this.messageExceptions[i];
173 ps.println("Failed message " + (i + 1) + ":");
174 subEx.printStackTrace(ps);
175 }
176 }
177 }
178
179 @Override
180 public void printStackTrace(PrintWriter pw) {
181 if (ObjectUtils.isEmpty(this.messageExceptions)) {
182 super.printStackTrace(pw);
183 }
184 else {
185 pw.println(super.toString() + "; message exception details (" +
186 this.messageExceptions.length + ") are:");
187 for (int i = 0; i < this.messageExceptions.length; i++) {
188 Exception subEx = this.messageExceptions[i];
189 pw.println("Failed message " + (i + 1) + ":");
190 subEx.printStackTrace(pw);
191 }
192 }
193 }
194
195 }