I have implemented it similarly to the other lists of email addresses (To, CC, Bcc) because it might actually be easier that way We might still need a generic parameter collection for other header elements PR: 19141 Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274582 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -32,6 +32,11 @@ Library Dependencies</a> for more information. | |||||
| <td align="center" valign="top">Either a <code>from</code> attribute, or a <code><from></code> | <td align="center" valign="top">Either a <code>from</code> attribute, or a <code><from></code> | ||||
| element.</td> | element.</td> | ||||
| </tr> | </tr> | ||||
| <tr> | |||||
| <td valign="top">replyto</td> | |||||
| <td valign="top">Replyto email address.</td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| <tr> | <tr> | ||||
| <td valign="top">tolist</td> | <td valign="top">tolist</td> | ||||
| <td valign="top">Comma-separated list of recipients.</td> | <td valign="top">Comma-separated list of recipients.</td> | ||||
| @@ -116,7 +121,7 @@ Library Dependencies</a> for more information. | |||||
| <h3>Parameters specified as nested elements</h3> | <h3>Parameters specified as nested elements</h3> | ||||
| <h4>to / cc / bcc / from</h4> | |||||
| <h4>to / cc / bcc / from/ replyto </h4> | |||||
| <p>Adds an email address element. It takes the following attributes:</p> | <p>Adds an email address element. It takes the following attributes:</p> | ||||
| <table width="60%" border="1" cellpadding="2" cellspacing="0"> | <table width="60%" border="1" cellpadding="2" cellspacing="0"> | ||||
| @@ -187,7 +192,8 @@ the <code><message></code> element.</p> | |||||
| <blockquote><pre> | <blockquote><pre> | ||||
| <mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build"> | <mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build"> | ||||
| <from address="me@myisp.com"/> | |||||
| <from address="config@myisp.com"/> | |||||
| <replyto address="me@myisp.com"/> | |||||
| <to address="all@xyz.com"/> | <to address="all@xyz.com"/> | ||||
| <message>The ${buildname} nightly build has completed</message> | <message>The ${buildname} nightly build has completed</message> | ||||
| <fileset dir="dist"> | <fileset dir="dist"> | ||||
| @@ -196,8 +202,9 @@ the <code><message></code> element.</p> | |||||
| </mail> | </mail> | ||||
| </pre></blockquote> | </pre></blockquote> | ||||
| <p>Sends an eMail from <i>me@myisp.com</i> to <i>all@xyz.com</i> with a subject of | |||||
| <i>Test Build</i> and attaches any zip files from the dist directory. The | |||||
| <p>Sends an eMail from <i>config@myisp.com</i> to <i>all@xyz.com</i> with a subject of | |||||
| <i>Test Build</i>. Replies to this email will go to <i>me@myisp.com</i>. | |||||
| Any zip files from the dist directory are attached. The | |||||
| task will attempt to use JavaMail and fall back to UU encoding or no encoding in | task will attempt to use JavaMail and fall back to UU encoding or no encoding in | ||||
| that order depending on what support classes are available. <code>${buildname}</code> | that order depending on what support classes are available. <code>${buildname}</code> | ||||
| will be replaced with the <code>buildname</code> property's value.</p> | will be replaced with the <code>buildname</code> property's value.</p> | ||||
| @@ -130,6 +130,11 @@ control for turning off success or failure messages individually.</p> | |||||
| <td width="63%">Mail "from" address</td> | <td width="63%">Mail "from" address</td> | ||||
| <td width="63%">Yes, if mail needs to be sent</td> | <td width="63%">Yes, if mail needs to be sent</td> | ||||
| </tr> | </tr> | ||||
| <tr> | |||||
| <td width="337">MailLogger.replyto</td> | |||||
| <td width="63%">Mail "replyto" address(es), comma-separated</td> | |||||
| <td width="63%">No</td> | |||||
| </tr> | |||||
| <tr> | <tr> | ||||
| <td width="337">MailLogger.failure.notify </td> | <td width="337">MailLogger.failure.notify </td> | ||||
| <td width="63%">Send build failure e-mails?</td> | <td width="63%">Send build failure e-mails?</td> | ||||
| @@ -314,7 +319,7 @@ developers.</p> | |||||
| </ul> | </ul> | ||||
| <hr> | <hr> | ||||
| <p align="center">Copyright © 2000-2002 Apache Software Foundation. All rights | |||||
| <p align="center">Copyright © 2000-2003 Apache Software Foundation. All rights | |||||
| Reserved.</p> | Reserved.</p> | ||||
| </body> | </body> | ||||
| @@ -153,12 +153,12 @@ public class MailLogger extends DefaultLogger { | |||||
| String mailhost = getValue(properties, "mailhost", "localhost"); | String mailhost = getValue(properties, "mailhost", "localhost"); | ||||
| int port = Integer.parseInt(getValue(properties,"port",String.valueOf(MailMessage.DEFAULT_PORT))); | int port = Integer.parseInt(getValue(properties,"port",String.valueOf(MailMessage.DEFAULT_PORT))); | ||||
| String from = getValue(properties, "from", null); | String from = getValue(properties, "from", null); | ||||
| String replytoList = getValue(properties,"replyto",""); | |||||
| String toList = getValue(properties, prefix + ".to", null); | String toList = getValue(properties, prefix + ".to", null); | ||||
| String subject = getValue(properties, prefix + ".subject", | String subject = getValue(properties, prefix + ".subject", | ||||
| (success) ? "Build Success" : "Build Failure"); | (success) ? "Build Success" : "Build Failure"); | ||||
| sendMail(mailhost, port, from, toList, subject, buffer.substring(0)); | |||||
| sendMail(mailhost, port, from, replytoList, toList, subject, buffer.substring(0)); | |||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| System.out.println("MailLogger failed to send e-mail!"); | System.out.println("MailLogger failed to send e-mail!"); | ||||
| e.printStackTrace(System.err); | e.printStackTrace(System.err); | ||||
| @@ -211,18 +211,24 @@ public class MailLogger extends DefaultLogger { | |||||
| * @param mailhost mail server | * @param mailhost mail server | ||||
| * @param port mail server port number | * @param port mail server port number | ||||
| * @param from from address | * @param from from address | ||||
| * @param replyToList comma-separated replyto list | |||||
| * @param toList comma-separated recipient list | * @param toList comma-separated recipient list | ||||
| * @param subject mail subject | * @param subject mail subject | ||||
| * @param message mail body | * @param message mail body | ||||
| * @exception IOException thrown if sending message fails | * @exception IOException thrown if sending message fails | ||||
| */ | */ | ||||
| private void sendMail(String mailhost, int port, String from, String toList, | |||||
| private void sendMail(String mailhost, int port, String from, String replyToList, String toList, | |||||
| String subject, String message) throws IOException { | String subject, String message) throws IOException { | ||||
| MailMessage mailMessage = new MailMessage(mailhost, port); | MailMessage mailMessage = new MailMessage(mailhost, port); | ||||
| mailMessage.setHeader("Date", DateUtils.getDateForHeader()); | mailMessage.setHeader("Date", DateUtils.getDateForHeader()); | ||||
| mailMessage.from(from); | mailMessage.from(from); | ||||
| if (!replyToList.equals("")) { | |||||
| StringTokenizer t = new StringTokenizer(replyToList, ", ", false); | |||||
| while (t.hasMoreTokens()) { | |||||
| mailMessage.replyto(t.nextToken()); | |||||
| } | |||||
| } | |||||
| StringTokenizer t = new StringTokenizer(toList, ", ", false); | StringTokenizer t = new StringTokenizer(toList, ", ", false); | ||||
| while (t.hasMoreTokens()) { | while (t.hasMoreTokens()) { | ||||
| mailMessage.to(t.nextToken()); | mailMessage.to(t.nextToken()); | ||||
| @@ -77,6 +77,7 @@ import org.apache.tools.ant.types.FileSet; | |||||
| * @author paulo.gaspar@krankikom.de Paulo Gaspar | * @author paulo.gaspar@krankikom.de Paulo Gaspar | ||||
| * @author roxspring@imapmail.org Rob Oxspring | * @author roxspring@imapmail.org Rob Oxspring | ||||
| * @author <a href="mailto:ishu@akm.ru">Aleksandr Ishutin</a> | * @author <a href="mailto:ishu@akm.ru">Aleksandr Ishutin</a> | ||||
| * @author <a href="mailto:levylambert@tiscali-dsl.de">Antoine Levy-Lambert</a> | |||||
| * @since Ant 1.5 | * @since Ant 1.5 | ||||
| * @ant.task name="mail" category="network" | * @ant.task name="mail" category="network" | ||||
| */ | */ | ||||
| @@ -120,9 +121,11 @@ public class EmailTask | |||||
| private boolean failOnError = true; | private boolean failOnError = true; | ||||
| private boolean includeFileNames = false; | private boolean includeFileNames = false; | ||||
| private String messageMimeType = null; | private String messageMimeType = null; | ||||
| /** special headers */ | |||||
| /** sender */ | /** sender */ | ||||
| private EmailAddress from = null; | private EmailAddress from = null; | ||||
| /** replyto */ | |||||
| private Vector replyToList = new Vector(); | |||||
| /** TO recipients */ | /** TO recipients */ | ||||
| private Vector toList = new Vector(); | private Vector toList = new Vector(); | ||||
| /** CC (Carbon Copy) recipients */ | /** CC (Carbon Copy) recipients */ | ||||
| @@ -135,6 +138,10 @@ public class EmailTask | |||||
| private Vector filesets = new Vector(); | private Vector filesets = new Vector(); | ||||
| /** Character set for MimeMailer*/ | /** Character set for MimeMailer*/ | ||||
| private String charset=null; | private String charset=null; | ||||
| /** if set to true, the email will not be actually sent */ | |||||
| private boolean debugonly=false; | |||||
| /** a location where to print the email message */ | |||||
| private File debugoutput; | |||||
| /** | /** | ||||
| @@ -265,6 +272,28 @@ public class EmailTask | |||||
| } | } | ||||
| /** | |||||
| * Adds a replyto address element | |||||
| * | |||||
| * @param address The address to reply to | |||||
| * @since ant 1.6 | |||||
| */ | |||||
| public void addReplyTo(EmailAddress address) { | |||||
| this.replyToList.add(address); | |||||
| } | |||||
| /** | |||||
| * Shorthand to set the replyto address element | |||||
| * | |||||
| * @param address The address to which replies should be directed | |||||
| * @since ant 1.6 | |||||
| */ | |||||
| public void setReplyTo(String address) { | |||||
| this.replyToList.add(new EmailAddress(address)); | |||||
| } | |||||
| /** | /** | ||||
| * Adds a to address element | * Adds a to address element | ||||
| * | * | ||||
| @@ -501,6 +530,7 @@ public class EmailTask | |||||
| // let the user know what's going to happen | // let the user know what's going to happen | ||||
| log("Sending email: " + subject, Project.MSG_INFO); | log("Sending email: " + subject, Project.MSG_INFO); | ||||
| log("From " + from, Project.MSG_VERBOSE); | log("From " + from, Project.MSG_VERBOSE); | ||||
| log("ReplyTo " + replyToList,Project.MSG_VERBOSE); | |||||
| log("To " + toList, Project.MSG_VERBOSE); | log("To " + toList, Project.MSG_VERBOSE); | ||||
| log("Cc " + ccList, Project.MSG_VERBOSE); | log("Cc " + ccList, Project.MSG_VERBOSE); | ||||
| log("Bcc " + bccList, Project.MSG_VERBOSE); | log("Bcc " + bccList, Project.MSG_VERBOSE); | ||||
| @@ -510,6 +540,7 @@ public class EmailTask | |||||
| mailer.setPort(port); | mailer.setPort(port); | ||||
| mailer.setMessage(message); | mailer.setMessage(message); | ||||
| mailer.setFrom(from); | mailer.setFrom(from); | ||||
| mailer.setReplyToList(replyToList); | |||||
| mailer.setToList(toList); | mailer.setToList(toList); | ||||
| mailer.setCcList(ccList); | mailer.setCcList(ccList); | ||||
| mailer.setBccList(bccList); | mailer.setBccList(bccList); | ||||
| @@ -69,6 +69,7 @@ abstract class Mailer { | |||||
| protected int port = -1; | protected int port = -1; | ||||
| protected Message message; | protected Message message; | ||||
| protected EmailAddress from; | protected EmailAddress from; | ||||
| protected Vector replyToList = null; | |||||
| protected Vector toList = null; | protected Vector toList = null; | ||||
| protected Vector ccList = null; | protected Vector ccList = null; | ||||
| protected Vector bccList = null; | protected Vector bccList = null; | ||||
| @@ -117,6 +118,17 @@ abstract class Mailer { | |||||
| } | } | ||||
| /** | |||||
| * Sets the replyto addresses | |||||
| * | |||||
| * @param list | |||||
| * @since ant 1.6 | |||||
| */ | |||||
| public void setReplyToList(Vector list) { | |||||
| this.replyToList = list; | |||||
| } | |||||
| /** | /** | ||||
| * Set the to addresses | * Set the to addresses | ||||
| * | * | ||||
| @@ -170,7 +170,8 @@ class MimeMailer extends Mailer { | |||||
| msg.setFrom(new InternetAddress(from.getAddress(), | msg.setFrom(new InternetAddress(from.getAddress(), | ||||
| from.getName())); | from.getName())); | ||||
| } | } | ||||
| // set the reply to addresses | |||||
| msg.setReplyTo(internetAddresses(replyToList)); | |||||
| msg.setRecipients(Message.RecipientType.TO, | msg.setRecipients(Message.RecipientType.TO, | ||||
| internetAddresses(toList)); | internetAddresses(toList)); | ||||
| msg.setRecipients(Message.RecipientType.CC, | msg.setRecipients(Message.RecipientType.CC, | ||||
| @@ -1,7 +1,7 @@ | |||||
| /* | /* | ||||
| * The Apache Software License, Version 1.1 | * The Apache Software License, Version 1.1 | ||||
| * | * | ||||
| * Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
| * Copyright (c) 2002-2003 The Apache Software Foundation. All rights | |||||
| * reserved. | * reserved. | ||||
| * | * | ||||
| * Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
| @@ -82,6 +82,11 @@ class PlainMailer extends Mailer { | |||||
| Enumeration e; | Enumeration e; | ||||
| e = replyToList.elements(); | |||||
| while (e.hasMoreElements()) { | |||||
| mailMessage.replyto(e.nextElement().toString()); | |||||
| } | |||||
| e = toList.elements(); | e = toList.elements(); | ||||
| while (e.hasMoreElements()) { | while (e.hasMoreElements()) { | ||||
| mailMessage.to(e.nextElement().toString()); | mailMessage.to(e.nextElement().toString()); | ||||
| @@ -122,7 +127,6 @@ class PlainMailer extends Mailer { | |||||
| } | } | ||||
| /** | /** | ||||
| * Attaches a file to this email | * Attaches a file to this email | ||||
| * | * | ||||
| @@ -1,7 +1,7 @@ | |||||
| /* | /* | ||||
| * The Apache Software License, Version 1.1 | * The Apache Software License, Version 1.1 | ||||
| * | * | ||||
| * Copyright (c) 2000-2002 The Apache Software Foundation. All rights | |||||
| * Copyright (c) 2000-2003 The Apache Software Foundation. All rights | |||||
| * reserved. | * reserved. | ||||
| * | * | ||||
| * Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
| @@ -143,6 +143,9 @@ public class MailMessage { | |||||
| /** sender email address */ | /** sender email address */ | ||||
| private String from; | private String from; | ||||
| /** list of email addresses to reply to */ | |||||
| private Vector replyto; | |||||
| /** list of email addresses to send to */ | /** list of email addresses to send to */ | ||||
| private Vector to; | private Vector to; | ||||
| @@ -190,10 +193,11 @@ public class MailMessage { | |||||
| public MailMessage(String host, int port) throws IOException{ | public MailMessage(String host, int port) throws IOException{ | ||||
| this.port = port; | this.port = port; | ||||
| this.host = host; | this.host = host; | ||||
| replyto = new Vector(); | |||||
| to = new Vector(); | to = new Vector(); | ||||
| cc = new Vector(); | cc = new Vector(); | ||||
| headers = new Hashtable(); | headers = new Hashtable(); | ||||
| setHeader("X-Mailer", "org.apache.tools.mail.MailMessage (jakarta.apache.org)"); | |||||
| setHeader("X-Mailer", "org.apache.tools.mail.MailMessage (ant.apache.org)"); | |||||
| connect(); | connect(); | ||||
| sendHelo(); | sendHelo(); | ||||
| } | } | ||||
| @@ -218,6 +222,16 @@ public class MailMessage { | |||||
| this.from = from; | this.from = from; | ||||
| } | } | ||||
| /** | |||||
| * Sets the replyto address | |||||
| * This method may be | |||||
| * called multiple times. | |||||
| * | |||||
| */ | |||||
| public void replyto(String rto) { | |||||
| this.replyto.addElement(rto); | |||||
| } | |||||
| /** | /** | ||||
| * Sets the to address. Also sets the "To" header. This method may be | * Sets the to address. Also sets the "To" header. This method may be | ||||
| * called multiple times. | * called multiple times. | ||||
| @@ -277,6 +291,7 @@ public class MailMessage { | |||||
| */ | */ | ||||
| public PrintStream getPrintStream() throws IOException { | public PrintStream getPrintStream() throws IOException { | ||||
| setFromHeader(); | setFromHeader(); | ||||
| setReplyToHeader(); | |||||
| setToHeader(); | setToHeader(); | ||||
| setCcHeader(); | setCcHeader(); | ||||
| sendData(); | sendData(); | ||||
| @@ -288,6 +303,9 @@ public class MailMessage { | |||||
| setHeader("From", from); | setHeader("From", from); | ||||
| } | } | ||||
| void setReplyToHeader() { | |||||
| setHeader("Reply-To", vectorToList(replyto)); | |||||
| } | |||||
| void setToHeader() { | void setToHeader() { | ||||
| setHeader("To", vectorToList(to)); | setHeader("To", vectorToList(to)); | ||||
| } | } | ||||