Dims: 1) Way cool
2) Could you please please put a README.txt file in the transport/mail directory? Thanks! --Glen > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]] > Sent: Friday, December 13, 2002 3:46 PM > To: [EMAIL PROTECTED] > Subject: cvs commit: xml-axis/java/xmls properties.xml targets.xml > > > dims 2002/12/13 12:46:08 > > Modified: java build.xml > java/src/org/apache/axis/utils Options.java > java/xmls properties.xml targets.xml > Added: java/src/org/apache/axis/transport/mail Handler.java > MailConstants.java MailSender.java > MailServer.java > MailTransport.java MailWorker.java > Log: > Checking in an Initial Impl of a SMTP/POP3 transport. > > Notes: > - You will need a daily build of Jakarta Commons/Net from > (http://jakarta.apache.org/commons/sandbox/net/) > - Checked this in to be able to try Async API (When the > Async Implementations start, as i don't have access to a JMS > environment) > - One major problem is that Commons/Net uses Reader/Writer > and JavaMail API uses InputStream/OutputStream so we need to > store messages in an intermediate byte array > > Revision Changes Path > 1.219 +1 -0 xml-axis/java/build.xml > > Index: build.xml > =================================================================== > RCS file: /home/cvs/xml-axis/java/build.xml,v > retrieving revision 1.218 > retrieving revision 1.219 > diff -u -r1.218 -r1.219 > --- build.xml 6 Dec 2002 18:21:40 -0000 1.218 > +++ build.xml 13 Dec 2002 20:46:08 -0000 1.219 > @@ -126,6 +126,7 @@ > <exclude > name="**/org/apache/axis/transport/http/ServletEndpointContext > Impl.java" unless="servlet.present"/> > <exclude > name="**/org/apache/axis/transport/configuration/EngineConfigu > rationFactoryServlet.java" unless="servlet.present"/> > <exclude > name="**/org/apache/axis/transport/http/CommonsHTTPSender.java > " unless="commons-httpclient.present"/> > + <exclude > name="**/org/apache/axis/transport/mail/*.java" > unless="commons-httpclient.present"/> > <exclude name="**/org/apache/axis/transport/jms/*" > unless="jms.present"/> > <exclude > name="**/org/apache/axis/components/jms/BeanVendorAdapter.java > " unless="jms.present"/> > <exclude > name="**/org/apache/axis/components/jms/JMSVendorAdapter.java" > unless="jms.present"/> > > > > 1.1 > xml-axis/java/src/org/apache/axis/transport/mail/Handler.java > > Index: Handler.java > =================================================================== > /* > * The Apache Software License, Version 1.1 > * > * > * Copyright (c) 2001 The Apache Software Foundation. All rights > * reserved. > * > * Redistribution and use in source and binary forms, with > or without > * modification, are permitted provided that the following > conditions > * are met: > * > * 1. Redistributions of source code must retain the above copyright > * notice, this list of conditions and the following disclaimer. > * > * 2. Redistributions in binary form must reproduce the > above copyright > * notice, this list of conditions and the following > disclaimer in > * the documentation and/or other materials provided with the > * distribution. > * > * 3. The end-user documentation included with the redistribution, > * if any, must include the following acknowledgment: > * "This product includes software developed by the > * Apache Software Foundation (http://www.apache.org/)." > * Alternately, this acknowledgment may appear in the > software itself, > * if and wherever such third-party acknowledgments > normally appear. > * > * 4. The names "Axis" and "Apache Software Foundation" must > * not be used to endorse or promote products derived from this > * software without prior written permission. For written > * permission, please contact [EMAIL PROTECTED] > * > * 5. Products derived from this software may not be called > "Apache", > * nor may "Apache" appear in their name, without prior written > * permission of the Apache Software Foundation. > * > * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED > * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES > * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE > * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR > * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF > * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > CAUSED AND > * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > LIABILITY, > * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > ANY WAY OUT > * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > POSSIBILITY OF > * SUCH DAMAGE. > * > ==================================================================== > * > * This software consists of voluntary contributions made by many > * individuals on behalf of the Apache Software Foundation. > For more > * information on the Apache Software Foundation, please see > * <http://www.apache.org/>. > */ > > package org.apache.axis.transport.mail; > > import java.net.URL; > import java.net.URLConnection; > import java.net.URLStreamHandler; > > /** > * A stub URLStreamHandler, so the system will recognize our > * custom URLs as valid. > * > * @author Davanum Srinivas <[EMAIL PROTECTED]> > */ > public class Handler extends URLStreamHandler { > protected URLConnection openConnection(URL u) { > return null; > } > } > > > > 1.1 > xml-axis/java/src/org/apache/axis/transport/mail/MailConstants.java > > Index: MailConstants.java > =================================================================== > /* > * The Apache Software License, Version 1.1 > * > * > * Copyright (c) 2001 The Apache Software Foundation. All rights > * reserved. > * > * Redistribution and use in source and binary forms, with > or without > * modification, are permitted provided that the following > conditions > * are met: > * > * 1. Redistributions of source code must retain the above copyright > * notice, this list of conditions and the following disclaimer. > * > * 2. Redistributions in binary form must reproduce the > above copyright > * notice, this list of conditions and the following > disclaimer in > * the documentation and/or other materials provided with the > * distribution. > * > * 3. The end-user documentation included with the redistribution, > * if any, must include the following acknowledgment: > * "This product includes software developed by the > * Apache Software Foundation (http://www.apache.org/)." > * Alternately, this acknowledgment may appear in the > software itself, > * if and wherever such third-party acknowledgments > normally appear. > * > * 4. The names "Axis" and "Apache Software Foundation" must > * not be used to endorse or promote products derived from this > * software without prior written permission. For written > * permission, please contact [EMAIL PROTECTED] > * > * 5. Products derived from this software may not be called > "Apache", > * nor may "Apache" appear in their name, without prior written > * permission of the Apache Software Foundation. > * > * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED > * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES > * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE > * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR > * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF > * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > CAUSED AND > * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > LIABILITY, > * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > ANY WAY OUT > * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > POSSIBILITY OF > * SUCH DAMAGE. > * > ==================================================================== > * > * This software consists of voluntary contributions made by many > * individuals on behalf of the Apache Software Foundation. > For more > * information on the Apache Software Foundation, please see > * <http://www.apache.org/>. > */ > > package org.apache.axis.transport.mail; > > public class MailConstants { > public final static String FROM_ADDRESS = "transport.mail.from"; > public final static String TO_ADDRESS = "transport.mail.to"; > public final static String SMTP_HOST = > "transport.mail.smtp.host"; > public final static String POP3_HOST = > "transport.mail.pop3.host"; > public final static String POP3_USERID = > "transport.mail.pop3.userid"; > public final static String POP3_PASSWORD = > "transport.mail.pop3.password"; > } > > > > 1.1 > xml-axis/java/src/org/apache/axis/transport/mail/MailSender.java > > Index: MailSender.java > =================================================================== > /* > * The Apache Software License, Version 1.1 > * > * > * Copyright (c) 2001 The Apache Software Foundation. All rights > * reserved. > * > * Redistribution and use in source and binary forms, with > or without > * modification, are permitted provided that the following > conditions > * are met: > * > * 1. Redistributions of source code must retain the above copyright > * notice, this list of conditions and the following disclaimer. > * > * 2. Redistributions in binary form must reproduce the > above copyright > * notice, this list of conditions and the following > disclaimer in > * the documentation and/or other materials provided with the > * distribution. > * > * 3. The end-user documentation included with the redistribution, > * if any, must include the following acknowledgment: > * "This product includes software developed by the > * Apache Software Foundation (http://www.apache.org/)." > * Alternately, this acknowledgment may appear in the > software itself, > * if and wherever such third-party acknowledgments > normally appear. > * > * 4. The names "Axis" and "Apache Software Foundation" must > * not be used to endorse or promote products derived from this > * software without prior written permission. For written > * permission, please contact [EMAIL PROTECTED] > * > * 5. Products derived from this software may not be called > "Apache", > * nor may "Apache" appear in their name, without prior written > * permission of the Apache Software Foundation. > * > * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED > * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES > * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE > * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR > * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF > * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > CAUSED AND > * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > LIABILITY, > * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > ANY WAY OUT > * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > POSSIBILITY OF > * SUCH DAMAGE. > * > ==================================================================== > * > * This software consists of voluntary contributions made by many > * individuals on behalf of the Apache Software Foundation. > For more > * information on the Apache Software Foundation, please see > * <http://www.apache.org/>. > */ > package org.apache.axis.transport.mail; > > import org.apache.axis.AxisFault; > import org.apache.axis.Message; > import org.apache.axis.MessageContext; > import org.apache.axis.components.logger.LogFactory; > import org.apache.axis.components.uuid.UUIDGen; > import org.apache.axis.components.uuid.UUIDGenFactory; > import org.apache.axis.handlers.BasicHandler; > import org.apache.axis.transport.http.HTTPConstants; > import org.apache.axis.utils.Messages; > import org.apache.commons.logging.Log; > import org.apache.commons.net.pop3.POP3Client; > import org.apache.commons.net.pop3.POP3MessageInfo; > import org.apache.commons.net.smtp.SMTPClient; > import org.apache.commons.net.smtp.SMTPReply; > > import javax.mail.Session; > import javax.mail.internet.InternetAddress; > import javax.mail.internet.MimeMessage; > import javax.mail.internet.MimePart; > import java.io.BufferedReader; > import java.io.ByteArrayInputStream; > import java.io.ByteArrayOutputStream; > import java.io.Reader; > import java.io.Writer; > import java.util.Properties; > > /** > * This is meant to be used on a SOAP Client to call a SOAP > server via SMTP/POP3 > * > * @author Davanum Srinivas ([EMAIL PROTECTED]) > */ > public class MailSender extends BasicHandler { > > protected static Log log = > LogFactory.getLog(MailSender.class.getName()); > private UUIDGen uuidGen = UUIDGenFactory.getUUIDGen(null); > > Properties prop = new Properties(); > Session session = Session.getDefaultInstance(prop, null); > > /** > * invoke creates a socket connection, sends the > request SOAP message and then > * reads the response SOAP message back from the SOAP server > * > * @param msgContext the messsage context > * > * @throws AxisFault > */ > public void invoke(MessageContext msgContext) throws AxisFault { > > if (log.isDebugEnabled()) { > log.debug(Messages.getMessage("enter00", > "MailSender::invoke")); > } > try { > // Send the SOAP request to the SMTP server > String id = writeUsingSMTP(msgContext); > > // Read SOAP response from the POP3 Server > readUsingPOP3(id, msgContext); > } catch (Exception e) { > log.debug(e); > throw AxisFault.makeFault(e); > } > if (log.isDebugEnabled()) { > log.debug(Messages.getMessage("exit00", > "HTTPDispatchHandler::invoke")); > } > } > > > /** > * Send the soap request message to the server > * > * @param msgContext message context > * > * @return id for the current message > * @throws Exception > */ > private String writeUsingSMTP(MessageContext msgContext) > throws Exception { > String id = (new java.rmi.server.UID()).toString(); > String smtpHost = > msgContext.getStrProp(MailConstants.SMTP_HOST); > > SMTPClient client = new SMTPClient(); > client.connect(smtpHost); > > // After connection attempt, you should check the > reply code to verify > // success. > System.out.print(client.getReplyString()); > int reply = client.getReplyCode(); > if (!SMTPReply.isPositiveCompletion(reply)) { > client.disconnect(); > AxisFault fault = new AxisFault("SMTP", "( SMTP > server refused connection )", null, null); > throw fault; > } > > client.login(smtpHost); > System.out.print(client.getReplyString()); > reply = client.getReplyCode(); > if (!SMTPReply.isPositiveCompletion(reply)) { > client.disconnect(); > AxisFault fault = new AxisFault("SMTP", "( SMTP > server refused connection )", null, null); > throw fault; > } > > String fromAddress = > msgContext.getStrProp(MailConstants.FROM_ADDRESS); > String toAddress = > msgContext.getStrProp(MailConstants.TO_ADDRESS); > > MimeMessage msg = new MimeMessage(session); > msg.setFrom(new InternetAddress(fromAddress)); > msg.addRecipient(MimeMessage.RecipientType.TO, new > InternetAddress(toAddress)); > > // Get SOAPAction, default to "" > String action = msgContext.useSOAPAction() > ? msgContext.getSOAPActionURI() > : ""; > > if (action == null) { > action = ""; > } > > Message reqMessage = msgContext.getRequestMessage(); > > msg.addHeader(HTTPConstants.HEADER_USER_AGENT, > Messages.getMessage("axisUserAgent")); > msg.addHeader(HTTPConstants.HEADER_SOAP_ACTION, action); > msg.setDisposition(MimePart.INLINE); > msg.setSubject(id); > > ByteArrayOutputStream out = new > ByteArrayOutputStream(8 * 1024); > reqMessage.writeTo(out); > msg.setContent(out.toString(), > reqMessage.getContentType(msgContext.getSOAPConstants())); > > ByteArrayOutputStream out2 = new > ByteArrayOutputStream(8 * 1024); > msg.writeTo(out2); > > client.setSender(fromAddress); > System.out.print(client.getReplyString()); > client.addRecipient(toAddress); > System.out.print(client.getReplyString()); > > Writer writer = client.sendMessageData(); > System.out.print(client.getReplyString()); > writer.write(out2.toString()); > writer.flush(); > writer.close(); > > System.out.print(client.getReplyString()); > if (!client.completePendingCommand()) { > System.out.print(client.getReplyString()); > AxisFault fault = new AxisFault("SMTP", "( > Failed to send email )", null, null); > throw fault; > } > System.out.print(client.getReplyString()); > client.logout(); > client.disconnect(); > return id; > } > > /** > * Read from server using POP3 > * @param msgContext > * @throws Exception > */ > private void readUsingPOP3(String id, MessageContext > msgContext) throws Exception { > // Read the response back from the server > String pop3Host = > msgContext.getStrProp(MailConstants.POP3_HOST); > String pop3User = > msgContext.getStrProp(MailConstants.POP3_USERID); > String pop3passwd = > msgContext.getStrProp(MailConstants.POP3_PASSWORD); > > Reader reader; > POP3MessageInfo[] messages = null; > > MimeMessage mimeMsg = null; > POP3Client pop3 = new POP3Client(); > // We want to timeout if a response takes longer > than 60 seconds > pop3.setDefaultTimeout(60000); > > for (int i = 0; i < 12; i++) { > pop3.connect(pop3Host); > > if (!pop3.login(pop3User, pop3passwd)) { > pop3.disconnect(); > AxisFault fault = new AxisFault("POP3", "( > Could not login to server. Check password. )", null, null); > throw fault; > } > > messages = pop3.listMessages(); > if (messages != null && messages.length > 0) { > StringBuffer buffer = null; > for (int j = 0; j < messages.length; j++) { > reader = > pop3.retrieveMessage(messages[j].number); > if (reader == null) { > AxisFault fault = new > AxisFault("POP3", "( Could not retrieve message header. )", > null, null); > throw fault; > } > > buffer = new StringBuffer(); > BufferedReader bufferedReader = new > BufferedReader(reader); > int ch; > while ((ch = bufferedReader.read()) != -1) { > buffer.append((char) ch); > } > bufferedReader.close(); > if (buffer.toString().indexOf(id) != -1) { > ByteArrayInputStream bais = new > ByteArrayInputStream(buffer.toString().getBytes()); > Properties prop = new Properties(); > Session session = > Session.getDefaultInstance(prop, null); > > mimeMsg = new MimeMessage(session, bais); > pop3.deleteMessage(messages[j].number); > break; > } > buffer = null; > } > } > pop3.logout(); > pop3.disconnect(); > if (mimeMsg == null) { > Thread.sleep(5000); > } else { > break; > } > } > > if (mimeMsg == null) { > pop3.logout(); > pop3.disconnect(); > AxisFault fault = new AxisFault("POP3", "( > Could not retrieve message list. )", null, null); > throw fault; > } > > String contentType = mimeMsg.getContentType(); > String contentLocation = mimeMsg.getContentID(); > Message outMsg = new > Message(mimeMsg.getInputStream(), false, > contentType, contentLocation); > > outMsg.setMessageType(Message.RESPONSE); > msgContext.setResponseMessage(outMsg); > if (log.isDebugEnabled()) { > log.debug("\n" + Messages.getMessage("xmlRecd00")); > > log.debug("-----------------------------------------------"); > log.debug(outMsg.getSOAPPartAsString()); > } > } > } > > > > 1.1 > xml-axis/java/src/org/apache/axis/transport/mail/MailServer.java > > Index: MailServer.java > =================================================================== > /* > * The Apache Software License, Version 1.1 > * > * > * Copyright (c) 2001 The Apache Software Foundation. All rights > * reserved. > * > * Redistribution and use in source and binary forms, with > or without > * modification, are permitted provided that the following > conditions > * are met: > * > * 1. Redistributions of source code must retain the above copyright > * notice, this list of conditions and the following disclaimer. > * > * 2. Redistributions in binary form must reproduce the > above copyright > * notice, this list of conditions and the following > disclaimer in > * the documentation and/or other materials provided with the > * distribution. > * > * 3. The end-user documentation included with the redistribution, > * if any, must include the following acknowledgment: > * "This product includes software developed by the > * Apache Software Foundation (http://www.apache.org/)." > * Alternately, this acknowledgment may appear in the > software itself, > * if and wherever such third-party acknowledgments > normally appear. > * > * 4. The names "Axis" and "Apache Software Foundation" must > * not be used to endorse or promote products derived from this > * software without prior written permission. For written > * permission, please contact [EMAIL PROTECTED] > * > * 5. Products derived from this software may not be called > "Apache", > * nor may "Apache" appear in their name, without prior written > * permission of the Apache Software Foundation. > * > * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED > * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES > * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE > * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR > * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF > * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > CAUSED AND > * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > LIABILITY, > * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > ANY WAY OUT > * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > POSSIBILITY OF > * SUCH DAMAGE. > * > ==================================================================== > * > * This software consists of voluntary contributions made by many > * individuals on behalf of the Apache Software Foundation. > For more > * information on the Apache Software Foundation, please see > * <http://www.apache.org/>. > */ > > package org.apache.axis.transport.mail; > > import org.apache.axis.components.logger.LogFactory; > import org.apache.axis.i18n.Messages; > import org.apache.axis.server.AxisServer; > import org.apache.axis.utils.Options; > import org.apache.commons.logging.Log; > import org.apache.commons.net.pop3.POP3Client; > import org.apache.commons.net.pop3.POP3MessageInfo; > > import javax.mail.Session; > import javax.mail.internet.MimeMessage; > import java.io.BufferedReader; > import java.io.ByteArrayInputStream; > import java.io.Reader; > import java.net.MalformedURLException; > import java.util.Properties; > > /** > * This is a simple implementation of an SMTP/POP3 server > for processing > * SOAP requests via Apache's xml-axis. This is not > intended for production > * use. Its intended uses are for demos, debugging, and performance > * profiling. > * > * @author Davanum Srinivas <[EMAIL PROTECTED]> > * @author Rob Jellinghaus ([EMAIL PROTECTED]) > */ > > public class MailServer implements Runnable { > protected static Log log = > LogFactory.getLog(MailServer.class.getName()); > > private String host; > private int port; > private String userid; > private String password; > > public MailServer(String host, int port, String userid, > String password) { > this.host = host; > this.port = port; > this.userid = userid; > this.password = password; > } > > // Are we doing threads? > private static boolean doThreads = true; > > public void setDoThreads(boolean value) { > doThreads = value; > } > > public boolean getDoThreads() { > return doThreads; > } > > public String getHost() { > return host; > } > > // Axis server (shared between instances) > private static AxisServer myAxisServer = null; > > protected static synchronized AxisServer getAxisServer() { > if (myAxisServer == null) { > myAxisServer = new AxisServer(); > } > return myAxisServer; > } > > // are we stopped? > // latch to true if stop() is called > private boolean stopped = false; > > /** > * Accept requests from a given TCP port and send them > through the > * Axis engine for processing. > */ > public void run() { > log.info(Messages.getMessage("start00", > "MailServer", host + ":" + port)); > > // Accept and process requests from the socket > while (!stopped) { > try { > pop3.connect(host, port); > pop3.login(userid, password); > > POP3MessageInfo[] messages = pop3.listMessages(); > if (messages != null && messages.length > 0) { > for (int i = 0; i < messages.length; i++) { > Reader reader = > pop3.retrieveMessage(messages[i].number); > if (reader == null) { > continue; > } > > StringBuffer buffer = new StringBuffer(); > BufferedReader bufferedReader = > new BufferedReader(reader); > int ch; > while ((ch = bufferedReader.read()) != -1) { > buffer.append((char) ch); > } > bufferedReader.close(); > ByteArrayInputStream bais = new > ByteArrayInputStream(buffer.toString().getBytes()); > Properties prop = new Properties(); > Session session = > Session.getDefaultInstance(prop, null); > > MimeMessage mimeMsg = new > MimeMessage(session, bais); > pop3.deleteMessage(messages[i].number); > if (mimeMsg != null) { > MailWorker worker = new > MailWorker(this, mimeMsg); > if (doThreads) { > Thread thread = new Thread(worker); > thread.setDaemon(true); > thread.start(); > } else { > worker.run(); > } > } > } > } > } catch (java.io.InterruptedIOException iie) { > } catch (Exception e) { > log.debug(Messages.getMessage("exception00"), e); > break; > } finally { > try { > pop3.logout(); > pop3.disconnect(); > Thread.sleep(3000); > } catch (Exception e) { > > log.error(Messages.getMessage("exception00"), e); > } > } > } > log.info(Messages.getMessage("quit00", "MailServer")); > } > > /** > * POP3 connection > */ > private POP3Client pop3; > > /** > * Obtain the serverSocket that that MailServer is listening on. > */ > public POP3Client getPOP3() { > return pop3; > } > > /** > * Set the serverSocket this server should listen on. > * (note : changing this will not affect a running > server, but if you > * stop() and then start() the server, the new socket > will be used). > */ > public void setPOP3(POP3Client pop3) { > this.pop3 = pop3; > } > > /** > * Start this server. > * > * Spawns a worker thread to listen for HTTP requests. > * > * @param daemon a boolean indicating if the thread > should be a daemon. > */ > public void start(boolean daemon) throws Exception { > if (doThreads) { > Thread thread = new Thread(this); > thread.setDaemon(daemon); > thread.start(); > } else { > run(); > } > } > > /** > * Start this server as a NON-daemon. > */ > public void start() throws Exception { > start(false); > } > > /** > * Stop this server. > * > * This will interrupt any pending accept(). > */ > public void stop() throws Exception { > /* > * Close the server socket cleanly, but avoid fresh > accepts while > * the socket is closing. > */ > stopped = true; > log.info(Messages.getMessage("quit00", "MailServer")); > > // Kill the JVM, which will interrupt pending > accepts even on linux. > System.exit(0); > } > > /** > * Server process. > */ > public static void main(String args[]) { > Options opts = null; > try { > opts = new Options(args); > } catch (MalformedURLException e) { > > log.error(Messages.getMessage("malformedURLException00"), e); > return; > } > > try { > doThreads = (opts.isFlagSet('t') > 0); > String host = opts.getHost(); > int port = ((opts.isFlagSet('p') > 0) ? > opts.getPort() : 110); > POP3Client pop3 = new POP3Client(); > MailServer sas = new MailServer(host, port, > opts.getUser(), opts.getPassword()); > > sas.setPOP3(pop3); > sas.start(); > } catch (Exception e) { > log.error(Messages.getMessage("exception00"), e); > return; > } > > } > } > > > > 1.1 > xml-axis/java/src/org/apache/axis/transport/mail/MailTransport.java > > Index: MailTransport.java > =================================================================== > /* > * The Apache Software License, Version 1.1 > * > * > * Copyright (c) 2001 The Apache Software Foundation. All rights > * reserved. > * > * Redistribution and use in source and binary forms, with > or without > * modification, are permitted provided that the following > conditions > * are met: > * > * 1. Redistributions of source code must retain the above copyright > * notice, this list of conditions and the following disclaimer. > * > * 2. Redistributions in binary form must reproduce the > above copyright > * notice, this list of conditions and the following > disclaimer in > * the documentation and/or other materials provided with the > * distribution. > * > * 3. The end-user documentation included with the redistribution, > * if any, must include the following acknowledgment: > * "This product includes software developed by the > * Apache Software Foundation (http://www.apache.org/)." > * Alternately, this acknowledgment may appear in the > software itself, > * if and wherever such third-party acknowledgments > normally appear. > * > * 4. The names "Axis" and "Apache Software Foundation" must > * not be used to endorse or promote products derived from this > * software without prior written permission. For written > * permission, please contact [EMAIL PROTECTED] > * > * 5. Products derived from this software may not be called > "Apache", > * nor may "Apache" appear in their name, without prior written > * permission of the Apache Software Foundation. > * > * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED > * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES > * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE > * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR > * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF > * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > CAUSED AND > * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > LIABILITY, > * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > ANY WAY OUT > * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > POSSIBILITY OF > * SUCH DAMAGE. > * > ==================================================================== > * > * This software consists of voluntary contributions made by many > * individuals on behalf of the Apache Software Foundation. > For more > * information on the Apache Software Foundation, please see > * <http://www.apache.org/>. > */ > > package org.apache.axis.transport.mail; > > import org.apache.axis.AxisEngine; > import org.apache.axis.MessageContext; > import org.apache.axis.client.Call; > import org.apache.axis.client.Transport; > > /** > * A Transport which will cause an invocation via "mail" > * > * @author Davanum Srinivas <[EMAIL PROTECTED]> > */ > public class MailTransport extends Transport { > public MailTransport() { > transportName = "mail"; > } > > /** > * Set up any transport-specific derived properties in > the message context. > * @param mc the context to set up > * @param call the Call object > * @param engine the engine containing the registries > */ > public void setupMessageContextImpl(MessageContext mc, > Call call, > AxisEngine engine) { > } > } > > > > > 1.1 > xml-axis/java/src/org/apache/axis/transport/mail/MailWorker.java > > Index: MailWorker.java > =================================================================== > /* > * The Apache Software License, Version 1.1 > * > * > * Copyright (c) 2001 The Apache Software Foundation. All rights > * reserved. > * > * Redistribution and use in source and binary forms, with > or without > * modification, are permitted provided that the following > conditions > * are met: > * > * 1. Redistributions of source code must retain the above copyright > * notice, this list of conditions and the following disclaimer. > * > * 2. Redistributions in binary form must reproduce the > above copyright > * notice, this list of conditions and the following > disclaimer in > * the documentation and/or other materials provided with the > * distribution. > * > * 3. The end-user documentation included with the redistribution, > * if any, must include the following acknowledgment: > * "This product includes software developed by the > * Apache Software Foundation (http://www.apache.org/)." > * Alternately, this acknowledgment may appear in the > software itself, > * if and wherever such third-party acknowledgments > normally appear. > * > * 4. The names "Axis" and "Apache Software Foundation" must > * not be used to endorse or promote products derived from this > * software without prior written permission. For written > * permission, please contact [EMAIL PROTECTED] > * > * 5. Products derived from this software may not be called > "Apache", > * nor may "Apache" appear in their name, without prior written > * permission of the Apache Software Foundation. > * > * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED > * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES > * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE > * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR > * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF > * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > CAUSED AND > * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > LIABILITY, > * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > ANY WAY OUT > * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > POSSIBILITY OF > * SUCH DAMAGE. > * > ==================================================================== > * > * This software consists of voluntary contributions made by many > * individuals on behalf of the Apache Software Foundation. > For more > * information on the Apache Software Foundation, please see > * <http://www.apache.org/>. > */ > > package org.apache.axis.transport.mail; > > import org.apache.axis.AxisFault; > import org.apache.axis.Constants; > import org.apache.axis.Message; > import org.apache.axis.MessageContext; > import org.apache.axis.components.logger.LogFactory; > import org.apache.axis.message.SOAPEnvelope; > import org.apache.axis.message.SOAPFault; > import org.apache.axis.server.AxisServer; > import org.apache.axis.transport.http.HTTPConstants; > import org.apache.axis.utils.Messages; > import org.apache.commons.logging.Log; > import org.apache.commons.net.smtp.SMTPClient; > import org.apache.commons.net.smtp.SMTPReply; > > import javax.mail.Session; > import javax.mail.internet.InternetAddress; > import javax.mail.internet.MimeMessage; > import javax.mail.internet.MimePart; > import java.io.ByteArrayOutputStream; > import java.io.Writer; > import java.util.Properties; > > > public class MailWorker implements Runnable { > protected static Log log = > LogFactory.getLog(MailWorker.class.getName()); > > // Server > private MailServer server; > > // Current message > private MimeMessage mimeMessage; > > // Axis specific constants > private static String transportName = "Mail"; > > private Properties prop = new Properties(); > private Session session = > Session.getDefaultInstance(prop, null); > > /** > * Constructor for MailWorker > * @param server > * @param mimeMessage > */ > public MailWorker(MailServer server, MimeMessage mimeMessage) { > this.server = server; > this.mimeMessage = mimeMessage; > } > > /** > * The main workhorse method. > */ > public void run() { > // create an Axis server > AxisServer engine = server.getAxisServer(); > > // create and initialize a message context > MessageContext msgContext = new MessageContext(engine); > Message requestMsg; > > // buffers for the headers we care about > StringBuffer soapAction = new StringBuffer(); > StringBuffer fileName = new StringBuffer(); > StringBuffer contentType = new StringBuffer(); > StringBuffer contentLocation = new StringBuffer(); > > Message responseMsg = null; > > // prepare request (do as much as possible while > waiting for the > // next connection). > try { > msgContext.setTargetService(null); > } catch (AxisFault fault) { > } > msgContext.setResponseMessage(null); > msgContext.reset(); > msgContext.setTransportName(transportName); > > responseMsg = null; > > try { > try { > // parse all headers into hashtable > parseHeaders(mimeMessage, contentType, > contentLocation, soapAction); > > // Real and relative paths are the same for the > // MailServer > msgContext.setProperty(Constants.MC_REALPATH, > fileName.toString()); > msgContext.setProperty(Constants.MC_RELATIVE_PATH, > fileName.toString()); > msgContext.setProperty(Constants.MC_JWS_CLASSDIR, > "jwsClasses"); > > // this may be "" if either SOAPAction: "" > or if no SOAPAction at all. > // for now, do not complain if no SOAPAction at all > String soapActionString = soapAction.toString(); > if (soapActionString != null) { > msgContext.setUseSOAPAction(true); > msgContext.setSOAPActionURI(soapActionString); > } > requestMsg = new > Message(mimeMessage.getInputStream(), false, > contentType.toString(), > contentLocation.toString()); > msgContext.setRequestMessage(requestMsg); > > // invoke the Axis engine > engine.invoke(msgContext); > > // Retrieve the response from Axis > responseMsg = msgContext.getResponseMessage(); > if (responseMsg == null) { > throw new > AxisFault(Messages.getMessage("nullResponse00")); > } > } catch (Exception e) { > e.printStackTrace(); > AxisFault af; > if (e instanceof AxisFault) { > af = (AxisFault) e; > > log.debug(Messages.getMessage("serverFault00"), af); > } else { > af = AxisFault.makeFault(e); > } > > // There may be headers we want to preserve in the > // response message - so if it's there, just add the > // FaultElement to it. Otherwise, make a new one. > responseMsg = msgContext.getResponseMessage(); > if (responseMsg == null) { > responseMsg = new Message(af); > } else { > try { > SOAPEnvelope env = > responseMsg.getSOAPEnvelope(); > env.clearBody(); > env.addBodyElement(new > SOAPFault((AxisFault) e)); > } catch (AxisFault fault) { > // Should never reach here! > } > } > } > > String replyTo = ((InternetAddress) > mimeMessage.getReplyTo()[0]).getAddress(); > String sendFrom = ((InternetAddress) > mimeMessage.getAllRecipients()[0]).getAddress(); > String subject = "Re: " + mimeMessage.getSubject(); > writeUsingSMTP(msgContext, server.getHost(), > sendFrom, replyTo, subject, responseMsg); > } catch (Exception e) { > e.printStackTrace(); > log.debug(Messages.getMessage("exception00"), e); > } > if > (msgContext.getProperty(msgContext.QUIT_REQUESTED) != null) { > // why then, quit! > try { > server.stop(); > } catch (Exception e) { > } > } > > } > > /** > * Send the soap request message to the server > * > * @param msgContext > * @param smtpHost > * @param sendFrom > * @param replyTo > * @param output > * @throws Exception > */ > private void writeUsingSMTP(MessageContext msgContext, > String smtpHost, > String sendFrom, > String replyTo, > String subject, > Message output) > throws Exception { > SMTPClient client = new SMTPClient(); > client.connect(smtpHost); > > // After connection attempt, you should check the > reply code to verify > // success. > System.out.print(client.getReplyString()); > int reply = client.getReplyCode(); > if (!SMTPReply.isPositiveCompletion(reply)) { > client.disconnect(); > AxisFault fault = new AxisFault("SMTP", "( SMTP > server refused connection )", null, null); > throw fault; > } > > client.login(smtpHost); > System.out.print(client.getReplyString()); > reply = client.getReplyCode(); > if (!SMTPReply.isPositiveCompletion(reply)) { > client.disconnect(); > AxisFault fault = new AxisFault("SMTP", "( SMTP > server refused connection )", null, null); > throw fault; > } > > MimeMessage msg = new MimeMessage(session); > msg.setFrom(new InternetAddress(sendFrom)); > msg.addRecipient(MimeMessage.RecipientType.TO, new > InternetAddress(replyTo)); > msg.setDisposition(MimePart.INLINE); > msg.setSubject(subject); > > ByteArrayOutputStream out = new > ByteArrayOutputStream(8 * 1024); > output.writeTo(out); > msg.setContent(out.toString(), > output.getContentType(msgContext.getSOAPConstants())); > > ByteArrayOutputStream out2 = new > ByteArrayOutputStream(8 * 1024); > msg.writeTo(out2); > > client.setSender(sendFrom); > System.out.print(client.getReplyString()); > client.addRecipient(replyTo); > System.out.print(client.getReplyString()); > > Writer writer = client.sendMessageData(); > System.out.print(client.getReplyString()); > writer.write(out2.toString()); > writer.flush(); > writer.close(); > > System.out.print(client.getReplyString()); > if (!client.completePendingCommand()) { > System.out.print(client.getReplyString()); > AxisFault fault = new AxisFault("SMTP", "( > Failed to send email )", null, null); > throw fault; > } > System.out.print(client.getReplyString()); > client.logout(); > client.disconnect(); > } > > /** > * Read all mime headers, returning the value of > Content-Length and > * SOAPAction. > * @param mimeMessage InputStream to read from > * @param contentType The content type. > * @param contentLocation The content location > * @param soapAction StringBuffer to return the soapAction into > */ > private void parseHeaders(MimeMessage mimeMessage, > StringBuffer contentType, > StringBuffer contentLocation, > StringBuffer soapAction) > throws Exception { > contentType.append(mimeMessage.getContentType()); > contentLocation.append(mimeMessage.getContentID()); > String values[] = > mimeMessage.getHeader(HTTPConstants.HEADER_SOAP_ACTION); > if (values != null) > soapAction.append(values[0]); > } > } > > > > 1.35 +10 -0 > xml-axis/java/src/org/apache/axis/utils/Options.java > > Index: Options.java > =================================================================== > RCS file: > /home/cvs/xml-axis/java/src/org/apache/axis/utils/Options.java,v > retrieving revision 1.34 > retrieving revision 1.35 > diff -u -r1.34 -r1.35 > --- Options.java 18 Sep 2002 16:10:41 -0000 1.34 > +++ Options.java 13 Dec 2002 20:46:08 -0000 1.35 > @@ -308,6 +308,16 @@ > return( tmp ); > } > > + public String getHost() { > + try { > + URL url = new URL(getURL()); > + return( url.getHost() ); > + } > + catch( Exception exp ) { > + return( "localhost" ); > + } > + } > + > public int getPort() { > try { > URL url = new URL(getURL()); > > > > 1.34 +1 -0 xml-axis/java/xmls/properties.xml > > Index: properties.xml > =================================================================== > RCS file: /home/cvs/xml-axis/java/xmls/properties.xml,v > retrieving revision 1.33 > retrieving revision 1.34 > diff -u -r1.33 -r1.34 > --- properties.xml 3 Dec 2002 15:42:54 -0000 1.33 > +++ properties.xml 13 Dec 2002 20:46:08 -0000 1.34 > @@ -43,6 +43,7 @@ > <property name="commons-logging.jar" > location="${lib.dir}/commons-logging.jar"/> > <property name="commons-discovery.jar" > location="${lib.dir}/commons-discovery.jar"/> > <property name="commons-httpclient.jar" > location="${lib.dir}/commons-httpclient.jar"/> > +<property name="commons-net.jar" > location="${lib.dir}/commons-net-1.0.0-dev.jar"/> > <property name="log4j-core.jar" > location="${lib.dir}/log4j-1.2.4.jar"/> > <property name="junit.jar" location="${lib.dir}/junit.jar"/> > <property name="jimi.jar" > location="${lib.dir}/JimiProClasses.zip"/> > > > > 1.51 +4 -0 xml-axis/java/xmls/targets.xml > > Index: targets.xml > =================================================================== > RCS file: /home/cvs/xml-axis/java/xmls/targets.xml,v > retrieving revision 1.50 > retrieving revision 1.51 > diff -u -r1.50 -r1.51 > --- targets.xml 6 Dec 2002 18:21:41 -0000 1.50 > +++ targets.xml 13 Dec 2002 20:46:08 -0000 1.51 > @@ -95,6 +95,10 @@ > classname="org.apache.commons.httpclient.HttpConnection" > classpathref="classpath"/> > > + <available property="commons-net.present" > + classname="org.apache.commons.net.smtp.SMTPClient" > + classpathref="classpath"/> > + > <available property="log4j.present" > classname="org.apache.log4j.Category" > classpathref="classpath"/> > > > >