⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remotedelivery.java

📁 邮件服务器系统 支持SMTP POP3 是著名的Apache写 有一定的参考价值
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
        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 + -