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

R

rexdtripod

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("(e-mail address removed)",
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());
}
 
R

rexdtripod

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.
 
R

rexdtripod

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>-->
 
M

Martin Gregorie

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.
 
R

rexdtripod

Martin said:
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?

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?
 
S

Simon Brooke

in message <[email protected]>,
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?

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.
 
N

Nigel Wade

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);

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?
 
M

Martin Gregorie

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,820
Messages
2,569,722
Members
45,510
Latest member
ThaliaMaxi

Latest Threads

Top