From: Jay T. <jwt...@us...> - 2001-10-18 22:24:50
|
Update of /cvsroot/nant/nant/src/NAnt/Tasks In directory usw-pr-cvs1:/tmp/cvs-serv4433 Added Files: MailTask.cs Log Message: Added task for sending SMTP mail --- NEW FILE: MailTask.cs --- // NAnt - A .NET build tool // Copyright (C) 2001 Gerry Shaw // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // Gerry Shaw (ger...@ya...) // Jay Turpin (jay...@ho...) using System; using System.Text; using System.Web.Mail; using System.IO; using SourceForge.NAnt.Attributes; using SourceForge.NAnt; namespace SourceForge.NAnt.Tasks { /// <summary> /// A task to send SMTP email. /// </summary> /// <remarks> /// <p> /// <table border="1" cellpadding="3" cellspacing="0"> /// <tr bgcolor="#ccccff"> /// <th>Attribute</th> /// <th>Description</th> /// <th>Required</th> /// </tr> /// <tr> /// <td>from</td> /// <td>Email address of sender.</td> /// <td>Yes</td> /// </tr> /// <tr> /// <td>mailhost</td> /// <td>Host name of the mail server.</td> /// <td>No, defaults to "localhost"</td> /// </tr> /// <tr> /// <td>tolist</td> /// <td>Comma- or semi-colon separated list of recipients.</td> /// <td rowspan="3">One of these three attributes</td> /// </tr> /// <tr> /// <td>cclist</td> /// <td>Comma- or semi-colon separated list of CC: recipients.</td> /// </tr> /// <tr> /// <td>bcclist</td> /// <td>Comma- or semi-colon separated list of BCC: recipients.</td> /// </tr> /// <tr> /// <td>subject</td> /// <td>Email subject line.</td> /// <td>No</td> /// </tr> /// <tr> /// <td>files</td> /// <td>Filename(s) of text to send in the body of the email. Multiple files are delimited by commas or semicolons.</td> /// <td rowspan="2">One of these two attributes</td> /// </tr> /// <tr> /// <td>message</td> /// <td>Message to send in the body of the email. This text will appear in message body before the contents of anything from the "files" attribute.</td> /// </tr> /// <tr> /// <td>attachments</td> /// <td>Filename(s) to send as attachments to the email. Multiple files are delimited by commas or semicolons.</td> /// <td>No</td> /// </tr> /// </table> /// </remarks> /// <example>Example: /// <code> /// <mail /// from="nA...@so..." /// tolist="rec...@so..." /// cclist="rec...@so..." /// bcclist="rec...@so..." /// subject="Msg 7: With attachments" /// files="body1.txt,body2.txt;body3.txt,body4.txt" /// attachments="body1.txt,body2.txt;,body3.txt" /// mailhost="smtpserver.anywhere.com"/> /// </code> /// </example> [TaskName("mail")] public class MailTask : Task { [TaskAttribute("from")] string _from = ""; [TaskAttribute("tolist")] string _toList = ""; [TaskAttribute("cclist")] string _ccList = ""; [TaskAttribute("bcclist")] string _bccList = ""; [TaskAttribute("mailhost")] string _mailHost = "localhost"; [TaskAttribute("subject")] string _subject = ""; [TaskAttribute("message")] string _message = ""; [TaskAttribute("files")] string _files = ""; [TaskAttribute("attachments")] string _attachments = ""; /// <summary> /// Required. Email address of sender /// </summary> public string From { get { return _from; } set { _from = value; } } /// <summary> /// Required. Comma- or semicolon-separated list of recipient email addresses /// </summary> public string ToList { // convert to semicolon delimited get { return _toList.Replace("," , ";"); } set { _toList = value.Replace("," , ";"); } } /// <summary> /// Optional. Comma- or semicolon-separated list of CC: recipient email addresses /// </summary> public string CcList { // convert to semicolon delimited get { return _ccList.Replace("," , ";"); } set { _ccList = value.Replace("," , ";"); } } /// <summary> /// Optional. Comma- or semicolon-separated list of BCC: recipient email addresses /// </summary> public string BccList { // convert to semicolon delimited get { return _bccList.Replace("," , ";"); } set { _bccList = value.Replace("," , ";"); } } /// <summary> /// Optional. Host name of mail server. Defaults to "localhost" /// </summary> public string Mailhost { get { return _mailHost; } set { _mailHost = value; } } /// <summary> /// Optional. Text to send in body of email message /// </summary> public string Message { get { return _message; } set { _message = value; } } /// <summary> /// Optional. Text to send in subject line of email message /// </summary> public string Subject { get { return _subject; } set { _subject = value; } } /// <summary> /// Optional. Name(s) of text files to send as part of body of the email message. /// Multiple file names are comma- or semicolon-separated. /// </summary> public string Files { // convert to semicolon delimited get { return _files.Replace("," , ";"); } set { _files = value.Replace("," , ";"); } } /// <summary> /// Optional. Name(s) of files to send as attachments to email message. /// Multiple file names are comma- or semicolon-separated. /// </summary> public string Attachments { // convert to semicolon delimited get { return _attachments.Replace("," , ";"); } set { _attachments = value.Replace("," , ";"); } } ///<summary>Initializes task and ensures the supplied attributes are valid.</summary> ///<param name="taskNode">Xml node used to define this task instance.</param> protected override void InitializeTask(System.Xml.XmlNode taskNode) { if (From.Length == 0) { throw new BuildException("MAIL attribute \"from\" is required.", Location); } if (ToList.Length == 0 && CcList.Length == 0 && BccList.Length == 0) { throw new BuildException("MAIL must provide at least one of these attributes: \"tolist\", \"cclist\" or \"bcclist\".", Location); } } /// <summary> /// This is where the work is done /// </summary> protected override void ExecuteTask() { MailMessage mailMessage = new MailMessage(); mailMessage.From = this.From; mailMessage.To = this.ToList; mailMessage.Bcc = this.BccList; mailMessage.Cc = this.CcList; mailMessage.Subject = this.Subject; // Begin build message body StringWriter bodyWriter = new StringWriter(); if (Message.Length > 0) { bodyWriter.WriteLine(Message); bodyWriter.WriteLine(); } // Append file(s) to message body if (Files.Length > 0) { string[] fileList = Files.Split(new char[]{';'}); foreach (string fileName in fileList) { try { StreamReader reader = new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read)); bodyWriter.WriteLine(fileName); bodyWriter.WriteLine(reader.ReadToEnd()); bodyWriter.WriteLine(); reader.Close(); } catch { string msg = "WARNING! File \"" + fileName + "\" NOT added to message body. File does not exist or is not readable. Check: " + Location.ToString() + "files=\"" + Files + "\""; Log.WriteLine(LogPrefix + msg); } } } // add message body to mailMessage string bodyText = bodyWriter.ToString(); if (bodyText.Length != 0) { mailMessage.Body = bodyText; } else { throw new BuildException("MAIL attribute \"file\" or \"message\" is required."); } // Append file(s) to message body if (Attachments.Length > 0) { string[] attachList = Attachments.Split(new char[]{';'}); foreach (string fileName in attachList) { try { // MailAttachment likes fully-qualified file names, use FileInfo to get them FileInfo fileInfo = new FileInfo(fileName); MailAttachment attach = new MailAttachment(fileInfo.FullName); mailMessage.Attachments.Add(attach); } catch { string msg = "WARNING! File \"" + fileName + "\" NOT attached to message. File does not exist or cannot be accessed. Check: " + Location.ToString() + "attachments=\"" + Attachments + "\""; Log.WriteLine(LogPrefix + msg); } } } // send message try { SmtpMail.SmtpServer = this.Mailhost; SmtpMail.Send(mailMessage); } catch (Exception e) { StringBuilder msg = new StringBuilder(); msg.Append(LogPrefix + "Error enountered while sending mail message.\n"); msg.Append(LogPrefix + "Make sure that mailhost=" + this.Mailhost + " is valid\n"); msg.Append(LogPrefix + "Internal Message: " + e.Message + "\n"); msg.Append(LogPrefix + "Stack Trace:\n"); msg.Append(e.ToString() + "\n"); throw new BuildException("Error sending mail:\n " + msg.ToString()); } } } } |