Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / December 2006

Tip: Looking for answers? Try searching our database.

javamail code in servlet works locally, but not when uploaded to host

Thread view: 
rexdtripod@hotmail.com - 27 Nov 2006 19:25 GMT
Trying to send an email with an xml attachment from a servlet (code
below) without success.

When I run my servlet locally all goes fine.  The message is delivered.
When I upload to my host, messages are not delivered.  I believe the
servlet runs fine because result data makes it back to my browser and
no exceptions are reported.

I've read that spam blockers will flag messages not really from the
server from which they claim to be.  All is good here.  The from is a
real account on my host's email server.

My host runs SpamAssassin.  The message isn't delivered even when this
is disabled.

Any thoughts on this would be greatly appreciated.

Thanks

// build a string from an XML document
     org.jdom.output.Format attachmentFmt =
org.jdom.output.Format.getCompactFormat();
     attachmentFmt.setOmitDeclaration(false);
     XMLOutputter attachmentOutputter = new
XMLOutputter(attachmentFmt);

     String attachXml =
attachmentOutputter.outputString(attachmentDoc);

     // We now have an xml string to attach.  Let's get a javamail
message together
     // to which we can attach this xml.  Got to do some server
properties stuff
     // first before we get to the message contents.
     String sServerName = "xxxx.xxxxxxx.com";
     String sUserName = "xxxxxx";
     String sPassword = "*******";

     Properties props = new Properties();
     props = System.getProperties();

     // fill props with any information
     props.put("mail.host", sServerName);
     props.put("mail.smtp.port", "25");
     props.put("mail.smtp.auth", "true");

     Session sess = Session.getDefaultInstance(props, null);
     MimeMessage message = new MimeMessage(sess);

     Transport transport = null;
     try {
       // String containing the contents of the message
       String sContent = "Test message."

       // Set the email message content to our name and address data
above
       message.setContent(sContent, "text/plain");

       // Hook up the message address and subject settings
       String sLNameFirst = sLastName +", " + sFirstName;
       String sFNameLast = sFirstName +" " + sLastName;

       Address fromAddress = new InternetAddress("xxxx@xxxx.com",
sLNameFirst);
       Address toAddress = new InternetAddress(sEmail, sLastName);

       message.setFrom(fromAddress);
       message.addRecipient(Message.RecipientType.TO, toAddress);
       message.setSubject("New auto quote attached for " +
sFNameLast);

       // Make a multipart message (part two being attachment) and
send
       // Create part one - the message
       BodyPart messageBodyPart = new MimeBodyPart();

       // Fill the message with our content string
       messageBodyPart.setText(sContent);

       // Add the message part to a multipart
       Multipart multipart = new MimeMultipart();
       multipart.addBodyPart(messageBodyPart);

       // Create part two - the attachment
       String sXMLAttachFileName = "autoquote_" + sLastName + "_" +
sFirstName;
       messageBodyPart = new MimeBodyPart();
       messageBodyPart.setText(attachXml);
       messageBodyPart.setFileName(sXMLAttachFileName);

       // Add attachment to the multipart
       multipart.addBodyPart(messageBodyPart);

       // Put parts in message
       message.setContent(multipart);

       // Send the message
       transport.connect(sServerName, sUserName, sPassword);
       transport.send(message);
       //Transport.send(message);

     }
     catch (MessagingException me){
       StringWriter sw = new StringWriter();
       me.printStackTrace (new PrintWriter(sw));
       pw.println(sw.toString());
     }
rexdtripod@hotmail.com - 28 Nov 2006 23:19 GMT
Wow, really dead in the water on this.  Anybody out there using
javamail reliably on a web server?  I've used it successfully
clientside.  Have yet to see it send a message serverside.  Seems like
there must be some kind of permissions issues on web servers that
restrict javamail.  Is this just something people don't want happening
on web servers?

Is there some way to debug this situation?  I keep reading about
sess.setDebug(true) but I'm unable to get the output back to the
browser to view.  No exceptions are reported to me.  Message doesn't
send and I get what appears to be a proper response back to my browser.

> Trying to send an email with an xml attachment from a servlet (code
> below) without success.
[quoted text clipped - 103 lines]
>         pw.println(sw.toString());
>       }
rexdtripod@hotmail.com - 04 Dec 2006 21:07 GMT
Hmmm...  Nobody wants to come to the party...  Guess I'll keep my own
thread going in case anyone else out there ever has the problem...

Here are the vitals on my local sandbox environment:

Servlet Container Apache tomcat-5.0.24
Java 1.4.2._04-b05
JavaMail 1.4
JavaBeans(tm)Activation Framework 1.1

The following source creates an email message and attachment and sends
via javamail.  All works well in my local sandbox environment.  Mail
message with attachment arrive without a hitch.

I've been working with my host on why deploying this produces no error
messages, but no mail message either.  They are perplexed.  They have
linux servers running Resin.  Does anyone out there see any
incompatibility here?

