From 2bbb06868a89e9390959ec3dd4b3b8eca8a40b95 Mon Sep 17 00:00:00 2001
From: Antoine Levy-Lambert
Date: Wed, 28 May 2003 20:58:03 +0000
Subject: [PATCH] Support for SMTP over TLS/SSL in the mail task PR: 19180
git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274636 13f79535-47bb-0310-9956-ffa450edef68
---
WHATSNEW | 3 +++
docs/manual/CoreTasks/mail.html | 8 +++++++-
docs/manual/listeners.html | 7 +++++++
.../testcases/taskdefs/{ => email}/mail.xml | 9 +++++++++
.../apache/tools/ant/listener/MailLogger.java | 14 ++++++++-----
.../tools/ant/taskdefs/email/EmailTask.java | 20 +++++++++++++++++--
.../tools/ant/taskdefs/email/Mailer.java | 13 ++++++++++++
.../tools/ant/taskdefs/email/MimeMailer.java | 15 +++++++++++++-
.../taskdefs/{ => email}/EmailTaskTest.java | 12 ++++++-----
9 files changed, 87 insertions(+), 14 deletions(-)
rename src/etc/testcases/taskdefs/{ => email}/mail.xml (56%)
rename src/testcases/org/apache/tools/ant/taskdefs/{ => email}/EmailTaskTest.java (90%)
diff --git a/WHATSNEW b/WHATSNEW
index 5de68d80a..3f2ea59fa 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -307,6 +307,9 @@ The implementation only with JavaMail (encoding="MIME").
Implementation with plain mail remains to do.
Bugzilla Report 5969.
+* and mailloger support SMTP over TLS/SSL
+Bugzilla Report 19180.
+
* can now be defined in the main body of a project
and referred to with refid="xyz". Bugzilla Report 17007.
diff --git a/docs/manual/CoreTasks/mail.html b/docs/manual/CoreTasks/mail.html
index 750300b84..63564a26b 100644
--- a/docs/manual/CoreTasks/mail.html
+++ b/docs/manual/CoreTasks/mail.html
@@ -13,7 +13,7 @@
This task can send mail using either plain
text, UU encoding, or MIME format mail, depending on what is available.
-If you need SMTP auth, you have to use MIME (and therefore to install JavaMail).
+SMTP auth and SSL/TLS require JavaMail and are only available in MIME format.
Attachments may be sent using nested
fileset elements.
Note: This task may depend on external libraries
@@ -113,6 +113,12 @@ Library Dependencies for more information.
Yes, if SMTP auth is required on your SMTP server
the email message will be then sent using Mime and requires JavaMail |
+
+ ssl |
+ "true", "on" or "yes" accepted here
+ indicates whether you need TLS/SSL |
+ No |
+
encoding |
Specifies the encoding to use for the content of the email.
diff --git a/docs/manual/listeners.html b/docs/manual/listeners.html
index 7861c7475..a4f38cbcc 100644
--- a/docs/manual/listeners.html
+++ b/docs/manual/listeners.html
@@ -137,6 +137,13 @@ control for turning off success or failure messages individually.
| Yes, if SMTP auth is required on your SMTP server
the email message will be then sent using Mime and requires JavaMail |
+
+ MailLogger.ssl |
+ on or true if ssl is needed
+ This feature requires JavaMail |
+
+ no |
+
MailLogger.from |
Mail "from" address |
diff --git a/src/etc/testcases/taskdefs/mail.xml b/src/etc/testcases/taskdefs/email/mail.xml
similarity index 56%
rename from src/etc/testcases/taskdefs/mail.xml
rename to src/etc/testcases/taskdefs/email/mail.xml
index d44a82a5d..3f16eed98 100644
--- a/src/etc/testcases/taskdefs/mail.xml
+++ b/src/etc/testcases/taskdefs/email/mail.xml
@@ -10,6 +10,15 @@
+
+
+
+
+ Hi Laura, how are you doing ?
+
+
+
+
diff --git a/src/main/org/apache/tools/ant/listener/MailLogger.java b/src/main/org/apache/tools/ant/listener/MailLogger.java
index baa26afa5..632ff2937 100644
--- a/src/main/org/apache/tools/ant/listener/MailLogger.java
+++ b/src/main/org/apache/tools/ant/listener/MailLogger.java
@@ -157,16 +157,18 @@ public class MailLogger extends DefaultLogger {
int port = Integer.parseInt(getValue(properties,"port",String.valueOf(MailMessage.DEFAULT_PORT)));
String user = getValue(properties, "user", "");
String password = getValue(properties, "password", "");
+ boolean ssl = Project.toBoolean(getValue(properties,
+ "ssl", "off"));
String from = getValue(properties, "from", null);
String replytoList = getValue(properties,"replyto","");
String toList = getValue(properties, prefix + ".to", null);
String subject = getValue(properties, prefix + ".subject",
(success) ? "Build Success" : "Build Failure");
- if (user.equals("") && password.equals("")) {
+ if (user.equals("") && password.equals("") && !ssl) {
sendMail(mailhost, port, from, replytoList, toList, subject, buffer.substring(0));
}
else {
- sendMimeMail(event.getProject(), mailhost, port, user, password, from, replytoList, toList, subject, buffer.substring(0));
+ sendMimeMail(event.getProject(), mailhost, port, user, password, ssl, from, replytoList, toList, subject, buffer.substring(0));
}
} catch (Exception e) {
System.out.println("MailLogger failed to send e-mail!");
@@ -256,15 +258,16 @@ public class MailLogger extends DefaultLogger {
* @param port mail server port number
* @param user user name for SMTP auth
* @param password password for SMTP auth
+ * @param ssl if true send message over SSL
* @param from from address
* @param replyToString comma-separated replyto list
* @param toString comma-separated recipient list
* @param subject mail subject
* @param message mail body
- * @exception IOException thrown if sending message fails
*/
- private void sendMimeMail(Project project, String host, int port, String user, String password, String from, String replyToString, String toString,
- String subject, String message) throws IOException {
+ private void sendMimeMail(Project project, String host, int port, String user, String password, boolean ssl,
+ String from, String replyToString, String toString,
+ String subject, String message) {
// convert the replyTo string into a vector of emailaddresses
Mailer mailer = null;
try {
@@ -280,6 +283,7 @@ public class MailLogger extends DefaultLogger {
mailer.setPort(port);
mailer.setUser(user);
mailer.setPassword(password);
+ mailer.setSSL(ssl);
Message mymessage = new Message(message);
mymessage.setProject(project);
mailer.setMessage(mymessage);
diff --git a/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java b/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java
index 112090424..1233016bc 100644
--- a/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java
+++ b/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java
@@ -108,7 +108,6 @@ public class EmailTask
}
}
-
private String encoding = AUTO;
/** host running SMTP */
private String host = "localhost";
@@ -146,6 +145,8 @@ public class EmailTask
private String user=null;
/** Password for SMTP auth */
private String password=null;
+ /** indicate if the user wishes SSL-TLS */
+ private boolean SSL = false;
/**
* sets the user for SMTP auth; this requires JavaMail
@@ -165,6 +166,15 @@ public class EmailTask
this.password = password;
}
+ /**
+ * tells if the user needs to send his data over SSL
+ * @param SSL
+ * @since ant 1.6
+ */
+ public void setSSL(boolean SSL) {
+ this.SSL = SSL;
+ }
+
/**
* Allows the build writer to choose the preferred encoding method
*
@@ -466,9 +476,14 @@ public class EmailTask
}
}
// SMTP auth only allowed with MIME mail
- if (autoFound==false && ((user !=null) || (password != null)) && (encoding.equals(UU) || encoding.equals(PLAIN))) {
+ if (autoFound==false && ((user !=null) || (password != null) ) && (encoding.equals(UU) || encoding.equals(PLAIN))) {
throw new BuildException("SMTP auth only possible with MIME mail");
}
+ // SSL only allowed with MIME mail
+ if (autoFound==false && (SSL) && (encoding.equals(UU) || encoding.equals(PLAIN))) {
+ throw new BuildException("SSL only possible with MIME mail");
+ }
+
// try UU format
if (encoding.equals(UU)
@@ -564,6 +579,7 @@ public class EmailTask
mailer.setPort(port);
mailer.setUser(user);
mailer.setPassword(password);
+ mailer.setSSL(SSL);
mailer.setMessage(message);
mailer.setFrom(from);
mailer.setReplyToList(replyToList);
diff --git a/src/main/org/apache/tools/ant/taskdefs/email/Mailer.java b/src/main/org/apache/tools/ant/taskdefs/email/Mailer.java
index 5c17e557a..260ed3f80 100644
--- a/src/main/org/apache/tools/ant/taskdefs/email/Mailer.java
+++ b/src/main/org/apache/tools/ant/taskdefs/email/Mailer.java
@@ -69,6 +69,7 @@ public abstract class Mailer {
protected int port = -1;
protected String user = null;
protected String password = null;
+ protected boolean SSL = false;
protected Message message;
protected EmailAddress from;
protected Vector replyToList = null;
@@ -103,6 +104,7 @@ public abstract class Mailer {
* Sets the user for smtp auth
*
* @param user
+ * @since ant 1.6
*/
public void setUser(String user) {
this.user = user;
@@ -112,11 +114,22 @@ public abstract class Mailer {
* Sets the password for smtp auth
*
* @param password
+ * @since ant 1.6
*/
public void setPassword(String password) {
this.password = password;
}
+ /**
+ * Sets whether the user wants to send the mail through SSL
+ *
+ * @param SSL
+ * @since ant 1.6
+ */
+ public void setSSL(boolean SSL) {
+ this.SSL = SSL;
+ }
+
/**
* Sets the message
*
diff --git a/src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java b/src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java
index 26dd46bc0..36e033f34 100644
--- a/src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java
+++ b/src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java
@@ -66,6 +66,7 @@ import java.util.Enumeration;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.Vector;
+import java.security.Security;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
@@ -157,6 +158,19 @@ public class MimeMailer extends Mailer {
// alcohol :-)
Session sesh;
Authenticator auth;
+ if (SSL) {
+ try {
+ java.security.Provider p=(java.security.Provider)Class.forName( "com.sun.net.ssl.internal.ssl.Provider").newInstance();
+ Security.addProvider(p);
+ }
+ catch (Exception e) {
+ throw new BuildException("could not instantiate ssl security provider, check that you have JSSE in your classpath");
+ }
+ final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
+ // SMTP provider
+ props.put( "mail.smtp.socketFactory.class", SSL_FACTORY);
+ props.put( "mail.smtp.socketFactory.fallback", "false");
+ }
if (user==null && password == null) {
sesh = Session.getDefaultInstance(props, null);
}
@@ -165,7 +179,6 @@ public class MimeMailer extends Mailer {
auth = new SimpleAuthenticator(user,password);
sesh = Session.getInstance(props,auth);
}
-
//create the message
MimeMessage msg = new MimeMessage(sesh);
MimeMultipart attachments = new MimeMultipart();
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/EmailTaskTest.java b/src/testcases/org/apache/tools/ant/taskdefs/email/EmailTaskTest.java
similarity index 90%
rename from src/testcases/org/apache/tools/ant/taskdefs/EmailTaskTest.java
rename to src/testcases/org/apache/tools/ant/taskdefs/email/EmailTaskTest.java
index 523bc2b01..61c69e13f 100644
--- a/src/testcases/org/apache/tools/ant/taskdefs/EmailTaskTest.java
+++ b/src/testcases/org/apache/tools/ant/taskdefs/email/EmailTaskTest.java
@@ -52,9 +52,8 @@
* .
*/
-package org.apache.tools.ant.taskdefs;
+package org.apache.tools.ant.taskdefs.email;
-import java.io.File;
import org.apache.tools.ant.BuildFileTest;
/**
@@ -62,19 +61,22 @@ import org.apache.tools.ant.BuildFileTest;
* to simulate sending mail and to catch the output in text files or streams
* @author Antoine Levy-Lambert
*/
-public class EmailTaskTest extends BuildFileTest {
+public class EmailTaskTest extends BuildFileTest {
- public EmailTaskTest(String name) {
+ public EmailTaskTest(String name) {
super(name);
}
public void setUp() {
- configureProject("src/etc/testcases/taskdefs/mail.xml");
+ configureProject("src/etc/testcases/taskdefs/email/mail.xml");
}
public void test1() {
expectBuildException("test1", "SMTP auth only possible with MIME mail");
}
+ public void test2() {
+ expectBuildException("test2", "SSL only possible with MIME mail");
+ }
}