1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.jsieve.mailet;
20
21 import javax.mail.MessagingException;
22 import javax.mail.internet.MimeMessage;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.jsieve.mail.Action;
26 import org.apache.jsieve.mail.ActionFileInto;
27 import org.apache.mailet.Mail;
28 import org.apache.mailet.MailAddress;
29
30
31
32
33
34
35 public class FileIntoAction implements MailAction {
36
37 private static final char HIERARCHY_DELIMITER = '.';
38
39 public void execute(Action action, Mail mail, ActionContext context) throws MessagingException {
40 if (action instanceof ActionFileInto) {
41 final ActionFileInto fileIntoAction = (ActionFileInto) action;
42 execute(fileIntoAction, mail, context);
43 }
44 }
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 @SuppressWarnings("deprecation")
72 public void execute(ActionFileInto anAction, Mail aMail, final ActionContext context) throws MessagingException
73 {
74 String destinationMailbox = anAction.getDestination();
75 MailAddress recipient;
76 boolean delivered = false;
77 try
78 {
79 recipient = ActionUtils.getSoleRecipient(aMail);
80 MimeMessage localMessage = createMimeMessage(aMail, recipient);
81
82 if (!(destinationMailbox.length() > 0
83 && destinationMailbox.charAt(0) == HIERARCHY_DELIMITER)) {
84 destinationMailbox = HIERARCHY_DELIMITER + destinationMailbox;
85 }
86
87 final String mailbox = destinationMailbox.replace(HIERARCHY_DELIMITER, '/');
88 final String host;
89 if (mailbox.charAt(0) == '/') {
90 host = "@localhost";
91 } else {
92 host = "@localhost/";
93 }
94 final String url = "mailbox://" + recipient.getUser() + host + mailbox;
95
96 context.post(url, localMessage);
97 delivered = true;
98 }
99 catch (MessagingException ex)
100 {
101 final Log log = context.getLog();
102 if (log.isDebugEnabled()) {
103 log.debug("Error while storing mail into. "+destinationMailbox, ex);
104 }
105 throw ex;
106 }
107 finally
108 {
109
110 aMail.setState(Mail.GHOST);
111 }
112 if (delivered)
113 {
114 final Log log = context.getLog();
115 if (log.isDebugEnabled()) {
116 log.debug("Filed Message ID: "
117 + aMail.getMessage().getMessageID()
118 + " into destination: \""
119 + destinationMailbox + "\"");
120 }
121 }
122 }
123
124 private static MimeMessage createMimeMessage(Mail aMail, MailAddress recipient) throws MessagingException {
125
126
127 MimeMessage localMessage = new MimeMessage(aMail.getMessage())
128 {
129 protected void updateHeaders() throws MessagingException
130 {
131 if (getMessageID() == null)
132 super.updateHeaders();
133 else
134 modified = false;
135 }
136 };
137 localMessage.addHeader("Delivered-To", recipient.toString());
138
139 localMessage.saveChanges();
140 return localMessage;
141 }
142 }