<!--<?xml version="1.0"?>-->
<%@ page import="java.util.*" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.io.*" %>
<%@ page import="org.jdom.*" %>
<%@ page import="org.jdom.output.*" %>
<%@ page import="java.text.*" %>
<%@ page import="java.util.Properties" %>
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>
<%@ page import="javax.activation.*" %>
<!--<response>-->
<%
            //Set up some error logging
     File file = new File("./error.txt");
     FileWriter f = new FileWriter(file);
     // Wrap the filewriter with a bufferedwriter (creates an output
stream)
     BufferedWriter b = new BufferedWriter (f);
     //Wrap the buffered writer in a printwriter
     PrintWriter pw = new PrintWriter (b,false);

     //Build an xml document to attach to the email
     Document attachmentDoc = new Document(new Element("NJPA"));
     Element attachmentRoot = attachmentDoc.getRootElement();

     // build a string from an XML document
     org.jdom.output.Format attachmentFmt =
org.jdom.output.Format.getCompactFormat();
     attachmentFmt.setOmitDeclaration(false);
     XMLOutputter attachmentOutputter = new
XMLOutputter(attachmentFmt);

     String attachXml =
attachmentOutputter.outputString(attachmentDoc);

     // We now have an xml string to attach.  Let's get a javamail
message together
     // to which we can attach this xml.  Got to do some server
properties stuff
     // first before we get to the message contents.
     String sServerName = "xxxxxxxxxxxxxxxxx";//Omitted here
     String sUserName = "xxxxxxx";
     String sPassword = "xxxxxxx";

     Properties props = new Properties();
     props = System.getProperties();

     // fill props with any information
     props.put("mail.host", sServerName);
     props.put("mail.smtp.port", "25");
     props.put("mail.smtp.auth", "true");

     Session sess = Session.getDefaultInstance(props, null);
     sess.setDebug(true);
     MimeMessage message = new MimeMessage(sess);

     Transport transport = null;
     try {

       String sContent = "Test message";

       // Set the email message content to our name and address data
above
       message.setContent(sContent, "text/plain");

       // Hook up the message address and subject settings
       String sLNameFirst = "Dude";
       String sFNameLast = "Some";

       InternetAddress fromAddress = new
InternetAddress("xxxxxxxx.com", sLNameFirst);
       InternetAddress toAddress = new InternetAddress("xxxxxx.com",
sLastName);
       InternetAddress ainternetaddress[] = { toAddress };

       message.setFrom(fromAddress);
       message.addRecipient(Message.RecipientType.TO, toAddress);
       message.setSubject("New message attached for " + sFNameLast);

       // Make a multipart message (part two being attachment) and
send
       // Create part one - the message
       BodyPart messageBodyPart = new MimeBodyPart();

       // Fill the message with our content string
       messageBodyPart.setText(sContent);

       // Add the message part to a multipart
       Multipart multipart = new MimeMultipart();
       multipart.addBodyPart(messageBodyPart);

       // Create part two - the attachment
       String sXMLAttachFileName = "data_" + sFNameLast;
       messageBodyPart = new MimeBodyPart();
       messageBodyPart.setText(attachXml);
       messageBodyPart.setFileName(sXMLAttachFileName);
       //DataSource source = new FileDataSource(filename);
       //messageBodyPart.setDataHandler(new DataHandler(source));
       //messageBodyPart.setFileName(filename);

       // Add attachment to the multipart
       multipart.addBodyPart(messageBodyPart);

       // Put parts in messa
       message.setContent(multipart);

       // Send the message
       //System.out.println("Transport: " + transport);
       //System.out.println(sServerName + " " + sUserName + " " +
sPassword);
       transport = sess.getTransport("smtp");
       transport.connect(sServerName, sUserName, sPassword);
       message.saveChanges();
       transport.sendMessage(message, message.getAllRecipients());
       //Transport.send(message);

     }
     catch (Exception ex){
       StringWriter sw = new StringWriter();
       ex.printStackTrace (new PrintWriter(sw));
       pw.println(sw.toString());
     }
     finally
     {
         try
         {
             transport.close();
         }
         catch (Exception ex){
           StringWriter sw = new StringWriter();
           ex.printStackTrace (new PrintWriter(sw));
           pw.println(sw.toString());
         }
         finally {     }
     }

     //Send quote output back to the browser
     Document doc = new Document(new Element("eionjmcquote"));
     Element root = doc.getRootElement();

     // build a string from an XML document
     org.jdom.output.Format fmt =
org.jdom.output.Format.getCompactFormat();
     fmt.setOmitDeclaration(true);
     XMLOutputter outputter = new XMLOutputter(fmt);

     String xml = outputter.outputString(doc);

     out.print(xml);
     pw.print(xml);

%>
<!--</response>-->

