Email

Labels
AJAX(112) App Studio(6) Apple(1) Application Builder(245) Application Factory(207) ASP.NET(95) ASP.NET 3.5(45) ASP.NET Code Generator(72) ASP.NET Membership(28) Azure(18) Barcode(2) Barcodes(3) BLOB(18) Business Rules(1) Business Rules/Logic(140) BYOD(13) Caching(2) Calendar(5) Charts(29) Cloud(14) Cloud On Time(2) Cloud On Time for Windows 7(2) Code Generator(54) Collaboration(11) command line(1) Conflict Detection(1) Content Management System(12) COT Tools for Excel(26) CRUD(1) Custom Actions(1) Data Aquarium Framework(122) Data Sheet(9) Data Sources(22) Database Lookups(50) Deployment(22) Designer(177) Device(1) DotNetNuke(12) EASE(20) Email(6) Features(101) Firebird(1) Form Builder(14) Globalization and Localization(6) How To(1) Hypermedia(2) Inline Editing(1) Installation(5) JavaScript(20) Kiosk(1) Low Code(3) Mac(1) Many-To-Many(4) Maps(6) Master/Detail(36) Microservices(4) Mobile(63) Mode Builder(3) Model Builder(3) MySQL(10) Native Apps(5) News(18) OAuth(8) OAuth Scopes(1) OAuth2(11) Offline(20) Offline Apps(4) Offline Sync(5) Oracle(10) PKCE(2) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(178) Reports(48) REST(29) RESTful(29) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(80) SharePoint(12) SPA(6) SQL Anywhere(3) SQL Server(26) Stored Procedure(4) Teamwork(15) Tips and Tricks(87) Tools for Excel(2) Touch UI(93) Transactions(5) Tutorials(183) Universal Windows Platform(3) User Interface(338) Video Tutorial(37) Web 2.0(100) Web App Generator(101) Web Application Generator(607) Web Form Builder(40) Web.Config(9) Workflow(28)
Archive
Blog
Email
Thursday, June 27, 2013PrintSubscribe
Import Processor Error Handling

Code On Time web apps come with a native CSV Import processor that will parse comma separated files and create new records. However, this native processor does not display any errors that may have occurred due to malformed CSV. Let’s override methods in the processor in order to handle and report these errors.

Start the app generator. Click on the project name, and press Develop to open the project in Visual Studio. In the Solution Explorer, right-click on ~/App_Code folder and press Add | Class.

Adding a class to App_Code folder.

Assign a name to the item and press OK to save. Replace the code base with the following:

C#:

using System;
using System.Collections.Generic;
using System.IO;
using MyCompany.Data;
using System.Net.Mail;

namespace MyCompany.Data
{
    public partial class CsvImportProcessor
    {
        protected override bool HandleError(ActionResult r, ActionArgs args)
        {

            string dir = AppDomain.CurrentDomain.BaseDirectory;
            using (StreamWriter file = new StreamWriter(dir + "\\ImportErrorLog.txt", true))
            {
                foreach (string s in r.Errors)
                    file.WriteLine(String.Format("{0:s}: {1}",DateTime.Now, s));
            }
            return true;
        }

