1 21 package org.jsmtpd.plugins.deliveryServices; 22 23 import java.net.Inet4Address ; 24 import java.net.InetAddress ; 25 import java.net.UnknownHostException ; 26 import java.util.ArrayList ; 27 import java.util.Iterator ; 28 import java.util.List ; 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 47 public class RemoteSmtpSender implements IDeliveryService { 48 49 52 private Log log = LogFactory.getLog(RemoteSmtpSender.class); 53 56 private String smtpHostName; 57 58 private int connectionTimeout=30; 59 private List <Inet4Address > bogusDNS = new ArrayList <Inet4Address > (); 60 66 public void doDelivery(Email in, List <Rcpt> rcpts) { 67 68 Rcpt first = (Rcpt) rcpts.get(0); 69 String domain = first.getEmailAddress().getHost().toLowerCase(); 70 71 log.info("delivering mail from " + in.getFrom().toString() + " to domain " + domain); 72 73 IDNSResolver resolver = PluginStore.getInstance().getResolver(); 75 List smtpServers = resolver.doMXLookup(domain); 76 if (smtpServers.size() == 0) { 77 log.warn("Can't deliver to domain" + domain + ", dns query reported 0 results."); 78 for (Iterator 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 iter = smtpServers.iterator(); iter.hasNext();) { 88 InetAddress element = (InetAddress ) iter.next(); 89 for (Inet4Address addr : bogusDNS) { 90 if (addr.equals(element)) { 91 log.warn("this DNS resolution won't be used ("+element.toString()+")"); 92 continue; 93 } 94 } 95 97 log.debug("trying " + element.toString()); 98 SmtpSender sender = new SmtpSender(smtpHostName, in, (Inet4Address ) element, 25, rcpts,connectionTimeout); 99 try { 100 sender.doDelivery(); 101 break; } catch (TemporaryDeliveryException e) { 103 log.debug( "Temporary delivery error with " + element.toString()); 104 for (Iterator 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 for (Iterator 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 getPluginName() { 123 return "RemoteSmtpSender plugin fort jsmptd"; 124 } 125 126 129 public void initPlugin() throws PluginInitException { 130 smtpHostName = ReadConfig.getInstance().getLocalDomain(); 131 try { 132 Inet4Address localhost = (Inet4Address ) Inet4Address.getLocalHost(); 133 bogusDNS.add(localhost); 134 } catch (UnknownHostException e) { 135 throw new PluginInitException(e); 136 } 137 try { 138 Inet4Address me = (Inet4Address )InetAddress.getByName(smtpHostName); 139 bogusDNS.add(me); 140 } catch (UnknownHostException e) { 141 throw new PluginInitException(e); 142 } 143 } 144 145 148 public void shutdownPlugin() { 149 150 } 151 152 public void setConnectionTimeout(int connectionTimeout) { 153 this.connectionTimeout = connectionTimeout; 154 } 155 } | Popular Tags |