Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • René 327 posts 852 karma points
    Mar 26, 2014 @ 13:24
    René
    0

    Send attachment PDF - XSLT Send email, extended

    Hi 

    I need to send a pdf file as attached to an email. 

    I have umbraco 4.11.8 and umbraco contour 3.0.6

    When a user submit the form i need to attache a file to the email the user get as confirmation.

    I have installed conrour contrieb, but it only attache the file from the upload field. 

    I´m a bit stucked here... any ideas hov to attatche a pdf through the XSLT transformed email?

    A little help would be great :-)

    René

  • Jan Skovgaard 11258 posts 23500 karma points MVP 7x admin c-trib
    Mar 26, 2014 @ 14:40
    Jan Skovgaard
    0

    Hi René

    I'm not sure it's possible to attach a file to an e-mail using XSLT to send the content of the Contour form unless you create your own "SendMail" extension, which also takes the file path as a parameter I guess.

    If you would be okay with just sending a link to the file then have a look at the answer by Dan Evans in this post http://our.umbraco.org/forum/umbraco-pro/contour/6174-Attach-File-To-Email-Form

    Hope this helps.

    /Jan

  • René 327 posts 852 karma points
    Mar 27, 2014 @ 17:57
    René
    0

    Hi 

    I´m on my way to get it to work :-)

    I have used the "Send mail, extended" from Contour Contrib, Umbraco package Repository.

    But i´m a bit stucked here. 

    I have tryed with this "Umbraco.Forms.Core.FieldSetting.Pickers.Content", but of cource i´m only allowed to choose content nodes, instead of media.

    /// <summary>
            /// Gets or sets File.
            /// </summary>
            [Umbraco.Forms.Core.Attributes.Setting("FilePDF", description = "Choose file", control = "Umbraco.Forms.Core.FieldSetting.Pickers.Content")]
            public string FilePDF { get; set; }

     

    Im trying to modify this code to choose a pdf file from a media picker. (From the SendEmailExtended.cs) http://contourcontrib.codeplex.com/SourceControl/latest#Contour.Contrib/Contour.Contrib/WorkflowTypes/SendEmailExtended.cs

    XPathNavigator node = nodeIterator.Current.SelectSingleNode(".//value");
                    if (this.Attachment == true.ToString() && node != null &&
                        node.Value.Contains("/media/"))
                    {
                        // add attachment
                        string filelocation = HttpContext.Current.Server.MapPath(node.Value);
                        mailMessage.Attachments.Add(new Attachment(filelocation));
                    }

     

    Alternative it would be fine to have a textfield to enter the media id. 

    I can´t figure out how. Is there anyone who could come up with an ideea, tanks in advance.. :-)

    René 

    -

  • Jeroen Breuer 4861 posts 12138 karma points MVP 3x admin c-trib
    Mar 27, 2014 @ 18:13
    Jeroen Breuer
    0

    Hello,

    I'm using this custom workflow which adds emails as attachments.

    public class CustomSendEmailWorkflow : WorkflowType
    {
        [Setting("Email from", description = "Enter the from email", control = "Umbraco.Forms.Core.FieldSetting.TextField")]
        public string EmailFrom
        {
            get;
            set;
        }
        [Setting("Email to", description = "Enter the to email", control = "Umbraco.Forms.Core.FieldSetting.TextField")]
        public string EmailTo
        {
            get;
            set;
        }
        [Setting("Email cc", description = "Enter the cc email", control = "Umbraco.Forms.Core.FieldSetting.TextField")]
        public string EmailCc
        {
            get;
            set;
        }
        [Setting("Email bcc", description = "Enter the bcc email", control = "Umbraco.Forms.Core.FieldSetting.TextField")]
        public string EmailBcc
        {
            get;
            set;
        }
        [Setting("Subject", description = "Enter the subject", control = "Umbraco.Forms.Core.FieldSetting.TextField")]
        public string Subject
        {
            get;
            set;
        }
        [Setting("Message", description = "Enter the message", control = "Umbraco.Forms.Core.FieldSetting.TextArea")]
        public string Message
        {
            get;
            set;
        }
        public CustomSendEmailWorkflow()
        {
            base.Id = new Guid("c8a976da-0ced-4680-9296-53afb9b41df4");
            base.Name = "Custom send email";
            base.Description = "Send a message from a specific email address to a specific email address";
        }
        public override List<Exception> ValidateSettings()
        {
            List<Exception> i = new List<Exception>();
            if (string.IsNullOrEmpty(this.EmailFrom))
            {
                i.Add(new Exception("'Email From' setting has not been set"));
            }
            if (string.IsNullOrEmpty(this.EmailTo))
            {
                i.Add(new Exception("'Email To' setting has not been set"));
            }
            if (string.IsNullOrEmpty(this.Subject))
            {
                i.Add(new Exception("'Subject' setting has not been set'"));
            }
            if (string.IsNullOrEmpty(this.Message))
            {
                i.Add(new Exception("'Message' setting has not been set'"));
            }
            return i;
        }
        public override WorkflowExecutionStatus Execute(Record record, RecordEventArgs e)
        {
            var pageTitle = Node.GetCurrent().Name;
    
            MailMessage i = new MailMessage();
            i.From = new MailAddress(EmailFrom);
            if (!string.IsNullOrEmpty(EmailTo))
            {
                foreach (string email in EmailTo.Split(','))
                {
                    i.To.Add(new MailAddress(email));
                }
            }
            if (!string.IsNullOrEmpty(EmailCc))
            {
                foreach (string email in EmailCc.Split(','))
                {
                    i.CC.Add(new MailAddress(email));
                }
            }
            if (!string.IsNullOrEmpty(EmailBcc))
            {
                foreach (string email in EmailBcc.Split(','))
                {
                    i.Bcc.Add(new MailAddress(email));
                }
            }
    
            i.Subject = this.Subject.Replace("{pageTitle}", pageTitle);
            i.IsBodyHtml = true;
            string body = this.Message.Replace("\n", "<br/>");
    
    
            string fieldHtml = @"
                <table>";
    
                foreach (RecordField rf in record.RecordFields.Values.OrderBy(x => x.Field.SortOrder)) 
                {
                    if (rf.Field.FieldType.GetType().ToString() == "Umbraco.Forms.Core.Providers.FieldTypes.FileUpload")
                    {
                        if (!string.IsNullOrEmpty(rf.ValuesAsString()))
                        {
                            //If it's a FileUpload add the file as an attachment.
                            i.Attachments.Add(new Attachment(HttpContext.Current.Server.MapPath(rf.ValuesAsString())));
                        }
                    }
                    else
                    {
                        //Add the info into the table.
                        fieldHtml += @"
                        <tr>
                            <td>" + rf.Field.Caption + @" </td>
                            <td>" + rf.ValuesAsString() + @" </td>
                        </tr>
                        ";
                    }
                }
    
            fieldHtml += @"
                </table>";
    
            i.Body = body.Replace("{velden}", fieldHtml).Replace("{pageTitle}", pageTitle);
    
            SmtpClient smtpClient = new SmtpClient();
    
            smtpClient.Send(i);
    
            return WorkflowExecutionStatus.Completed;
        }
    }

    Jeroen

  • René 327 posts 852 karma points
    Mar 31, 2014 @ 15:26
    René
    0

    Hi 

    Now i got this working. 

    I can test the form local with this settings. 

      <system.net>
          <mailSettings>
            <smtp deliveryMethod="SpecifiedPickupDirectory">
              <specifiedPickupDirectory pickupDirectoryLocation="C:\TestMail"/>
            </smtp>
          </mailSettings>
      </system.net>

    But when i try to send a mail from the website nothing sends. 

    Any suggestions?

    Here are the sendMailWorkflow with atatched pdf

    // --------------------------------------------------------------------------------------------------------------------
    // <copyright file="SendEmailExtended.cs" company="Open Source">
    //   MIT License
    // </copyright>
    // <summary>
    //   The Extended "send email" workflow type.
    // </summary>
    // --------------------------------------------------------------------------------------------------------------------
    
    namespace Contour_workflow
    {
        using System;
        using System.Collections.Generic;
    
        using System.Linq;
        using System.Net.Mail;
        using System.Text.RegularExpressions;
        using System.Web;
        using System.Web.Configuration;
        using System.Xml;
        using System.Xml.XPath;
        using System.Text;
    
        using umbraco;
        using umbraco.BusinessLogic;
        using umbraco.cms.businesslogic;
        using umbraco.cms.businesslogic.web;
    
        using Umbraco.Forms.Core;
        using Umbraco.Forms.Core.Enums;
        using Umbraco.Forms.Data.Storage;
    
        /// <summary>
        /// The send email extended.
        /// </summary>
        public class IDCWorkflow : WorkflowType
        {
            #region Constructors and Destructors
    
            /// <summary>
            /// Initializes a new instance of the <see cref="SendEmailExtended"/> class.
            /// </summary>
            public IDCWorkflow()
            {
                this.Id = new Guid("{26f5d74f-50ca-4b52-871d-1b41628da9f8}");
                this.Name = "IDC Workflow";
                this.Description = "Send the result of the form to 1 or multiple email address (separated with a semi-colon: ';'). For multi-lingual mails you can use the dash notation. For the Message field you can use multiple dictionary items (without spaces only) and newlines can be obtained using \n. To reference a field from your form use a lower-cased, spaceless version of your field name inside curly brackets like: {emailaddress}.";
            }
    
            #endregion
    
            #region Properties
    
            /// <summary>
            /// Gets or sets Email.
            /// </summary>
            [Umbraco.Forms.Core.Attributes.Setting("Email", description = "Enter the receiver email", control = "Umbraco.Forms.Core.FieldSetting.TextField")]
            public string Email { get; set; }
    
            /// <summary>
            /// Gets or sets From Email.
            /// </summary>
            [Umbraco.Forms.Core.Attributes.Setting("From Email", description = "Enter the from email (optional)", control = "Umbraco.Forms.Core.FieldSetting.TextField")]
            public string FromEmail { get; set; }
    
            /// <summary>
            /// Gets or sets From Name.
            /// </summary>
            [Umbraco.Forms.Core.Attributes.Setting("From Name", description = "Enter the from name (optional)", control = "Umbraco.Forms.Core.FieldSetting.TextField")]
            public string FromName { get; set; }
    
            /// <summary>
            /// Gets or sets ReplyTo.
            /// </summary>
            [Umbraco.Forms.Core.Attributes.Setting("ReplyTo", description = "Enter the reply-to email", control = "Umbraco.Forms.Core.FieldSetting.TextField")]
            public string ReplyTo { get; set; }
    
            /// <summary>
            /// Gets or sets Subject.
            /// </summary>
            [Umbraco.Forms.Core.Attributes.Setting("Subject", description = "Enter the subject", control = "Umbraco.Forms.Core.FieldSetting.TextField")]
            public string Subject { get; set; }
    
            /// <summary>
            /// Gets or sets Message.
            /// </summary>
            [Umbraco.Forms.Core.Attributes.Setting("Message", description = "Enter the intro message", control = "Umbraco.Forms.Core.FieldSetting.TextArea")]
            public string Message { get; set; }
    
            /// <summary>
            /// Gets or sets SendFields.
            /// </summary>
            [Umbraco.Forms.Core.Attributes.Setting("SendFields", description = "Send the content of the form fields in the email", control = "Umbraco.Forms.Core.FieldSetting.Checkbox")]
            public string SendFields { get; set; }
    
            /// <summary>
            /// Gets or sets Attachment.
            /// </summary>
            [Umbraco.Forms.Core.Attributes.Setting("Attachment", description = "Attach file uploads to email", control = "Umbraco.Forms.Core.FieldSetting.Checkbox")]
            public string Attachment { get; set; }
    
            #endregion
    
            #region Public Methods
    
            /// <summary>
            /// The execute.
            /// </summary>
            /// <param name="record">
            /// The record.
            /// </param>
            /// <param name="e">
            /// The Record event arguments.
            /// </param>
            /// <returns>
            /// The Workflow execution status
            /// </returns>
            public override WorkflowExecutionStatus Execute(Record record, RecordEventArgs e)
            {
                try
                {
                    MailAddress FromMailAddress;
                    if (string.IsNullOrEmpty(this.FromEmail))
                    {
                        FromMailAddress = new MailAddress(UmbracoSettings.NotificationEmailSender);
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(this.FromName))
                        {
                            FromMailAddress = new MailAddress(this.FromEmail);
                        }
                        else
                        {
                            FromMailAddress = new MailAddress(this.FromEmail, this.FromName);
                        }
                    }
                    var mailMessage = new MailMessage
                    {
                        From = FromMailAddress,
                        Subject = this.Subject,
                        ReplyTo = new MailAddress(this.ReplyTo),
                        IsBodyHtml = true,
                        BodyEncoding = Encoding.UTF8
                    };
    
    
                    if (this.Email.Contains(';'))
                    {
                        foreach (string email in this.Email.Split(';'))
                        {
                            mailMessage.To.Add(email.Trim());
                        }
                    }
                    else
                    {
                        mailMessage.To.Add(this.Email);
                    }
    
                    int lang = GetLanguageIdFromNodeId(record.UmbracoPageId);
    
                    mailMessage.Body = "<p>" + ReplaceDictionaryItems(this.Message, lang).Replace(@"\n", "<br/>") + "</p>";
    
                    if (this.SendFields == true.ToString())
                    {
                        mailMessage.Body += this.CreateList(record, mailMessage, lang);
                    }
    
                    var smtpClient = new SmtpClient { EnableSsl = false };
    
                    if (WebConfigurationManager.AppSettings.AllKeys.Contains("contourContribUseSsl") && WebConfigurationManager.AppSettings["contourContribUseSsl"].ToLower() == true.ToString().ToLower())
                    {
                        smtpClient.EnableSsl = true;
                    }
    
                    smtpClient.Send(mailMessage);
                }
                catch (Exception ex)
                {
                    Log.Add(LogTypes.Debug, -1, ex.Message);
                }
    
                return WorkflowExecutionStatus.Completed;
            }
    
            /// <summary>
            /// The validate settings.
            /// </summary>
            /// <returns>
            /// An exception list.
            /// </returns>
            public override List<Exception> ValidateSettings()
            {
                var exceptions = new List<Exception>();
                if (string.IsNullOrEmpty(this.ReplyTo))
                {
                    exceptions.Add(new Exception("'Reply-to' setting not filled out'"));
                }
    
                if (string.IsNullOrEmpty(this.Email))
                {
                    exceptions.Add(new Exception("'Email' setting not filled out'"));
                }
    
                if (string.IsNullOrEmpty(this.Message))
                {
                    exceptions.Add(new Exception("'Message' setting not filled out'"));
                }
    
                return exceptions;
            }
    
            #endregion
    
            #region Methods
    
            /// <summary>
            /// The get dictionary item.
            /// </summary>
            /// <param name="item">
            /// The dictionary key
            /// </param>
            /// <param name="lang">
            /// The language
            /// </param>
            /// <returns>
            /// The returned dictionary item
            /// </returns>
            private static string GetDictionaryItem(string item, int lang)
            {
                // multi word dictionary items are enclosed in square brackets
                string translation = new Dictionary.DictionaryItem(item).Value(lang);
    
                // need to check for empty string to show keyname when item not translated
                if (string.IsNullOrEmpty(translation))
                {
                    translation = item;
                }
    
                return translation;
            }
    
            /// <summary>
            /// The get language id from node id.
            /// </summary>
            /// <param name="nodeId">
            /// The node id.
            /// </param>
            /// <returns>
            /// The language id from node id.
            /// </returns>
            private static int GetLanguageIdFromNodeId(int nodeId)
            {
                Domain[] domains = library.GetCurrentDomains(nodeId);
    
                if (domains != null && domains.Length > 0)
                {
                    return domains[0].Language.id;
                }
    
                return 0;
            }
    
            /// <summary>
            /// The replace dictionary items.
            /// </summary>
            /// <param name="content">
            /// The content.
            /// </param>
            /// <param name="lang">
            /// The language
            /// </param>
            /// <returns>
            /// The replace dictionary items
            /// </returns>
            private static string ReplaceDictionaryItems(string content, int lang)
            {
                const string regexPattern = @"(?<!\w)#(?<dic>\w+)";
                MatchCollection tagMatches = Regex.Matches(content, regexPattern);
    
                foreach (Match match in tagMatches)
                {
                    string tagName = match.Groups["dic"].Value;
                    string replacement = GetDictionaryItem(tagName, lang);
                    content = content.Replace(match.Value, replacement);
                }
    
                return content;
            }
    
            /// <summary>
            /// The create list.
            /// </summary>
            /// <param name="record">
            /// The record.
            /// </param>
            /// <param name="mailMessage">
            /// The mail message.
            /// </param>
            /// <param name="lang">
            /// The language
            /// </param>
            /// <returns>
            /// An HTML list
            /// </returns>
            private string CreateList(Record record, MailMessage mailMessage, int lang)
            {
                var viewer = new RecordsViewer();
                XmlNode xml = viewer.GetSingleXmlRecord(record, new XmlDocument());
                XPathNavigator navigator = xml.CreateNavigator();
                XPathExpression selectExpression = navigator.Compile("//fields/child::*");
                selectExpression.AddSort("@pageindex", XmlSortOrder.Ascending, XmlCaseOrder.None, string.Empty, XmlDataType.Number);
                selectExpression.AddSort(
                    "@fieldsetindex", XmlSortOrder.Ascending, XmlCaseOrder.None, string.Empty, XmlDataType.Number);
                selectExpression.AddSort("@sortorder", XmlSortOrder.Ascending, XmlCaseOrder.None, string.Empty, XmlDataType.Number);
                XPathNodeIterator nodeIterator = navigator.Select(selectExpression);
                string list = "<dl>";
    
                XPathNavigator node = nodeIterator.Current.SelectSingleNode(".//value");
                if (this.Attachment == true.ToString() && node != null)
                {
                    // add attachment
                    string filelocation = HttpContext.Current.Server.MapPath("/idc/IDCAC01W(3)-1.pdf");
                    mailMessage.Attachments.Add(new Attachment(filelocation));
    
                }
                else
                {
                    XPathNavigator captionNode = nodeIterator.Current.SelectSingleNode("caption");
                    if (captionNode != null)
                    {
                        string caption = captionNode.Value;
    
                        if (caption.StartsWith("#"))
                        {
                            caption = GetDictionaryItem(caption.TrimStart('#'), lang);
                        }
    
                        list += "<dt><strong>" + caption + ": </strong><dt><dd>";
                    }
    
    
                while (nodeIterator.MoveNext())
                {
                    if (nodeIterator.Current == null)
                        {
                            continue;
                        }
    
    
    
                        XPathNodeIterator values = nodeIterator.Current.Select(".//value");
    
                        while (values.MoveNext())
                        {
                            if (values.Current != null)
                            {
                                list += values.Current.Value.Replace(Environment.NewLine, "<br />").Trim() + "<br />";
                            }
                        }
    
                        list += "</dd>";
                    }
                }
    
                list += "</dl>";
    
                return list;
            }
    
            #endregion
        }
    }
  • Jeroen Breuer 4861 posts 12138 karma points MVP 3x admin c-trib
    Mar 31, 2014 @ 15:29
    Jeroen Breuer
    0

    Hello,

    Are the smtp settings for the website ok? Do you have another form that does work?

    Jeroen

  • René 327 posts 852 karma points
    Mar 31, 2014 @ 15:30
    René
    0

    HI

    Yes i have other forms working

     

     

  • René 327 posts 852 karma points
    Mar 31, 2014 @ 15:33
    René
    0

    I can see in your previous post you have this in the end.

    I think i miss this SmtpClient....

    i.Body= body.Replace("{velden}", fieldHtml).Replace("{pageTitle}", pageTitle);

           
    SmtpClient smtpClient =newSmtpClient();

            smtpClient
    .Send(i);

           
    returnWorkflowExecutionStatus.Completed;
       
    }
  • Jeroen Breuer 4861 posts 12138 karma points MVP 3x admin c-trib
    Mar 31, 2014 @ 15:40
    Jeroen Breuer
    0

    I don't understand. In your code there is also an SmtpClient.

    Jeroen

  • René 327 posts 852 karma points
    Apr 02, 2014 @ 15:28
    René
    0

    Hi 

    if any on is in the same situation .

    After trying different version of the xslt Send email, extended. Testing and trying to get it to work.. 

    I rearranged the order for sending mails, not for any specifik reason and then it worked. 

    Rene´

  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies