JavaMail sending problem and solution  
Author Message
bobbymartin





PostPosted: 2004-5-20 3:16:00 Top

java-programmer, JavaMail sending problem and solution I had chronic problems with sending email via smtp. I could sign in
via a mail client and send to a remote user just fine, but JavaMail
refused to send to any but local users, citing a 550 relaying problem.
All of the references I could find on the web told me to talk to my
mail admin, but I'm he and I also knew that if my mail client could do
it, so could I.

This solution requires that you log into the mail server as a normal
email user - you will have to create an (or use an existing) account.
You turn on smtp authorization by setting the a property you pass in
to get a session: the property is mail.smtp.auth and you set it to
"true". Then you create an Authenticator that returns a
PasswordAuthentication with your username and password in it.

Here's an excerpt of working code:

Authenticator authenticator = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(FROM, PASSWORD);
}
};

Session mailSession = Session.getInstance(getMailProperties(),
authenticator);

Message email = new MimeMessage(mailSession);
try {
email.setFrom(new InternetAddress(FROM));
email.setSentDate(new Date());

email.setRecipients(Message.RecipientType.TO,
stringsToInternetAddresses(to));
email.setRecipients(Message.RecipientType.CC,
stringsToInternetAddresses(cc));
email.setRecipients(Message.RecipientType.BCC,
stringsToInternetAddresses(bcc));
email.setSubject(subject);
email.setText(body);

Transport.send(email);
retval = true;
} catch (Exception e) {
}

My getMailProperties includes the following:
mail.smtp.host=some.mail.host.com
mail.smtp.auth=true

I just post this here for posterity so maybe someone else doesn't go
through the hell I did to figure this out :)
 
GaryM





PostPosted: 2004-5-20 19:27:00 Top

java-programmer >> JavaMail sending problem and solution email***@***.com (Bobby Martin) wrote in
news:email***@***.com:

> I just post this here for posterity so maybe someone else doesn't go
> through the hell I did to figure this out :)
>

Bobby, I am curious why Transport.connect(host, user, password) did not
work for you?

Gary
 
Roedy Green





PostPosted: 2004-5-21 0:19:00 Top

java-programmer >> JavaMail sending problem and solution On 19 May 2004 12:16:09 -0700, email***@***.com (Bobby Martin)
wrote or quoted :

>My getMailProperties includes the following:
>mail.smtp.host=some.mail.host.com
>mail.smtp.auth=true
>
>I just post this here for posterity so maybe someone else doesn't go
>through the hell I did to figure this out

That technique is astoundingly general. You just set up your
authenticator and Java deals with any challenges of any sort ever
after. It is feels almost magic the first time you use it. I used it
in the Replicator to deal with protected HTTP documents.
see http://mindprod.com/jgloss/authentication.html

However, I did not use it in my bulk emailer program. I just used the
more conventional:

Properties props = System.getProperties();
if ( CustConfig.needPasswordToSend )
{
props.setProperty ( "mail.smtp.auth", "true" );
}
// Get a Session object
session = Session.getDefaultInstance( props, null );

...

Transport transport = session.getTransport( sendProtocol );
transport.connect( sendHost, sendPort, sendLoginID, sendPassword );


--
Canadian Mind Products, Roedy Green.
Coaching, problem solving, economical contract programming.
See http://mindprod.com/jgloss/jgloss.html for The Java Glossary.
 
 
bobbymartin





PostPosted: 2004-5-21 9:55:00 Top

java-programmer >> JavaMail sending problem and solution GaryM <email***@***.com> wrote in message news:<email***@***.com>...
> email***@***.com (Bobby Martin) wrote in
> news:email***@***.com:
[SNIP]
> Bobby, I am curious why Transport.connect(host, user, password) did not
> work for you?
>
> Gary

I ran my smtp connection through an echoing tunnel I built for just
such occasions. Even using Transport.connect, JavaMail did not send
AUTH LOGIN to the server followed by an encrypted username and
password, while Outlook did. When I turned on mail.smtp.auth and
added an Authenticator, JavaMail did send the AUTH LOGIN.

I can't tell you why it behaves that way - it surprised me very much
that Transport.connect seemed took a user & password but didn't use
them in any way. But I can tell you from experience that, at least
for me, it does behave that way.

Bobby
 
 
bobbymartin





PostPosted: 2004-5-21 9:58:00 Top

java-programmer >> JavaMail sending problem and solution Roedy Green <email***@***.com> wrote in message news:<email***@***.com>...
> On 19 May 2004 12:16:09 -0700, email***@***.com (Bobby Martin)
> wrote or quoted :
[SNIP]
>
> Properties props = System.getProperties();
> if ( CustConfig.needPasswordToSend )
> {
> props.setProperty ( "mail.smtp.auth", "true" );
> }
> // Get a Session object
> session = Session.getDefaultInstance( props, null );
>
> ...
>
> Transport transport = session.getTransport( sendProtocol );
> transport.connect( sendHost, sendPort, sendLoginID, sendPassword );

Hmm, I should have read both replies before I responded to the first
one :) I'm not entirely sure that I tried turning on mail.smtp.auth,
using Transport.connect, and not using an Authenticator. It's
possible that would have worked for me. Something for me to
experiment with :)

Thanks for the insight!
Bobby