user3014711
user3014711

Reputation: 11

Ant with JavaMail: authentication required

I'm trying to start ant from .bat-file like this:

java -classpath "<ant_lib_jars>" org.apache.tools.ant.launch.Launcher <ant_command_line_args>

Ant was added to project with all additional libraries (including JavaMail jars). After start batch script will collect all necessary jars and create string for classpath (<ant_lib_jars>). All command line arguments will be passed to Launcher class "as is".

This approach correctly works for all targets in my build file except target which use mail task. This target looks like this:

<target name="testtarget">
    <mail
            ssl="true"
            mailhost="smtp.gmail.com"
            mailport="465"
            user="<gmail_user>"
            password="<gmail_password>"
            subject="Subject"
            >
        <from address="<gmail_address>"/>
        <to address="<recipient_address>"/>
        <message src="<message_file>"/>
    </mail>
</target>

When i start ant -v testtarget from command line, i get this error:

BUILD FAILED
....
Problem while sending mime mail:
        at org.apache.tools.ant.taskdefs.email.MimeMailer.send(MimeMailer.java:261)
        at org.apache.tools.ant.taskdefs.email.EmailTask.execute(EmailTask.java:574)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.Target.execute(Target.java:435)
        at org.apache.tools.ant.Target.performTasks(Target.java:456)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
        at org.apache.tools.ant.Main.runBuild(Main.java:851)
        at org.apache.tools.ant.Main.startAnt(Main.java:235)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Caused by: com.sun.mail.smtp.SMTPSendFailedException: 530-5.5.1 Authentication Required. Learn more at
530 5.5.1 http://support.google.com/mail/bin/answer.py?answer=14257 m5sm23576192laj.4 - gsmtp
        at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)
        at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)
        at org.apache.tools.ant.taskdefs.email.MimeMailer.send(MimeMailer.java:258)
        ... 18 more

The same error occures if ant can't find mail.jar (from JavaMail) in classpath. So i tried to specify "-lib" flag with path to mail.jar and it doesn't work.

Attempt to start this target with the same ant but not through .bat-file was finished successful - email letter was sent:

<full_path_to_project_ant>/bin/ant -lib ant/lib/mail.jar testtarget

Setting up ignoreInvalidRecipients attribute with true value ends up with another error:

BUILD FAILED
....
Couldn't reach any recipient
        at org.apache.tools.ant.taskdefs.email.MimeMailer.send(MimeMailer.java:264)
        at org.apache.tools.ant.taskdefs.email.EmailTask.execute(EmailTask.java:574)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.Target.execute(Target.java:435)
        at org.apache.tools.ant.Target.performTasks(Target.java:456)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
        at org.apache.tools.ant.Main.runBuild(Main.java:851)
        at org.apache.tools.ant.Main.startAnt(Main.java:235)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Caused by: com.sun.mail.smtp.SMTPSendFailedException: 530-5.5.1 Authentication Required. Learn more at
530 5.5.1 http://support.google.com/mail/bin/answer.py?answer=14257 go4sm23006946lbc.3 - gsmtp
        at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)
        at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)
        at org.apache.tools.ant.taskdefs.email.MimeMailer.send(MimeMailer.java:258)
        ... 18 more

Recipient address is absolutely correct that is confirmed by starting target not through .bat-file with the same credentials.

I tried to rebuild ant-launcher.jar from ant sources with additional logging and found that mail.jar falls into ant classpath. SendFailedException rises on sending message using SMTPS.

What am i doing wrong?

Upvotes: 0

Views: 1389

Answers (2)

user3014711
user3014711

Reputation: 11

Ok, i've got it. The reason of such unobvious behaviour was in the ant classloading model. My email.jar (from JavaMail) file lie in ANT_HOME/lib directory and in those directory was file mail-1.4.jar (which was downloaded after starting fetch.xml build file, it's needed to download all libraries for optional tasks). This jar file is something like stub and doesn't support all mail features. In this case, i suppose, ant core classloader will find needed classes in mail-1.4.jar. So i removed this file and now my target works correctly.

Upvotes: 1

Bill Shannon
Bill Shannon

Reputation: 29971

If it works in some environments and not others, then there must be something different about the configurations. Maybe you're using a different JavaMail jar file in one environment?

Upvotes: 0

Related Questions