📄 remotedelivery.java
字号:
if (gateway != null) { gatewayServer = new ArrayList(); StringTokenizer st = new StringTokenizer(gateway, ",") ; while (st.hasMoreTokens()) { String server = st.nextToken().trim() ; if (server.indexOf(':') < 0 && gatewayPort != null) { server += ":"; server += gatewayPort; } if (isDebug) log("Adding SMTP gateway: " + server) ; gatewayServer.add(server); } } ComponentManager compMgr = (ComponentManager)getMailetContext().getAttribute(Constants.AVALON_COMPONENT_MANAGER); String outgoingPath = getInitParameter("outgoing"); if (outgoingPath == null) { outgoingPath = "file:///../var/mail/outgoing"; } try { // Instantiate the a MailRepository for outgoing mails MailStore mailstore = (MailStore) compMgr.lookup("org.apache.james.services.MailStore"); DefaultConfiguration spoolConf = new DefaultConfiguration("repository", "generated:RemoteDelivery.java"); spoolConf.setAttribute("destinationURL", outgoingPath); spoolConf.setAttribute("type", "SPOOL"); outgoing = (SpoolRepository) mailstore.select(spoolConf); } catch (ComponentException cnfe) { log("Failed to retrieve Store component:" + cnfe.getMessage()); } catch (Exception e) { log("Failed to retrieve Store component:" + e.getMessage()); } //Start up a number of threads try { deliveryThreadCount = Integer.parseInt(getInitParameter("deliveryThreads")); } catch (Exception e) { } for (int i = 0; i < deliveryThreadCount; i++) { StringBuffer nameBuffer = new StringBuffer(32) .append("Remote delivery thread (") .append(i) .append(")"); Thread t = new Thread(this, nameBuffer.toString()); t.start(); deliveryThreads.add(t); } bindAddress = getInitParameter("bind"); isBindUsed = bindAddress != null; try { if (isBindUsed) RemoteDeliverySocketFactory.setBindAdress(bindAddress); } catch (UnknownHostException e) { log("Invalid bind setting (" + bindAddress + "): " + e.toString()); } } /** * We can assume that the recipients of this message are all going to the same * mail server. We will now rely on the DNS server to do DNS MX record lookup * and try to deliver to the multiple mail servers. If it fails, it should * throw an exception. * * Creation date: (2/24/00 11:25:00 PM) * @param mail org.apache.james.core.MailImpl * @param session javax.mail.Session * @return boolean Whether the delivery was successful and the message can be deleted */ private boolean deliver(MailImpl mail, Session session) { try { if (isDebug) { log("Attempting to deliver " + mail.getName()); } MimeMessage message = mail.getMessage(); //Create an array of the recipients as InternetAddress objects Collection recipients = mail.getRecipients(); InternetAddress addr[] = new InternetAddress[recipients.size()]; int j = 0; for (Iterator i = recipients.iterator(); i.hasNext(); j++) { MailAddress rcpt = (MailAddress)i.next(); addr[j] = rcpt.toInternetAddress(); } if (addr.length <= 0) { log("No recipients specified... not sure how this could have happened."); return true; } //Figure out which servers to try to send to. This collection // will hold all the possible target servers Iterator targetServers = null; if (gatewayServer == null) { MailAddress rcpt = (MailAddress) recipients.iterator().next(); String host = rcpt.getHost(); //Lookup the possible targets targetServers = getMailetContext().getSMTPHostAddresses(host); if (!targetServers.hasNext()) { log("No mail server found for: " + host); StringBuffer exceptionBuffer = new StringBuffer(128) .append("There are no DNS entries for the hostname ") .append(host) .append(". I cannot determine where to send this message."); return failMessage(mail, new MessagingException(exceptionBuffer.toString()), false); } } else { targetServers = getGatewaySMTPHostAddresses(gatewayServer); } MessagingException lastError = null; while ( targetServers.hasNext()) { try { HostAddress outgoingMailServer = (HostAddress) targetServers.next(); StringBuffer logMessageBuffer = new StringBuffer(256) .append("Attempting delivery of ") .append(mail.getName()) .append(" to host ") .append(outgoingMailServer.getHostName()) .append(" at ") .append(outgoingMailServer.getHost()) .append(" to addresses ") .append(Arrays.asList(addr)); log(logMessageBuffer.toString()); Properties props = session.getProperties(); if (mail.getSender() == null) { props.put("mail.smtp.from", "<>"); } else { String sender = mail.getSender().toString(); props.put("mail.smtp.from", sender); } //Many of these properties are only in later JavaMail versions //"mail.smtp.ehlo" //default true //"mail.smtp.auth" //default false //"mail.smtp.dsn.ret" //default to nothing... appended as RET= after MAIL FROM line. //"mail.smtp.dsn.notify" //default to nothing...appended as NOTIFY= after RCPT TO line. Transport transport = null; try { transport = session.getTransport(outgoingMailServer); try { transport.connect(); } catch (MessagingException me) { // Any error on connect should cause the mailet to attempt // to connect to the next SMTP server associated with this // MX record. Just log the exception. We'll worry about // failing the message at the end of the loop. log(me.getMessage()); continue; } transport.sendMessage(message, addr); } finally { if (transport != null) { transport.close(); transport = null; } } logMessageBuffer = new StringBuffer(256) .append("Mail (") .append(mail.getName()) .append(") sent successfully to ") .append(outgoingMailServer.getHostName()) .append(" at ") .append(outgoingMailServer.getHost()); log(logMessageBuffer.toString()); return true; } catch (SendFailedException sfe) { if (sfe.getValidSentAddresses() == null || sfe.getValidSentAddresses().length < 1) { if (isDebug) log("Send failed, continuing with any other servers"); lastError = sfe; continue; } else { // If any mail was sent then the outgoing // server config must be ok, therefore rethrow throw sfe; } } catch (MessagingException me) { //MessagingException are horribly difficult to figure out what actually happened. StringBuffer exceptionBuffer = new StringBuffer(256) .append("Exception delivering message (") .append(mail.getName()) .append(") - ") .append(me.getMessage()); log(exceptionBuffer.toString()); if ((me.getNextException() != null) && (me.getNextException() instanceof java.io.IOException)) { //This is more than likely a temporary failure // If it's an IO exception with no nested exception, it's probably // some socket or weird I/O related problem. lastError = me; continue; } // This was not a connection or I/O error particular to one // SMTP server of an MX set. Instead, it is almost certainly // a protocol level error. In this case we assume that this // is an error we'd encounter with any of the SMTP servers // associated with this MX record, and we pass the exception // to the code in the outer block that determines its severity. throw me; } } // end while //If we encountered an exception while looping through, //throw the last MessagingException we caught. We only //do this if we were unable to send the message to any //server. If sending eventually succeeded, we exit //deliver() though the return at the end of the try //block. if (lastError != null) { throw lastError; } } catch (SendFailedException sfe) { boolean deleteMessage = false; Collection recipients = mail.getRecipients(); //Would like to log all the types of email addresses if (isDebug) log("Recipients: " + recipients); /* if (sfe.getValidSentAddresses() != null) { Address[] validSent = sfe.getValidSentAddresses(); Collection recipients = mail.getRecipients(); //Remove these addresses for the recipients for (int i = 0; i < validSent.length; i++) { try { MailAddress addr = new MailAddress(validSent[i].toString()); recipients.remove(addr); } catch (ParseException pe) { //ignore once debugging done pe.printStackTrace(); } } } */ /* * The rest of the recipients failed for one reason or * another. * * SendFailedException actually handles this for us. For * example, if you send a message that has multiple invalid * addresses, you'll get a top-level SendFailedException * that that has the valid, valid-unsent, and invalid * address lists, with all of the server response messages * will be contained within the nested exceptions. [Note: * the content of the nested exceptions is implementation * dependent.] * * sfe.getInvalidAddresses() should be considered permanent. * sfe.getValidUnsentAddresses() should be considered temporary. * * JavaMail v1.3 properly populates those collections based * upon the 4xx and 5xx response codes. * */ if (sfe.getInvalidAddresses() != null) { Address[] address = sfe.getInvalidAddresses(); if (address.length > 0) { recipients.clear(); for (int i = 0; i < address.length; i++) { try { recipients.add(new MailAddress(address[i].toString())); } catch (ParseException pe) { // this should never happen ... we should have // caught malformed addresses long before we // got to this code. log("Can't parse invalid address: " + pe.getMessage()); } } if (isDebug) log("Invalid recipients: " + recipients); deleteMessage = failMessage(mail, sfe, true); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -