JavaMail sending problem and solution

B

Bobby Martin

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 :)
 
G

GaryM

(e-mail address removed) (Bobby Martin) wrote in
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
 
R

Roedy Green

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

Bobby Martin

GaryM said:
(e-mail address removed) (Bobby Martin) wrote in
news:[email protected]: [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
 
B

Bobby Martin

Roedy Green said:
On 19 May 2004 12:16:09 -0700, (e-mail address removed) (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
 

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

Similar Threads


Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top