Developer forum
E-mail notifications
Dynamic Recipient e-mail for "Sending" the form data
I am using DW7 forms module and we wish to send the form data to a dynamic email address (based on user choice). In the old form module it was possible to use javascript to change a hidden input field FM_ToEmail to do so. How so I do this in forms-dw7 module?
edit:
This is for option "Send the form via e-mail" and not for the "Send a receipt via e-mail" option.
Thanks.
Replies
http://manual.dynamicweb-cms.com/Dynamicweb-On-line-Manual/Modules/Data-Lists/Forms/Paragraph-settings.aspx
Under "Send the form via e-mail" option, I need "Sender e-mail" and "Recipient e-mail" both to be dynamic. The problem is that for "Send form" option recipient is fixed and for "Send receipt" option sender is fixed.
Thank you very much for your help :)
Deployment phase is very simple - just copy the assembly (.dll file) to the \bin folder of your Dynamicweb installation. The system will pick it up when it starts.
-- Pavel
Thanks for the help guys.
I'm having trouble deploying my mailformsave provider, i've made changes to the mailformsaveprovider and deployed it in a "custommodules" project, but the changes i have made don't appear in the paragraph module setup screen for my forms module.
What i did was add a new field for the recipient checkbox, so you can chose recipient as a field value.
Am i missing something here? do i need to change an edit form template somewhere for the field to be available?
Hey Pavel
Having some trouble deploying my mailformsaveprovider, ive added a new "get from form" field for the recipient email field. Either im deploying it wrong, because it doesn't show up on the paragraph forms module setup screen or i am missing some change somewhere other than the mailformsaveprovider module. Ive deployed the changes as a "custom module" project to the Bin folder of the application.
Do you have any idea what the problem could be?
Hi Morten,
Does the field you created have a "public" access modifier? Can we see some relevant code?
-- Pavel
This is the code for my field:
Private _MailToUseField As Boolean = False
....
< _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.UseFromFieldForRecipientEmail"), _ AddInLabel("Get from form"), _ AddInParameterEditor(GetType(Editors.YesNoParameterEditor), "jsOnClick=ShowFieldSelector('MailFormSaveProvider.RecipientEmail', this)") _ > _ Public Property MailToUseField() As Boolean Get Return _MailToUseField End Get Set(ByVal value As Boolean) _MailToUseField = value End Set End Property
MailToEmail = MailTo If MailToUseField Then For Each key As String In KeysAndValues.Keys If key = MailTo Then MailToEmail = Base.ChkString(KeysAndValues(key)) End If Next End If
The code looks fine. Does the app recycle when you update the DLL?
-- Pavel
Tried recycling manually too.. didn't change anything..
My point is that if the app doesn't recycle when you update the DLL then you place it into the wrong /bin folder. Could you check this (in IIS make sure the /bin folder under the website matches the physical location where you copy your DLL)?
-- Pavel
Sorry.. it does recycle yes... but tried it manually too :)
Which version of Dynamicweb are you using?
-- Pavel
8.1.1.7 is the version.
Hi Morten,
Does your class inherit from the correct base class? Can you post the full code?
Imar
Namespace Modules.DataManagement < _ AddInName("DM.Form.SendMail"), _ AddInLabel("Send the form over mail"), _ AddInDescription("This will send an email with all form elements.") _ > _ Public Class MailFormSaveProvider Inherits FormSaveProvider Implements IDropDownOptions Private _MailTo As String = "" Private _MailToUseField As Boolean = False Private _MailFrom As String = "" Private _MailFromName As String = "" Private _MailFromUseField As Boolean = False Private _MailFromNameUseField As Boolean = False Private _MailCC As String = "" Private _MailBCC As String = "" Private _MailSubject As String = "" Private _MailTemplate As String = "" Private _MailEncoding As Text.Encoding = Text.Encoding.UTF8 Private _MailLogging As Boolean = True < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.SenderName"), _ AddInLabel("Sender name"), _ AddInParameterEditor(GetType(Editors.TextParameterEditor), "NewGUI=true") _ > _ Public Property MailFromName() As String Get Return _MailFromName End Get Set(ByVal value As String) _MailFromName = value End Set End Property < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.UseFormFieldForSenderName"), _ AddInLabel("Get from form"), _ AddInParameterEditor(GetType(Editors.YesNoParameterEditor), "jsOnClick=ShowFieldSelector('MailFormSaveProvider.SenderName', this)") _ > _ Public Property MailFromNameUseField() As Boolean Get Return _MailFromNameUseField End Get Set(ByVal value As Boolean) _MailFromNameUseField = value End Set End Property < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.SenderEmail"), _ AddInLabel("Sender e-mail"), _ AddInParameterEditor(GetType(Editors.TextParameterEditor), "NewGUI=true") _ > _ Public Property MailFrom() As String Get Return _MailFrom End Get Set(ByVal value As String) _MailFrom = value End Set End Property < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.UseFormFieldForSenderEmail"), _ AddInLabel("Get from form"), _ AddInParameterEditor(GetType(Editors.YesNoParameterEditor), "jsOnClick=ShowFieldSelector('MailFormSaveProvider.SenderEmail', this)") _ > _ Public Property MailFromUseField() As Boolean Get Return _MailFromUseField End Get Set(ByVal value As Boolean) _MailFromUseField = value End Set End Property < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.RecipientEmail"), _ AddInLabel("Recipient e-mail"), _ AddInParameterEditor(GetType(Editors.TextParameterEditor), "NewGUI=true") _ > _ Public Property MailTo() As String Get Return _MailTo End Get Set(ByVal value As String) _MailTo = value End Set End Property < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.UseFromFieldForRecipientEmail"), _ AddInLabel("Get from form"), _ AddInParameterEditor(GetType(Editors.YesNoParameterEditor), "jsOnClick=ShowFieldSelector('MailFormSaveProvider.RecipientEmail', this)") _ > _ Public Property MailToUseField() As Boolean Get Return _MailToUseField End Get Set(ByVal value As Boolean) _MailToUseField = value End Set End Property < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.RecipientCCEmail"), _ AddInLabel("Recipient CC e-mail"), _ AddInParameterEditor(GetType(Editors.TextParameterEditor), "NewGUI=true") _ > _ Public Property MailCC() As String Get Return _MailCC End Get Set(ByVal value As String) _MailCC = value End Set End Property < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.RecipientBCCEmail"), _ AddInLabel("Recipient BCC e-mail"), _ AddInParameterEditor(GetType(Editors.TextParameterEditor), "NewGUI=true") _ > _ Public Property MailBCC() As String Get Return _MailBCC End Get Set(ByVal value As String) _MailBCC = value End Set End Property < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.Subject"), _ AddInLabel("Subject"), _ AddInParameterEditor(GetType(Editors.TextParameterEditor), "NewGUI=true") _ > _ Public Property MailSubject() As String Get Return _MailSubject End Get Set(ByVal value As String) _MailSubject = value End Set End Property < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.Template"), _ AddInLabel("Template"), _ AddInParameterEditor(GetType(Editors.TemplateParameterEditor), "folder=/Templates/DataManagement/Forms/Email;FullPath=false;NewGUI=true") _ > _ Public Property MailTemplate() As String Get Return _MailTemplate End Get Set(ByVal value As String) _MailTemplate = value End Set End Property < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.Encoding"), _ AddInLabel("Encoding"), _ AddInParameterEditor(GetType(Editors.DropDownParameterEditor), "NewGUI=true;SortBy=Value") _ > _ Public Property MailEncodingCodePage() As Integer Get Return _MailEncoding.CodePage End Get Set(ByVal value As Integer) Dim enc As Text.Encoding = Text.Encoding.GetEncoding(value) _MailEncoding = enc End Set End Property < _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MailFormSaveProvider.UseLogging"), _ AddInLabel("Logging"), _ AddInParameterEditor(GetType(Editors.YesNoParameterEditor), "") _ > _ Public Property MailLogging() As Boolean Get Return _MailLogging End Get Set(ByVal value As Boolean) _MailLogging = value End Set End Property Public Function GetOptions(ByVal name As String) As Hashtable Implements IDropDownOptions.GetOptions Dim ht As New Hashtable() Dim encArray() As Text.EncodingInfo = Text.Encoding.GetEncodings 'Array.Sort(encArray, AddressOf CompareDisplayName) For Each enc As Text.EncodingInfo In encArray If Not ht.ContainsKey(enc.CodePage) Then ht.Add(enc.CodePage, enc.DisplayName) End If Next Return ht End Function Public Overrides Function Save(ByVal Form As FormSetting, ByVal KeysAndValues As Dictionary(Of String, Object)) As Boolean Dim sb As New Text.StringBuilder Dim isSaved As Boolean = False Dim hasError As Boolean = False Dim SendMail As Boolean = False Dim DWSmtpServer As String = "" Dim MailFromEmail As String = "" Dim MailFromNameValue As String = "" Dim MailTemplateContext As String = "" Try '############################ 'Building template context '############################ Dim template As New Templatev2.Template("DataManagement/Forms/Email/" & MailTemplate) Dim fields As FormFieldCollection = Form.Fields Dim fieldsTmp As New FormFieldCollection fieldsTmp.AddRange(fields) For Each field As FormField In fieldsTmp If KeysAndValues.ContainsKey(field.SystemName) Then field.Value = Base.ChkString(KeysAndValues(field.SystemName)) Else Form.Fields.Remove(field) End If Next Dim render As New FormRenderer() MailTemplateContext = render.RenderForm(Form, template) '############################ 'Email settings '############################ DWSmtpServer = Base.ChkString(Base.GetGs("/Globalsettings/System/MailServer/Server")) 'Set values for MailFromNameValue and MailFromEmail. They may be overridden later. MailFromNameValue = MailFromName MailFromEmail = IIf(String.IsNullOrEmpty(MailFrom), Base.ChkString(Base.GetGs("/Globalsettings/Settings/CommonInformation/Email")), MailFrom).ToString If MailFromUseField OrElse MailFromNameUseField Then For Each key As String In KeysAndValues.Keys If key = MailFrom Then MailFromEmail = Base.ChkString(KeysAndValues(key)) End If If MailFromNameUseField AndAlso key = MailFromName Then MailFromNameValue = Base.ChkString(KeysAndValues(key)) End If Next End If If String.IsNullOrEmpty(MailFrom) Then MailFrom = "noreply@dynamicweb.dk" Dim objEmail As New System.Net.Mail.MailMessage If _MailEncoding IsNot Nothing Then objEmail.BodyEncoding = _MailEncoding Else objEmail.BodyEncoding = Text.Encoding.UTF8 End If MailToEmail = MailTo If MailToUseField Then For Each key As String In KeysAndValues.Keys If key = MailTo Then MailToEmail = Base.ChkString(KeysAndValues(key)) End If Next End If If Not Base.ValidateEmail(MailToEmail) Then SetInvalidEmailMessage(MailToEmail) End If objEmail.To.Add(MailToEmail) If Not String.IsNullOrEmpty(MailCC) Then If MailCC.Contains(";") Then Dim MailCCArray() As String = MailCC.Split(";"c) For Each address As String In MailCCArray Dim addr As String = address.Trim() If Not Base.ValidateEmail(addr) Then SetInvalidEmailMessage(addr) End If objEmail.CC.Add(addr) Next Else If Not Base.ValidateEmail(MailCC) Then SetInvalidEmailMessage(MailCC) End If objEmail.CC.Add(MailCC) End If End If If Not String.IsNullOrEmpty(MailBCC) Then If MailBCC.Contains(";") Then Dim MailBCCArray() As String = MailBCC.Split(";"c) For Each address As String In MailBCCArray Dim addr As String = address.Trim() If Not Base.ValidateEmail(addr) Then SetInvalidEmailMessage(addr) End If objEmail.Bcc.Add(addr) Next Else If Not Base.ValidateEmail(MailBCC) Then SetInvalidEmailMessage(MailBCC) End If objEmail.Bcc.Add(MailBCC) End If End If If Not String.IsNullOrEmpty(MailFromNameValue) Then objEmail.Sender = New Net.Mail.MailAddress(MailFromEmail, MailFromNameValue) Else objEmail.Sender = New Net.Mail.MailAddress(MailFromEmail) End If objEmail.From = objEmail.Sender objEmail.Subject = MailSubject objEmail.IsBodyHtml = True objEmail.Body = MailTemplateContext isSaved = EmailHandler.Send(objEmail, MailLogging) objEmail.Dispose() Catch ex As DataException isSaved = False End Try Return isSaved End Function Private Sub SetInvalidEmailMessage(ByVal mailAddress As String) HttpContext.Current.Response.Write(String.Format("<script>alert('Email address: \'{0}\' is invalid.');history.back(-1);</script>", mailAddress)) HttpContext.Current.Response.End() End Sub Private Function CompareDisplayName(ByVal first As Text.EncodingInfo, ByVal second As Text.EncodingInfo) As Integer Return String.Compare(first.DisplayName, second.DisplayName, True) End Function End Class End Namespace
Hi Morten
I think the issue is related to the fact that you've copied the entire code from our implementation of that provider. So unless you've built your own Dynamicweb based on the entire code, you now have two providers with the same AddInName and type signature. You should call your custom implementation something different from the standard provider as they can't--and shouldn't--exist side-by-side.
Hope this helps :)
- Jeppe
Yeah you are right.. but i have now tried renaming the class, addin name etc. and still no go. It doesn't show up as a provider which i can choose in the forms module setup screen (im guessing that is should happen as there is no documentation for this provider).
< _ AddInName("MyExtendedFormSaveProvider"), _ AddInLabel("Send the form over mail"), _ AddInDescription("This will send an email with all form elements.") _ > _ Public Class MyExtendedFormSaveProvider Inherits FormSaveProvider Implements IDropDownOptions Private _MailTo As String = "" Private _MailToUseField As Boolean = False Private _MailFrom As String = "" Private _MailFromName As String = "" Private _MailFromUseField As Boolean = False Private _MailFromNameUseField As Boolean = False Private _MailCC As String = "" Private _MailBCC As String = "" Private _MailSubject As String = "" Private _MailTemplate As String = "" Private _MailEncoding As Text.Encoding = Text.Encoding.UTF8 Private _MailLogging As Boolean = True
And the properties
< _ AddInParameterGroup("Mail configuration"), _ AddInParameter("MyExtendedFormSaveProvider.UseFromFieldForRecipientEmail"), _ AddInLabel("Get from form"), _ AddInParameterEditor(GetType(Editors.YesNoParameterEditor), "jsOnClick=ShowFieldSelector('MyExtendedFormSaveProvider.RecipientEmail', this)") _ > _ Public Property MailToUseField() As Boolean Get Return _MailToUseField End Get Set(ByVal value As Boolean) _MailToUseField = value End Set End Property
Are you sure your code is compiling correctly? I tried your code as-is and it didn't compile because MailToMail is undefined.... I also got errors on the TemplateV2 namespace....
Imar
Thats odd... how are you compiling it?
Imar.. you are right.. somehow i got this mixed into an C# project (doh!), hence no errors when i compiled. :)
All is working now.. and the provider is shown.
Thanks Imar and support :)
Yes, that's exactly what should happen. Documentation here: http://developer.dynamicweb-cms.com/Admin/Public/DWSDownload.aspx?File=Files%2fFiler%2fDocumentation%2fDevelopment%2fModules%2f(en-US)+Data+Management+Extensibility+API.pdf
I did the same thing as Imar and got the same issue. I fixed it by instanciating the MailToEmail:
Dim MailToEmail As String = MailTo
That solved the issue for me and I could see the provider in the paragraph setup.
- Jeppe
I see you solved it on your own also.
I'm just too slow I guess ;)
Against Dynamicweb 8.1.1.5 (didn't have 1.1.7 here), against .NET 4 and with Option Explicit turned on at the project level.
Maybe you're compiling against an older version of DW locally and your code crashes at the server because TemplateV2.Template is obsolete?
Imar
>> I'm just too slow I guess ;)
Same here..... ;-)
Nope... 8.1.1.7 is the version im compiling against and is the right one :)
Problem was, as i stated above, that i didn't see any errors because i had the code compiling in a C# project by mistake. And thinking everything was alright when it compiled and said no errors.
But once again thanks for leading me on the right track :)
You must be logged in to post in the forum