asp tutorials, asp.net tutorials, sample code, and Microsoft news from 15Seconds
Data Access  |   Troubleshooting  |   Security  |   Performance  |   ADSI  |   Upload  |   Email  |   Control Building  |   Component Building  |   Forms  |   XML  |   Web Services  |   ASP.NET  |   .NET Features  |   .NET 2.0  |   App Development  |   App Architecture  |   IIS  |   Wireless
 
Pioneering Active Server
 Power Search








Active News
15 Seconds Weekly Newsletter
• Complete Coverage
• Site Updates
• Upcoming Features

More Free Newsletters
Reference
News
Articles
Archive
Writers
Code Samples
Components
Tools
FAQ
Feedback
Books
Links
DL Archives
Community
Messageboard
List Servers
Mailing List
WebHosts
Consultants
Tech Jobs
15 Seconds
Home
Site Map
Press
Legal
Privacy Policy
internet.commerce














internet.com
IT
Developer
Internet News
Small Business
Personal Technology
International

Search internet.com
Advertise
Corporate Info
Newsletters
Tech Jobs
E-mail Offers

HardwareCentral
Compare products, prices, and stores at Hardware Central!

Creating Efficient Mail Processing Systems - Part 2
By Thiru Thangarathinam
Rating: 4.5 out of 5
Rate this article


  • email this article to a colleague
  • suggest an article

    Introduction

    Part two of this article begins with an understanding of how to use transaction services provided by component services, but first let's look at the component services in Windows 2000.

    Component services in Windows 2000 have a wealth of enterprise functionality that provides all the plumbing required for creating distributed, Web-enabled applications. Although COM+ Services were originally designed for use with COM components, it would be nice if .NET components could also use them because of services such as object pooling, database connection pooling, sharing resources, role based security and distributed transaction processing monitoring that the COM+ runtime provides. This article will show how to leverage services provided by COM+ (known as Enterprise Services) to execute our mail-processing component as part of a transaction.

    In the .NET Framework, there is a separate namespace called System.EnterpriseServices that contains all the classes required for providing COM+ services to applications. One of the important classes present in the System.EnterpriseServices namespace is ServicedComponent. In the following section, we will take a quick look at the ServicedComponent class.

    ServicedComponent

    To be able to create .NET objects that make use of COM+ services, we need to derive our objects from the ServicedComponent class, which provides methods for our objects to interact seamlessly with the COM+ runtime, allowing the object to utilize the COM+ services.

    It contains the following methods that are directly related to the lifetime of the object.

    • Activate - Allows us to initialize the object when the object is activated. By object activation, we mean the process in which either a new instance of the object is created or an existing object from the pool is used
    • Deactivate - We can use this method to release all the resources that may have been initialized during the Activate method.
    • CanBePooled - Allows us to notify the COM+ whether we want our object to be pooled for reuse.
    It also provides the following method that facilitates passing parameters to the object at the time of object construction.
    • Construct - Connection strings to the database is one of the typical parameters that can be passed to the object through this method

    ContextUtil

    Using ContextUtil is the preferred way to access the object context of COM+. The methods present in the ContextUtil class are the primary means through which applications written in managed code can communicate with COM+ runtime. This class can be considered as a replacement for the ObjectContext object that was used in the pre .NET world in languages such as VB6, C++, ATL, and so on. As we already discussed, two important features provided by COM+ are transaction processing monitoring and object pooling. COM+ internally maintains two flags namely Done bit and Consistency bit, which are used to vote for the outcome of a transaction and to control the deactivation of objects.

    • SetComplete
      This method sets both done and consistency flags to true which indicates that the current transaction can be committed and the object can be deactivated.
    • SetAbort
      This method sets the done bit to true and consistency flag to false, indicating that the current transaction be rolled back and the object deactivated.
    • EnableCommit
      Sets the done bit to false and consistency flag to true.
    • DisableCommit
      Sets both done and consistency flags to false.

    We can use the above methods to work on the combination of done and consistency bits so that we can notify the COM+ runtime about the state of the transaction and whether the object can be deactivated.

    However, there are times where you may want to manipulate the done and consistency bits individually to have a finer level of control over the transaction control and the object deactivation processes.

    ContextUtil class exposes the following two properties through which we can deal with the done bit and consistency bit individually.

    • MyTransactionVote - Consists of a property get and set through which we can either get or set the value of the consistency bit.
    • DeactivateOnReturn - Consists of a property get and set, which are used to either get or set the value of the done bit.

    AutoCompleteAttribute

    Before we go on to look at the AutoCompleteAttribute, let us see what an attribute is and the role of attributes in the .NET Framework. Attributes are declarative tags that allow the developer to attach additional information to assemblies, classes, methods or properties. This additional information is made available to the applications at runtime through a process known as reflection. We can define reflection as the process which allows us to examine types at runtime.

    When a method is decorated with the AutoComplete attribute, it indicates that when the method returns successfully, the ContextUtil.SetComplete method will be automatically called and if the method throws an exception, the ContextUtil.SetAbort will be called to abort the transaction.

    It is also important to note that when we refer to the AutoCompleteAttribute class in our code, we will be simply referring to it as "AutoComplete". When the compiler comes across this line, it automatically appends the keyword "Attribute" to it and searches for the class named AutoCompleteAttribute. We will see an example of this in action when we add this attribute to our mail-processing component.

    Adding Transaction Support to the Mail Processing Component

    To add transaction support to the mail-processing component, we need to go through the following steps.

    • First, create a key file using the sn.exe utility. The screenshot of sn.exe utility in action is shown below.

    • Then you need to modify the AssemblyInfo.cs file to reference the key file created in the previous step. For example, to reference the key file named MailProcessingLib.snk from the mail-processing component, we need to add the following line of code to the AssemblyInfo.cs file in the MailProcessingLib project.
      
      
    • Now you need to modify the code in the MailHelper.cs file to derive the MailHelper class from the ServicedComponent class. Before we do that, we also need to reference the System.EnterpriseServices namespace from our project so that we can use the classes under that namespace. To accomplish this, add reference to the System.EnterpriseServices assembly using the Add Reference dialog box and then add the following line of code at the top of the MailHelper.cs file. using System.EnterpriseServices;

    Now you can add COM+ related attributes to the MailHelper class to leverage the COM+ services from the mail-processing component. To accomplish this, you need to modify the MailHelper class. After modification, the MailHelper class should look like the following. For sake of brevity, the following code listing shows only the lines of code that are affected by the addition of COM+ related attributes.

    [Transaction(TransactionOption.Supported)]

           public class MailHelper : ServicedComponent

           {

                  public MailHelper()

                  {

                         //

                         // Private Constructor

                         //                  

                  }

                 

                  [AutoComplete]

    public void SendMail(MailTemplate template, MailAttributeCollection mailAttrCollection)

                  {

                                                    -    -    -   -   --

                                                    -    -    -   -   --

                                    }

                                    -    -    -   -   --

    -    -    -   -   --

     

    }

    As part of the class declaration, we decorate the MailHelper class with the Transaction attribute TransactionOption.Supported, which indicates if the caller of this object runs in a transaction, it will be inherited by this object; otherwise, it will run without a transaction. Then we also derive our MailHelper class from the ServicedComponent class allowing the MailHelper class to leverage the COM+ services.

    Then we add the AutoComplete attribute to the SendMail method as shown in the following line.

    [AutoComplete]

    public void SendMail(MailTemplate template, MailAttributeCollection mailAttrCollection)

    If the method executes successfully and no exceptions are thrown, then the AutoComplete attribute automatically commits all the transactions for us by calling the SetComplete method of the ContextUtil class. If an exception occurs during the execution of that method, then SetAbort of ContextUtil is automatically called to undo the operation performed within the method.

    That's all we have to do to add transaction support to our mail-processing component. Now that we have enabled the transaction support to our component, the client object can easily include the MailHelper object as part of an existing transaction. For example, a client object that is using the Transaction attribute TransactionOption.Required will automatically include our MailHelper object as part of its existing transaction when it invokes the SendMail method of MailHelper class.

    Implementation of Windows Service Application

    In this section, we will see how to write the Windows Service application used to retrieve the mail details from an SQL Server table and send it to the users. We will start by creating a Visual C# Windows Service application named MailQueueProcessingService as shown in the following dialog box.

    Once the project is created, we will rename the service class from Service1 to MailService class. Then we add a timer component to the MailService class and name it timerProcessingService. We also set the Interval property of the timer component to 3000 as shown in the following properties window.

    In the Elapsed event of the timer, we will add the following lines of code.

    private void timerProcessingService_Elapsed(object sender, System.Timers.ElapsedEventArgs e)

    {

           StringBuilder mailQueueIDs = new StringBuilder();

           EventLog.WriteEntry("Elapsed");

           //Get all the mails from the database

           DataSet mailDataSet = GetMails();

           DataTable mailTable = mailDataSet.Tables[0];

           foreach (DataRow row in mailTable.Rows)

           {

                  string from = (string)row["FromMailAddress"];

                  string toList = (string)row["ToMailAddress"];

                  string ccList = (string)row["CCList"];

                  string bccList = (string)row["BccList"];

                 string subject = (string)row["Subject"];

                  int importance = (int)row["Priority"];

                  string body = (string)row["Body"];

                  string attachments = (string)row["Attachments"];

                  int mailQueueID = (int)row["MailQueueID"];

                  SendMail(from,toList,ccList,bccList,subject,importance,

                  body,attachments);

                  if (mailQueueIDs.Length > 0)

                         mailQueueIDs.Append(",");

                  mailQueueIDs.Append(mailQueueID.ToString());                         }

           //Update the status for all the Sent mails

           UpdateMailStatus(mailQueueIDs.ToString());

    }

    In the above lines of code, we start by retrieving all the unsent mails from the MailQueue table using the helper method named GetMails. We will look at the implementation of this method in a moment. Once we get all the unsent mails in the form of a DataSet, we then get reference to the DataTable object into a local variable. Then we loop through all the rows contained in the DataTable object using a for...each construct. Inside the for...each loop, we invoke the SendMail helper method for every row in the DataTable object to send the mail. While looping through the DataTable, we also append the identifier that is used to identify the row in the MailQueue table to a StringBuilder object. Finally, we invoke another private method named UpdateMailStatus to update the status of those mails from 0 to 1 to indicate that they have already been sent.

    GetMails Method

    As the name suggests, this method is used to retrieve all the unsent mail from the MailQueue table. To accomplish this, this method executes a stored procedure named usp_GetMailMessage, which is defined as shown below.

    
    CREATE procedure usp_GetMailMessage
    as
    begin
    set nocount on
    select * from MailQueue where MailSent = 0
    end
    
    
    The stored procedure returns all the records from the MailQueue table where the MailSent status is 0.

    The GetMails method starts off by retrieving the connection string from the database. It then creates an instance of the SqlDataAdapter object and passes in the name of the stored procedure and the SqlConnection object as its arguments. Then it invokes the Fill method of SqlDataAdapter object to execute the stored procedure and return the results of the stored procedure execution in the form of a DataSet object. Finally it returns the DataSet object back to the calling method.

    private DataSet GetMails()

    {                   

    System.Configuration.AppSettingsReader configurationAppSettings = new System.Configuration.AppSettingsReader();

           string connString = 

    ((string)(configurationAppSettings.GetValue("connectionString", typeof(string))));

           DataSet mailDataSet = new DataSet();

           using (SqlConnection sqlConn = new SqlConnection(connString))

           {

                  SqlDataAdapter adapter = new

                  SqlDataAdapter("usp_GetMailMessage",sqlConn);

                  adapter.Fill(mailDataSet);

           }

           return mailDataSet;              

    }

    UpdateMailStatus method

    The UpdateMailStatus method basically updates the status of sent mails from 0 to 1. It does that by executing a stored procedure named usp_UpdateMailMessage, which is defined as follows:

    
    CREATE procedure usp_UpdateMailMessage
    @MailQueueIDs  varchar(7000)
    as
    begin
                set nocount on
                declare @sql  varchar(8000)
                if @MailQueueIDs = ''
                    select @MailQueueIDs = null
                select @SQL = 'UPDATE MailQueue SET MailSent = 1 WHERE 
                    MailQueueID IN (' + @MailQueueIDs + ')'
                exec  (@SQL)
    end
    
    
    As you can see from the stored procedure definition, it accepts a comma-separated list of MailQueue Identifiers as an argument. The UpdateMailStatus method executes the stored procedure using an SqlCommand object. After creating the SqlCommand object, it then appends the MailQueueIDs parameter to it using the SqlParameter object.

    private void UpdateMailStatus(string mailQueueIDs)

    {

           System.Configuration.AppSettingsReader configurationAppSettings = new

           System.Configuration.AppSettingsReader();

           string connString = 

    ((string)(configurationAppSettings.GetValue("connectionString", typeof(string))));

           SqlConnection sqlConn = new SqlConnection(connString);

           sqlConn.Open();

           SqlCommand command = new SqlCommand("usp_UpdateMailMessage", sqlConn);

           command.CommandType = CommandType.StoredProcedure;                  

           //Set the MailQueueIDs Parameter

           SqlParameter paramMailQueueIDs = new SqlParameter("@MailQueueIDs",

           SqlDbType.VarChar,7000);

           paramMailQueueIDs.Direction = ParameterDirection.Input;

           paramMailQueueIDs.Value = mailQueueIDs;

           command.Parameters.Add(paramMailQueueIDs);                                 //Execute the stored procedure

           command.ExecuteNonQuery();

           sqlConn.Close();

     

    }

    SendMail Method

    The SendMail method is the one that actually sends mails to the users by using the SmtpMail class that is contained in the System.Web.Mail namespace. It does that by creating an instance of the MailMessage object and setting its properties to appropriate values. Some of the important properties exposed by the MailMessage object include From, To, Cc, Bcc, Subject, Body, BodyFormat, and Priority.

    private void SendMail(string from, string toList, string ccList,string bccList, string subject, int importance, string body, string attachments)

    {

           string attachmentsPath ;

           //Convert the integer based importance to MailPriority

           MailPriority priority = (MailPriority)importance;                   

           MailMessage mail = new MailMessage();

           mail.From = from;

           mail.To = toList;

           mail.Cc = ccList;

           mail.Bcc = bccList;

           mail.Subject = subject;

           mail.Body = body;

           mail.BodyFormat = MailFormat.Html;

           mail.Priority = priority;        

           attachments = attachments.Trim();

           System.Configuration.AppSettingsReader configurationAppSettings = new

           System.Configuration.AppSettingsReader();

           attachmentsPath =

    ((string)(configurationAppSettings.GetValue("attachmentsLocation", typeof(string))));

    After setting all the properties of the MailMessage object, it then checks to see if any attachments need to be sent along with the mail. If so, it then splits the variable that contains the comma separated list of attachments into an array by using the Split method. Then it loops through the array and creates an instance of the MailAttachment object, passing in the path of the attachment to its constructor. Then it adds the MailAttachment object to the Attachments collection of MailMessage object.

           if (attachments.Length !=0)

           {

                  //Get the list of colon separated attachments into an array

                  string[] arr = attachments.Split(',');

                  foreach (string str in arr)

                  {                                

                         //Concatenate the path where attachments are stored,

                         with the actual file name

                         MailAttachment attachment = new

                         MailAttachment(attachmentsPath + "\\" + str );

                         mail.Attachments.Add(attachment);

                  }

           }

    Finally, it sends the mail using the Send method of the SmtpMail class.

           //Send the mail

           SmtpMail.Send(mail);

    }

    Now that we have seen the implementation of the mail processing component as well as the Windows Service, we are ready to look at the client application that will be used to test the functionalities of the above components.

    Client Application

    To demonstrate how to invoke the mail processing component, we will create a simple Visual C# Windows Forms application named MailClientApplication as shown in the following dialog box.

    Once the project is created, we will add a command button as well as a list box to the form. We also need to reference the MailProcessingLib component from the client application to be able to use the classes contained in that project. After that, we will modify the Click event of the command button to look like the following. In the Click event, we start by creating an instance of the MailAttributeCollection object. Then we set all the common properties (that are required for every mail) for the MailAttributeCollection object.

    private void btnSendMail_Click(object sender, System.EventArgs e)

    {                         

           try

           {

                  MailAttributeCollection mailAttrCol = new

                  MailAttributeCollection();

                  //Assign categories mail as the default mail

                  MailTemplate template = MailTemplate.CategoriesInformation;

                  //Set all the attributes of MailAttributeCollection object

                  mailAttrCol.ToList = "arasu11@hotmail.com";

                  mailAttrCol.Subject = "From Efficient Mail Processing Systems";

                  mailAttrCol.Name = "Thiru";

                  mailAttrCol.Address = "Chandler";

                  mailAttrCol.State = "AZ";

                  mailAttrCol.Zip = "85226";                     

    Apart from setting the common properties, we also need to set mail-specific properties depending on the type of mail that we want to send. We set these mail-specific properties based on the value that is selected in the box. For example, if the selected list box value is "CategoriesInformation", we set the CategoryName and CategoryDescription properties of MailAttributeCollection object.

                  switch (cboMailType.SelectedItem.ToString())

                  {

                         case "CategoriesInformation":

                         {

                               //Set Category related details

                               mailAttrCol.CategoryName = "Test Category Name";

                               mailAttrCol.CategoryDescription = "Test Category

                               Description";       

                               template = MailTemplate.CategoriesInformation;

                               break;

                         }

                         case "ProductsInformation":

                         {

                               //Set Products related details

                               mailAttrCol.ProductName = "Test Product Name";

                               mailAttrCol.ProductDescription = "Test Product

                               Description";

                               template = MailTemplate.ProductsInformation;

                               break;

                         }

                  }     

     

    Here we create an instance of the MailHelper object and then invoke its SendMail method, passing in the required attributes. If the SendMail method executes successfully, we display a message box to the user indicating that the mail has been successfully sent.

                                            

                  MailHelper helper = new MailHelper();

                  //Send the mail using Helper class method

                  helper.SendMail(template,mailAttrCol);

                  MessageBox.Show("Mail has been sent");

           }

           catch(Exception ex)

           {

                  MessageBox.Show(ex.Message);

           }

    }

    If you execute the client application by pressing F5, you will see an output that is somewhat similar to what is shown in the following screenshot.

    In the above screen, selecting an item in the list box and clicking the Send Mail button results in a mail (that is based on the list box item section) being sent from the application. As a result of this, you also get a confirmation message indicating that the mail has been sent. However this does not mean that the mail is actually sent to the user, instead this means that the details of the mail are generated and stored in the MailQueue table. To actually send the mail to the users, we need to make sure that our Windows Service MailQueueProcessingService is up and running. Before we can do this, we need to install the Windows Service. To accomplish this, we need to add a Visual Studio.NET Setup Project to the MailQueueProcessingService solution and use to create a Windows installer file, which can then be used to install the Windows Service. The code download for this article contains the code required for creating the Windows Service as well as the Setup Project. Once installed, the Windows Service looks like the following when viewed through Start->Settings->Control Panel->Administrative Tools->Services option.

    Putting It All Together

    Now that we have installed the Windows Service in the computer, let us test the functionality of the mail processing system by running the client application. When you execute the client application and click on the Send Mail button, it invokes the SendMail method of the MailHelper class, which stores the details of the mail in the Sql Server table named MailQueue. Before storing the details in the table, the SendMail method generates the body of the mail by applying the dynamically generated XML with the external XSL stylesheet. Once the details of the mail are stored in the MailQueue table, the SendMail method then returns the control back to the calling client application, which then displays a message box indicating that the mail has been sent. This stored mail in the MailQueue is then picked up the Windows Service that is running in the background. Since the interval property of the timer component is set to 3000 milliseconds, the Windows Service polls the MailQueue table for every 3000 milliseconds and looks for records in the MailQueue table that have their MailStatus column value set to 0. When it finds those records, it reads them into a DataSet object. Then it loops through the DataSet object and actually sends out mail using the SmtpMail class that is contained in the System.Web.Mail namespace.

    Conclusion

    In this article, we have discussed how to create an efficient mail processing system using the principles of asynchronous application design, XML, XSL and Enterprise Services; we have learned the advantages of using the combination of XML and XSL to create a flexible, extensible mail generation approach; and we have demonstrated how to take advantage of the Windows Services in the .NET Framework to asynchronously send mail.

    I hope you find this article useful and thanks for reading.

    About the Author

    Thiru has almost six years of experience in architecting, designing, developing and implementing applications using Object Oriented Application development methodologies. He also possesses a thorough understanding of software life cycle (design, development and testing).

    He is an expert with ASP.NET, .NET Framework, Visual C#.NET, Visual Basic.NET, ADO.NET, XML Web Services and .NET Remoting and holds MCAD for .NET, MCSD and MCP certifications.

    Thiru has authored numerous books and articles. He can be reached at thiruthangarathinam@yahoo.com.

  • Rate This Article
    Not HelpfulMost Helpful
    1 2 3 4 5
    Supporting Products/Tools
    AspEmail
    Free SMTP component that supports multiple file attachments, unlimited recipients, CC's, BCC's and REPLY-TO's. Sends messages as plain text or in the HTML format. Premium features include message queuing and deferred processing for high mail volumes. When used with AspEncrypt, generates S/MIME-enabled secure mail.
    [Top]
    AspMail
    AspMail supports multiple file attachments (MIME and UUE), US ASCII and ISO-8859-1 character sets, 8bit subject lines, custom message content headers, custom message headers, MS Exchange priority headers, PGP and more.
    [Top]
    DevMailer 1.0
    DevMailer adds SMTP email sending abilities to ASP or Perl programs. Features include: attachments, failsafe queueing, redundant servers, standard message file support, and advanced activity logging. Also verify email addresses and send multiple messages on a single connection.
    [Top]
    JangoMail
    JangoMail, located at JangoMail.com, is a web-based service that sends mass e-mails by connecting to data from your SQL Server or ODBC compliant database. Unlike traditional ASP e-mail components, the JangoMail service can also handle unsubscribes and bounces automatically and synchronize these with your original web database. The only setup that is required is the placement of one ASP file on your web server. Other features include message open tracking and click tracking.
    [Top]
    JMail
    Send Email directly from you web page via your webserver. jMail will not start up any annoying email clients, just smoothly send the mail via the mailserver. Implement it with easy ASP code.
    [Top]
    Other Articles
    Jul 8, 2003 - Creating Efficient Mail Processing Systems – Part 1
    Many challenges present themselves when trying to send mail as part of a transaction in an enterprise-class application. Fear not frustrated developer. Thiru Thangarathinam will guide you through the steps of designing an extensible and asynchronous mail processing system.
    [Read This Article]  [Top]
    Feb 3, 2003 - Validating E-mail Against the Mail Server
    Calvin Luttrell takes e-mail validation to another level by building a .NET Web service that validates a user's e-mail address against the user's e-mail mail server.
    [Read This Article]  [Top]
    Dec 20, 2002 - Building a .NET E-mail Application - Part 1
    Remie Bolte begins his series on developing .NET SMTP and POP3 e-mail components for an outlook express look-alike Web-based e-mail application. This article provides a thorough overview of the SMTP RFC.
    [Read This Article]  [Top]
    Oct 16, 2001 - Implementing an E-mail Content Filter Using CDO
    Stop SPAM from sliding through your e-mail system. George Walker shows how to create an e-mail content filter for the Windows 2000 SMTP service using Microsoft Collaboration Data Objects.
    [Read This Article]  [Top]
    Oct 2, 2001 - Creating PGP-Encrypted E-Mails
    PGP is an encryption program being used for secure transmission of files and e-mails. This article explains the concepts of PGP, provides details about installing and configuring the command-line version of PGP, and explains how an encrypted e-mail can be generated from ASP.
    [Read This Article]  [Top]
    Jan 20, 2000 - Accessing Outlook 98 Contacts in ASP Pages
    Dennis Adams explains how accessing Outlook 98 Contacts via a Public Folder from ASP pages is possible if attention is paid to properly installing the necessary components, and configuring the IIS and Exchange Server components. Adams offers some prerequisites, a detailed list of sample code segments, and a complete list of reference materials and related Technet articles.
    [Read This Article]  [Top]
    Dec 17, 1999 - How to Send Secure Mail in ASP-Based E-Commerce Applications
    Peter Persits' article explains how Secure Multipurpose Internet Mail Extensions, or S/MIME, has come to rescue of e-commerce Web sites that need some order information to be contained in encrypted E-mail. Customers don't want to use automatic on-line credit card authorization, so order information instead is sent over an SSL-protected HTML form and credit card numbers are sent via encrypted E-mail for manual processing.
    [Read This Article]  [Top]
    Oct 7, 1999 - Using the WSH on the Desktop
    In this article Shahriar Moosavizadeh uses a script to report each day's sales data via E-mail to the sales manager. The Windows Scripting Host allows scripts to be executed directly on the desktop and create a report without having to run the script within the HTML document or ASP page. Included is a sample script that both builds the report and E-mails it to the sales manager, and step-by-step screenshots and instructions.
    [Read This Article]  [Top]
    Mar 25, 1998 - Collaboration Data Object and IIS 4.0
    Collaboration Data Object (CDO) is a COM library designed to send mail through SMTP or Microsoft Exchange. If you install the SMTP server that comes with Microsoft Option Pack 4, you can send mail from an Active Server page using CDO. Because CDO is comes with Microsoft Option Pack 4, CDO is free.
    [Read This Article]  [Top]
    Apr 6, 1997 - Creating a List Server with ASP
    This issue describes how to make a list server using Active Server, SQL Server, and Stephen Genusa's ASPMail Component. Included are source and instructions for adding the user to the list from a Active Server page, removing the user from the list via a Active Server page, and sending mail to the whole list.
    [Read This Article]  [Top]
    Mailing List
    Want to receive email when the next article is published? Just Click Here to sign up.

    Support the Active Server Industry



    JupiterOnlineMedia

    internet.comearthweb.comDevx.commediabistro.comGraphics.com

    Search:

    Jupitermedia Corporation has two divisions: Jupiterimages and JupiterOnlineMedia

    Jupitermedia Corporate Info


    Legal Notices, Licensing, Reprints, & Permissions, Privacy Policy.

    Advertise | Newsletters | Tech Jobs | Shopping | E-mail Offers

    Solutions
    Whitepapers and eBooks
    Microsoft Article: HyperV-The Killer Feature in WinServer ‘08
    Avaya Article: How to Feed Data into the Avaya Event Processor
    Microsoft Article: Install What You Need with Win Server ‘08
    HP eBook: Putting the Green into IT
    Whitepaper: HP Integrated Citrix XenServer for HP ProLiant Servers
    Intel Go Parallel Portal: Interview with C++ Guru Herb Sutter, Part 1
    Intel Go Parallel Portal: Interview with C++ Guru Herb Sutter, Part 2--The Future of Concurrency
    Avaya Article: Setting Up a SIP A/S Development Environment
    IBM Article: How Cool Is Your Data Center?
    Microsoft Article: Managing Virtual Machines with Microsoft System Center
    HP eBook: Storage Networking , Part 1
    Microsoft Article: Solving Data Center Complexity with Microsoft System Center Configuration Manager 2007
    MORE WHITEPAPERS, EBOOKS, AND ARTICLES
    Webcasts
    Intel Video: Are Multi-core Processors Here to Stay?
    On-Demand Webcast: Five Virtualization Trends to Watch
    HP Video: Page Cost Calculator
    Intel Video: APIs for Parallel Programming
    HP Webcast: Storage Is Changing Fast - Be Ready or Be Left Behind
    Microsoft Silverlight Video: Creating Fading Controls with Expression Design and Expression Blend 2
    MORE WEBCASTS, PODCASTS, AND VIDEOS
    Downloads and eKits
    Sun Download: Solaris 8 Migration Assistant
    Sybase Download: SQL Anywhere Developer Edition
    Red Gate Download: SQL Backup Pro and free DBA Best Practices eBook
    Red Gate Download: SQL Compare Pro 6
    Iron Speed Designer Application Generator
    MORE DOWNLOADS, EKITS, AND FREE TRIALS
    Tutorials and Demos
    How-to-Article: Preparing for Hyper-Threading Technology and Dual Core Technology
    eTouch PDF: Conquering the Tyranny of E-Mail and Word Processors
    IBM Article: Collaborating in the High-Performance Workplace
    HP Demo: StorageWorks EVA4400
    Microsoft How-to Article: Get Going with Silverlight and Windows Live
    MORE TUTORIALS, DEMOS AND STEP-BY-STEP GUIDES