KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jsmtpd > plugins > deliveryServices > RemoteSmtpSender


1 /*
2  *
3  * Jsmtpd, Java SMTP daemon
4  * Copyright (C) 2005 Jean-Francois POUX, jf.poux@laposte.net
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  *
20  */

21 package org.jsmtpd.plugins.deliveryServices;
22
23 import java.net.Inet4Address JavaDoc;
24 import java.net.InetAddress JavaDoc;
25 import java.net.UnknownHostException JavaDoc;
26 import java.util.ArrayList JavaDoc;
27 import java.util.Iterator JavaDoc;
28 import java.util.List JavaDoc;
29
30 import org.apache.commons.logging.Log;
31 import org.apache.commons.logging.LogFactory;
32 import org.jsmtpd.config.ReadConfig;
33 import org.jsmtpd.core.common.PluginInitException;
34 import org.jsmtpd.core.common.PluginStore;
35 import org.jsmtpd.core.common.delivery.FatalDeliveryException;
36 import org.jsmtpd.core.common.delivery.IDeliveryService;
37 import org.jsmtpd.core.common.delivery.TemporaryDeliveryException;
38 import org.jsmtpd.core.common.dnsService.IDNSResolver;
39 import org.jsmtpd.core.mail.Email;
40 import org.jsmtpd.core.mail.Rcpt;
41
42 /**
43  * A delivery service plugin, able to connect to remote smtp servers.
44  * @author Jean-Francois POUX
45  * work is donne by @see jsmtpdPlugins.deliveryServices.SmtpSender
46  */

47 public class RemoteSmtpSender implements IDeliveryService {
48
49     /**
50      * The server log4j instance
51      */

52     private Log log = LogFactory.getLog(RemoteSmtpSender.class);
53     /**
54      * hostname of our server, from config file jsmtpd.ini
55      */

56     private String JavaDoc smtpHostName;
57
58     private int connectionTimeout=30;
59     private List JavaDoc<Inet4Address JavaDoc> bogusDNS = new ArrayList JavaDoc<Inet4Address JavaDoc> ();
60     /**
61      * Trys to deliver mail
62      * nb : only works for ipv4 hosts, code to add to get it working with ipv6
63      * @param in the email to deliver
64      * @param rcpts the rcpt to process
65      */

66     public void doDelivery(Email in, List JavaDoc<Rcpt> rcpts) {
67         
68         Rcpt first = (Rcpt) rcpts.get(0);
69         String JavaDoc domain = first.getEmailAddress().getHost().toLowerCase();
70         
71         log.info("delivering mail from " + in.getFrom().toString() + " to domain " + domain);
72         
73         // Query DNS, for each DNS try send message.
74
IDNSResolver resolver = PluginStore.getInstance().getResolver();
75         List JavaDoc smtpServers = resolver.doMXLookup(domain);
76         if (smtpServers.size() == 0) {
77             log.warn("Can't deliver to domain" + domain + ", dns query reported 0 results.");
78             // Mark all rcpt as error fatal
79
for (Iterator JavaDoc iterator = rcpts.iterator(); iterator.hasNext();) {
80                 Rcpt oneRcpt = (Rcpt) iterator.next();
81                 oneRcpt.setDelivered(Rcpt.STATUS_ERROR_FATAL);
82                 oneRcpt.setLastError("No DNS Mail exchanger entries for domain "+domain+", can't deliver mail.");
83             }
84             return;
85         }
86         log.debug("found " + smtpServers.size() + " mail exchangers");
87         for (Iterator JavaDoc iter = smtpServers.iterator(); iter.hasNext();) {
88             InetAddress JavaDoc element = (InetAddress JavaDoc) iter.next();
89             for (Inet4Address JavaDoc addr : bogusDNS) {
90                 if (addr.equals(element)) {
91                     log.warn("this DNS resolution won't be used ("+element.toString()+")");
92                     continue;
93                 }
94             }
95             // TODO: check against ACL ?
96

97             log.debug("trying " + element.toString());
98             SmtpSender sender = new SmtpSender(smtpHostName, in, (Inet4Address JavaDoc) element, 25, rcpts,connectionTimeout);
99             try {
100                 sender.doDelivery();
101                 break; // if delivery is ok, do not resend !
102
} catch (TemporaryDeliveryException e) {
103                 log.debug( "Temporary delivery error with " + element.toString());
104                 // Mark all rcpt as error not fatal
105
for (Iterator JavaDoc iterator = rcpts.iterator(); iterator.hasNext();) {
106                     Rcpt oneRcpt = (Rcpt) iterator.next();
107                     oneRcpt.setDelivered(Rcpt.STATUS_ERROR_NOT_FATAL);
108                     oneRcpt.setLastError("Temporary delivery error while delivering to domain: "+domain+", Cause = "+e.getMessage());
109                 }
110             } catch (FatalDeliveryException e) {
111                 log.debug("Permanent delivery error with " + element.toString());
112                 // Mark all rcpt as fatal
113
for (Iterator JavaDoc iterator = rcpts.iterator(); iterator.hasNext();) {
114                     Rcpt oneRcpt = (Rcpt) iterator.next();
115                     oneRcpt.setDelivered(Rcpt.STATUS_ERROR_FATAL);
116                     oneRcpt.setLastError("Fatal delivery error while delivering to domain: "+ domain+", Cause = "+e.getMessage());
117                 }
118             }
119         }
120     }
121
122     public String JavaDoc getPluginName() {
123         return "RemoteSmtpSender plugin fort jsmptd";
124     }
125
126     /* (non-Javadoc)
127      * @see smtpd.common.IGenericPlugin#initPlugin()
128      */

129     public void initPlugin() throws PluginInitException {
130         smtpHostName = ReadConfig.getInstance().getLocalDomain();
131         try {
132             Inet4Address JavaDoc localhost = (Inet4Address JavaDoc) Inet4Address.getLocalHost();
133             bogusDNS.add(localhost);
134         } catch (UnknownHostException JavaDoc e) {
135           throw new PluginInitException(e);
136         }
137         try {
138             Inet4Address JavaDoc me = (Inet4Address JavaDoc)InetAddress.getByName(smtpHostName);
139             bogusDNS.add(me);
140         } catch (UnknownHostException JavaDoc e) {
141             throw new PluginInitException(e);
142         }
143     }
144
145     /* (non-Javadoc)
146      * @see jsmtpd.common.IGenericPlugin#shutdownPlugin()
147      */

148     public void shutdownPlugin() {
149
150     }
151
152     public void setConnectionTimeout(int connectionTimeout) {
153         this.connectionTimeout = connectionTimeout;
154     }
155 }
Popular Tags