> Wow, really dead in the water on this.  Anybody out there using
> javamail reliably on a web server?  I've used it successfully
[quoted text clipped - 115 lines]
> >         pw.println(sw.toString());
> >       }
Martin Gregorie - 05 Dec 2006 12:47 GMT
> Hmmm...  Nobody wants to come to the party...  Guess I'll keep my own
> thread going in case anyone else out there ever has the problem...

It is difficult to know whats going wrong because your code never
outputs the message text from an exception.

As you seem to have the SMTP server address and passwords, etc hardcoded
in the servlet, how do you know that they are valid in the deployment
environment?

Try running it in your test harness on the target machine.

Signature

martin@   | Martin Gregorie
gregorie. | Essex, UK
org       |

rexdtripod@hotmail.com - 05 Dec 2006 18:03 GMT
> > Hmmm...  Nobody wants to come to the party...  Guess I'll keep my own
> > thread going in case anyone else out there ever has the problem...
[quoted text clipped - 5 lines]
> in the servlet, how do you know that they are valid in the deployment
> environment?

Good question.  I've taken the word of the service provider
(lunarpages) to date.  They have indicated to me that my authentication
information is indeed what they have in their records.  I'm not sure
how I would determine otherwise.  Is there a way I could determine
this?

Would seem odd to me to have authentication information that is valid
for me from some locations, but not in the actual deployment
environment.  Is that the sort of thing a service provider would do?

The host continues to have me tinker with server authentication info in
my script.  Had me try the name of the machine explicitly with my
username and password.  That worked from my sandbox, but not once
deployed.  Had me try "localhost" with authentication disabled.  That
didn't work.  Had me try the machine name with authentication disabled.
That worked from my location, but once again, not from the deployment
environment.

Does this sound like some sort of additional security measure or
something?

> Try running it in your test harness on the target machine.

Not sure what you mean by this.  I'm guessing what you mean by "test
harness" is my local sandbox environment?

Servlet Container Apache tomcat-5.0.24
Java 1.4.2._04-b05
JavaMail 1.4
JavaBeans(tm)Activation Framework 1.1

I'm in a shared server environment with my host.  I'm not at liberty to
modify their machines.  I'm under the impression that the only thing I
can do is deploy to what they have and hope that they have been
diligent in setting up their deployment framework.  Am I missing
something here?

> --
> martin@   | Martin Gregorie
> gregorie. | Essex, UK
> org       |
Martin Gregorie - 06 Dec 2006 19:26 GMT
> Not sure what you mean by this.  I'm guessing what you mean by "test
> harness" is my local sandbox environment?

Correct.

Have you tried turning debugging on with your code? That should point
pretty unambiguously to where its going wrong.

Signature

martin@   | Martin Gregorie
gregorie. | Essex, UK
org       |

Simon Brooke - 05 Dec 2006 20:18 GMT
> Hmmm...  Nobody wants to come to the party...  Guess I'll keep my own
> thread going in case anyone else out there ever has the problem...
[quoted text clipped - 14 lines]
> linux servers running Resin.  Does anyone out there see any
> incompatibility here?

I have servlets sending mail in a Linux environment, utterly reliably; the
oldest Servlet application I have which does this is has now been running
for six years.

So there's nothing in principle which stops Servlets in a Linux environment
My code isn't like yours - it's fundamentally plain old-fashioned
Servlets - but the stack I'm using is similar (I'm using IBM Java 5 with
Tomcat 4, but the JavaMail and JAF versions are the same as yours).

If you continue to have problems, feel free to get in touch.

Signature

simon@jasmine.org.uk (Simon Brooke) http://www.jasmine.org.uk/~simon/

                                       ;; my other religion is Emacs

Nigel Wade - 06 Dec 2006 11:38 GMT
> Hmmm...  Nobody wants to come to the party...  Guess I'll keep my own
> thread going in case anyone else out there ever has the problem...
[quoted text clipped - 36 lines]
>       //Wrap the buffered writer in a printwriter
>       PrintWriter pw = new PrintWriter (b,false);

Have you verified that this operation works on your deployment server? Where
is ./error.txt created, does the servlet have permission to create it? If this
fails you won't know whether there were any exceptions as your exception
reporting requires this step to work. This is wrapped around a BufferedWriter,
and I don't see any flush after writing to it, maybe the error is still in the
buffer? How do you view the contents of this file?

I would test this by generating some trace output to pw and verifying that I
could read it.

It is possible that your ISP is blocking access to their SMTP server from your
deployment server, but they ought to know their own acceptance rules...
Does your deployment server allow outgoing connections on port 25, it may be
firewalled?

Signature

Nigel Wade, System Administrator, Space Plasma Physics Group,
           University of Leicester, Leicester, LE1 7RH, UK
E-mail :    nmw@ion.le.ac.uk
Phone :     +44 (0)116 2523548, Fax : +44 (0)116 2523555



Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.