        protected override void ReportErrors(string controller, string recipients, string logFileName)
        {
            string[] recipientsList = recipients.Split(',');
            SmtpClient client = new SmtpClient();
            foreach (string s in recipientsList)
            {
                string address = s.Trim();
                if (!(String.IsNullOrEmpty(address)))
                {
                    MailMessage message = new MailMessage();
                    try
                    {
                        message.To.Add(new MailAddress(address));
                        message.Subject = String.Format("Import of {0} has been completed", controller);
                        message.Body = File.ReadAllText(logFileName);
                        client.Send(message);
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }
    }
}

Visual Basic:

Imports Microsoft.VisualBasic
Imports System.IO
Imports MyCompany.Data
Imports System.Net.Mail

Namespace MyCompany.Data
    Partial Public Class CsvImportProcessor
        Protected Overrides Function HandleError(r As ActionResult, args As ActionArgs) As Boolean
            Dim dir As String = AppDomain.CurrentDomain.BaseDirectory
            Using file As StreamWriter = New StreamWriter(dir + "\\ImportErrorLog.txt", True)
                For Each s As String In r.Errors
                    file.WriteLine(String.Format("{0:s}: {1}", DateTime.Now, s))
                Next
                Return True
            End Using
        End Function

        Protected Overrides Sub ReportErrors(controller As String, recipients As String, logFileName As String)
            Dim recipientsList() As String = recipients.Split(Global.Microsoft.VisualBasic.ChrW(44))
            Dim client As SmtpClient = New SmtpClient()
            For Each s As String In recipientsList
                Dim address As String = s.Trim()
                If Not (String.IsNullOrEmpty(address)) Then
                    Dim message As MailMessage = New MailMessage()
                    Try
                        message.To.Add(New MailAddress(address))
                        message.Subject = String.Format("Import of {0} has been completed", controller)
                        message.Body = File.ReadAllText(logFileName)
                        client.Send(message)
                    Catch __exception As Exception
                    End Try
                End If
            Next
        End Sub
    End Class
End Namespace

The first method above will create a file “ImportErrorLog.txt” in the application folder and write every error that occurred. It returns true in order to cancel the default handling. The second method overrides the default error reporting and sends an email to the specified recipient. This requires web app SMTP configuration. If a malformed CSV file was imported, the ImportErrorLog.txt file will look like the picture below.

Log text file logging all errors when importing.

Wednesday, May 16, 2012PrintSubscribe
Introducing Email Business Rules

Email is a lifeblood of operations in any organization. If the emails are not flowing smoothly, then things are not getting done, customers are unhappy, nobody knows what is going on. Line-of-business web applications are the backbone of operations. Integrated email notifications are an absolute necessity.

Code On Time web applications have a built-in support for Email Business Rules. The application framework processes this type of business rules by sending email notifications in response to user actions or events in the lifecycle of data controllers.

Imagine that you are running a mail order company called Northwind and would like to be notified when a new customer is registered in the database.

Start Project Designer and right-click Customers / Business Rules node on Controllers tab of Project Explorer.

Adding a new business rule to a data controller in a web app created with Code On Time application generator

Enter the following properties and click OK button to save the new email business rule.

Property Value
Command Name Insert
Type Email
Phase After
Script
Host: smtp.gmail.com
Port: 587
UserName: YOUR_EMAIL_ADDRESS@gmail.com
Password: PASSWORD
EnableSSL: true

From: "Sales Admin" <YOUR_EMAIL_ADDRESS@gmail.com>
To: RECEIPIENT@northwind.com
Subject: We have a new customer "{CompanyName}"!

<html>
<body>
<i>Customer Information</i>
<br />
<br />
<table>
  <tr>
    <td>Company:</td>
    <td><b>{CompanyName}</b></td>
  </tr>
  <tr>
    <td>Contact:</td>
    <td>{ContactName}, {ContactTitle}</td>
  </tr>
  <tr>
    <td valign="top">Address:</td>
    <td>
        {Address}<br />
        {City}, {Region} {PostalCode}
    </td>
  </tr>
  <tr>
    <td>Country:</td><td>{Country}</td>
  </tr>
  <tr>
    <td>Phone:</td><td>{Phone}</td>
  </tr>
  <tr>
  <td>Fax:</td><td>{Fax}</td>
  </tr>
  </table>
<br />
<br />
Northwind,
Administrator
</body>
</html>

Make sure to replace the highlighted email addresses and Host with your own email addresses and host information. The host parameter in the script points to Gmail smtp server. If you have an existing account at Hotmail or Microsoft Live, then replace the Host with smtp.live.com address.

This is how the business rule will look in the hierarchy of Customers data controller.

An email business rule in the hierarchy of Customers data controller

The bottom portion the business rule script is the email body. It uses HTML tags and references to the field names of the data controller. The field references are placed in curly brackets.

Navigate to Customers page and start entering a new customer.

Adding a new customer in the Northwind sample created with Code On Time web application generator

Click OK button when finished. If everything is correct, then the new customer record will be selected in the view mode on Customers page. If there were any mistakes during email delivery, then you will see an error message at the top of the page.

Check the inbox of the notification email recipient. This is how the message may look in Gmail.

An email notification send by Email Business Rule when a new customer record is created in the database

Email Business Rules are defined in data controllers. Developers can use data controller virtualization to inspect the user identity and dynamically attach notifications to the data controllers. The definitions of notifications can be stored elsewhere in the database.