1 21 package org.jsmtpd.plugins.deliveryServices; 22 23 import java.net.Inet4Address ; 24 import java.net.InetAddress ; 25 import java.util.ArrayList ; 26 import java.util.Iterator ; 27 import java.util.List ; 28 29 import org.apache.commons.logging.Log; 30 import org.apache.commons.logging.LogFactory; 31 import org.jsmtpd.config.ReadConfig; 32 import org.jsmtpd.core.common.PluginInitException; 33 import org.jsmtpd.core.common.delivery.FatalDeliveryException; 34 import org.jsmtpd.core.common.delivery.IDeliveryService; 35 import org.jsmtpd.core.common.delivery.TemporaryDeliveryException; 36 import org.jsmtpd.core.mail.Email; 37 import org.jsmtpd.core.mail.Rcpt; 38 39 40 44 public class SMTPRelay implements IDeliveryService { 45 46 private Log log = LogFactory.getLog(SMTPRelay.class); 47 private List <Inet4Address > smtpServers = new ArrayList <Inet4Address >(); 48 private String smtpHostName; 49 private int connectionTimeout=30; 50 private String login; 51 private String password; 52 private String authMethod; 53 private int smtpPort = 25; 54 private boolean lmtp; 55 56 public void doDelivery(Email in, List <Rcpt> rcpts) { 57 Rcpt first = (Rcpt) rcpts.get(0); 58 String domain = first.getEmailAddress().getHost(); 59 60 log.info("delivering mail from " + in.getFrom().toString() + " of batch " + domain); 61 62 64 if (smtpServers.size() == 0) { 65 log.warn("Can't deliver to domain" + domain + ", no SMTP relay set"); 66 for (Iterator iterator = rcpts.iterator(); iterator.hasNext();) { 68 Rcpt oneRcpt = (Rcpt) iterator.next(); 69 oneRcpt.setDelivered(Rcpt.STATUS_ERROR_FATAL); 70 oneRcpt.setLastError("No smtp relay servers set"); 71 } 72 return; 73 } 74 log.info("using " + smtpServers.size() + " smtp relays"); 75 for (Iterator iter = smtpServers.iterator(); iter.hasNext();) { 76 InetAddress element = (InetAddress ) iter.next(); 77 log.debug("trying " + element.toString()); 78 SmtpSender sender; 79 if (authMethod!=null) 80 sender = new SmtpSender(smtpHostName, in, (Inet4Address ) element,smtpPort, rcpts,connectionTimeout,authMethod,login,password); 81 else 82 sender = new SmtpSender(smtpHostName, in, (Inet4Address ) element, smtpPort, rcpts,connectionTimeout); 83 if (lmtp) { 84 sender.setHelloCommand("LHLO"); 85 } 86 try { 87 sender.doDelivery(); 88 break; } catch (TemporaryDeliveryException e) { 90 log.debug( "Temporary delivery error with " + element.toString()); 91 for (Iterator iterator = rcpts.iterator(); iterator.hasNext();) { 93 Rcpt oneRcpt = (Rcpt) iterator.next(); 94 oneRcpt.setDelivered(Rcpt.STATUS_ERROR_NOT_FATAL); 95 oneRcpt.setLastError("Temporary delivery error while delivering to domain: "+domain+" using relay "+element.toString()); 96 } 97 } catch (FatalDeliveryException e) { 98 log.debug("Permanent delivery error with " + element.toString()); 99 for (Iterator iterator = rcpts.iterator(); iterator.hasNext();) { 101 Rcpt oneRcpt = (Rcpt) iterator.next(); 102 oneRcpt.setDelivered(Rcpt.STATUS_ERROR_FATAL); 103 oneRcpt.setLastError("Fatal delivery error while delivering to domain: "+ domain); 104 } 105 } 106 } 107 } 108 109 110 public String getPluginName() { 111 return "SMTP Relay delivery plugin"; 112 } 113 114 115 public void initPlugin() throws PluginInitException { 116 smtpHostName = ReadConfig.getInstance().getLocalDomain(); 117 } 118 119 120 public void shutdownPlugin() { 121 122 } 123 124 public void setRelay (String relay) throws Exception { 125 smtpServers.add((Inet4Address )Inet4Address.getByName(relay)); 126 } 127 128 129 public void setAuthMethod(String authMethod) { 130 this.authMethod = authMethod; 131 } 132 133 134 public void setLogin(String login) { 135 this.login = login; 136 } 137 138 139 public void setPassword(String password) { 140 this.password = password; 141 } 142 143 public void setSmtpPort(int smtpPort) { 144 this.smtpPort = smtpPort; 145 } 146 147 148 public void setLmtp(boolean lmtp) { 149 this.lmtp = lmtp; 150 } 151 152 153 } 154 | Popular Tags |