c#

位置:IT落伍者 >> c# >> 浏览文章

在.NET 应用程序中用System.Web.Mail 发送电子邮件


发布日期:2019年06月30日
 
在.NET 应用程序中用System.Web.Mail 发送电子邮件
在这个栏目中我们将探讨怎样在应用中发送电子邮件这将用到SystemWebMail 名字空间中的类

协作数据对象

Windows 协作数据对象 (CDOSYS) 是微软用来创建和发送基于标准的电子邮件信息的消息组件它是 用与 Windows NT的协作数据对象(CDONTS) 的替代物 尽管由于向后兼容的原因 CDONTS 已包含在 Windows 但是 Windows xp Windows Server 以及更高版本均未包含或支持 CDONTS 组件 所以任何使用 CDONTS 发送消息的应用程序都必须迁移到使用 CDOSYS 上来它提供了相同的功能而且易于使用

除了作为替代物外 CDOSYS 还引入了一些 CDONTS 中没有的功能

向新闻组发送消息的能力

对消息的 MIME 体结构的控制

接收和转发机制

传输事件接受池以便对事件作出响应

SystemWebMail 命名空间包含了与 CDOSYS 组件交互从而创建和发送信息的类

使用互联网信息服务(IIS)和 SMTP 服务

为了能从应用程序中利用 CDOSYS 发送电子邮件您必须确认 IIS 服务列表中已经安装了SMTP 服务在 Windows /XP中您可以通过控制面板 > 添加/删除程序 > 添加/删除 Windows 组件选项来设置STMP 服务的任务就是基于配置接收和发送消息这个服务可以直接投递消息也可以使用代理服务器来发送消息当代理服务器已配置时所有的消息将转发给它以备发送你必须确保 IIS 和 SMTP 服务正确的安装和配置好

在投递之前SMTP 服务使用一个目录结构来保存消息默认的目录为C:\Inetpub\mailroot这个文件夹中包含了一些子目录Queue Drop Badmail 如果你无法配置SMTP服务实例以便发送的话您将可以在目录 C:\Inetpub\mailroot\Queue 中的 *EML 文件中找到邮件这个技巧在离线创建邮件时将很有用

发送消息

正如前面提到的发送电子邮件将是一件相对简单的事类 SystemWebMailMailMessage class 代表了将要发送的消息Email 消息将由该类的实例来创建这个类包含了诸如收件人发件人和主题等属性来让你控制想要发送的消息还可以使用类 SystemWebMailMailAttachment 的实例创建附件然后添加到 MailMessage 的 Attachments (附件)集合中随后该消息将由 类SystemWebMailSmtpMail 发送出去

发送邮件示例代码

下面的 C# 示例代码将包含一个演示如何发送简单电子邮件的 Windows 控制台程序当没有设置 SmtpMail 的 SmtpServer 属性时本地机器将为其默认配置你必须确保添加了针对 SystemWebdll 的引用因为它是控制台应用程序而不是  应用

using System;

using SystemWebMail;

namespace CodeGuruSendMail

{

/// <summary>

/// Test console application to demonstrate sending email

/// </summary>

class TestMail

{

/// <summary>

/// The main entry point for the application

/// </summary>

[STAThread]

static void Main(string[] args)

{

TestMailSend(t

mstraw

Test Message Using CDOSYS

Hello World! This is a simple message sent

using CDOSYS);

}

/// <summary>

/// Send a message using the NET wrapper for Collaborative Data

/// Objects (CDO) This method should be used when sending to a

/// single recipient only; otherwise the list of recipients

/// will be known

/// </summary>

/// <param name=MessageFrom>Message originator</param>

/// <param name=MessageTo>Message receipent</param>

/// <param name=MessageSubject>Message subject</param>

/// <param name=MessageBody>Message body</param>

public static void Send(string MessageFrom

string MessageTo

string MessageSubject

string MessageBody)

{

MailMessage message = new MailMessage();

messageFrom = MessageFrom;

messageTo = MessageTo;

messageSubject = MessageSubject;

messageBodyFormat = MailFormatText;

messageBody = MessageBody;

try

{

SystemConsoleWriteLine(Sending outgoing message);

SmtpMailSend(message);

}

catch( SystemWebHttpException exHttp )

{

SystemConsoleWriteLine(Exception occurred: +

exHttpMessage);

}

}

}

}

发送带有附件的邮件示例代码

下面的 C# 示例代码将包含一个演示如何发送带有附件的电子邮件的 Windows 控制台程序这将由创建类 MessageAttachment 的实例然后将其添加到 Attachments 集合来完成

using System;

using SystemWebMail;

namespace CodeGuruSendMail

{

/// <summary>

/// console application to demonstrate sending email with an

/// attachment

/// </summary>

class TestMail

{

/// <summary>

/// The main entry point for the application

/// </summary>

[STAThread]

static void Main(string[] args)

{

TestMailSendAttachment(t

mstraw

Test Message Using CDOSYS

Hello World! This is a simple

message sent using CDOSYS

c:\\myattachmenttxt);

}

/// <summary>

/// Send a message using the NET wrapper for Collaborative Data

/// Objects (CDO) This method should be used when sending to

/// a single recipient only; otherwise the list of recipients

/// will be known

/// </summary>

/// <param name=MessageFrom>Message originator</param>

/// <param name=MessageTo>Message receipent</param>

/// <param name=MessageSubject>Message subject</param>

/// <param name=MessageBody>Message body</param>

/// <param name=MessageAttachmentPath>Path to attachment

/// </param>

public static void SendAttachment(string MessageFrom

string MessageTo

string MessageSubject

string MessageBody

string MessageAttachmentPath)

{

// Create and setup the message

MailMessage message = new MailMessage();

messageFrom = MessageFrom;

messageTo = MessageTo;

messageSubject = MessageSubject;

messageBodyFormat = MailFormatText;

messageBody = MessageBody;

// Create and add the attachment

MailAttachment attachment = new

MailAttachment(MessageAttachmentPath);

messageAttachmentsAdd(attachment);

try

{

// Deliver the message

SystemConsoleWriteLine(Sending outgoing message);

SmtpMailSend(message);

}

catch( SystemWebHttpException exHttp )

{

SystemConsoleWriteLine(Exception occurred: +

exHttpMessage);

}

}

}

}

可能的改进

我们已经从不同途径演示了如何发送电子邮件现在轮到你想想如何在你的应用程序中应用这项功能了这里有一些想法和你共同分享

Email 警告—当一个致命的或无法恢复的应用程序错误发生时您的应用程序可以发送电子邮件到一指定地址以使其能很快得知

创建一个基于Web的联系消息窗体—你可以使用户通过填写 Web 表单来发送用户反馈然后编写相关程序把消息发送给适当的联系人

订阅服务—当通过 CDOSYS 组件发送电子邮件来支持订阅类型的服务时您将需要发送多封邮件而不是单一邮件给所有的接收者当一则消息拥有大量的接收者时处理所有的接收者将戏剧性地减满处理速度这时候您最好将接收者列表分解成多个列表分好几次发送消息

使用 Bcc 发送消息—当通过 CDOSYS 组件发送电子邮件来支持订阅类型的服务时您也许想要使用 Bcc 而不是 To 来填写接收人地址这样可以使得所有接收者无法得知接收者列表

发送 HTML 格式的邮件—消息主体格式可以是 HTML它可以使消息主体以 HTML 格式发送而不是普通文本

原文

Sending EMail with SystemWebMail

Mark Strawmyer (view PRofile)

February

Rating: not yet rated

Welcome to the next installment of the NET Nuts & Bolts column In this column well explore sending email from within applications This will involve utilizing classes contained in the SystemWebMail namespace

Collaboration Data Objects

Collaboration Data Objects for Windows (CDOSYS) is a Microsoft messaging component that allows for standardsbased email messages to be constructed and sent It is a replacement of the Collaboration Data Objects for NTS (CDONTS) which as you can probably guess by the name was for Windows NT CDONTS is included with Windows for backwards compatibility but Windows XP Windows Server and beyond do not include or support the use of CDONTS Thus any applications that send messages using CDONTS must be migrated to use CDOSYS It provides the same functionality and is just as easy to use

In addition to serving as a replacement CDOSYS introduces some new functionality that was not previously available in CDONTS Some of the functionality includes:

Ability to post messages to newsgroups

Control of MIME body structure for messages

Reply and forward functionality

Transport event sink to allow responding to events

The SystemWebMail namespace contains classes that interact with CDOSYS to construct and send the message(s)

Using IIS and SMTP Service

In order for CDOSYS to send email or other messages from your application you need to enlist the services of IIS with the SMTP Service installed Both are available in Windows /XP through the Control Panel > Add/Remove Programs > Add/Remove Windows Components option The job of the STMP Service is to accept and deliver the messages based on the configuration The service can attempt to deliver the messages directly or it can utilize a smart host to deliver the message instead When a smart host is enlisted all messages are forwarded to it for delivery You need to have IIS and the SMTP service installed and configured

The SMTP Service uses a directory structure to contain messages prior to delivery The default directory is C:\Inetpub\mailroot This folder contains a number of subdirectories such as Queue Drop and Badmail If you are unable to configure your instance of the SMTP Service for delivery you can find the message in a *EML file in the C:\Inetpub\mailroot\Queue directory This technique can be useful when creating messages offline

Sending a Message

As previously mentioned sending an email is a relatively simple thing to do The SystemWebMailMailMessage class represents the message to be sent Email messages are constructed by using instances of this class This class contains properties such as To From and Subject that allow you to control the message being sent Attachments can be created through instances of the SystemWebMailMailAttachment and then added to the MailMessage through the Attachments collection of the MailMessage The message is then delivered through the SystemWebMailSmtpMail class

Sending a Message Sample Code

The following sample code contains a C#based Windows Console application that shows how to send an email message By not specifying that the SmtpMailSmtpServer property is not set the localhost is used by default You need to make sure to add a reference to the SystemWebdll because this is a console application and not an ASPNET application

using System;

using SystemWebMail;

namespace CodeGuruSendMail

{

/// <summary>

/// Test console application to demonstrate sending email

/// </summary>

class TestMail

{

/// <summary>

/// The main entry point for the application

/// </summary>

[STAThread]

static void Main(string[] args)

{

TestMailSend(t

mstraw

Test Message Using CDOSYS

Hello World! This is a simple message sent

using CDOSYS);

}

/// <summary>

/// Send a message using the NET wrapper for Collaborative Data

/// Objects (CDO) This method should be used when sending to a

/// single recipient only; otherwise the list of recipients

/// will be known

/// </summary>

/// <param name=MessageFrom>Message originator</param>

/// <param name=MessageTo>Message receipent</param>

/// <param name=MessageSubject>Message subject</param>

/// <param name=MessageBody>Message body</param>

public static void Send(string MessageFrom

string MessageTo

string MessageSubject

string MessageBody)

{

MailMessage message = new MailMessage();

messageFrom = MessageFrom;

messageTo = MessageTo;

messageSubject = MessageSubject;

messageBodyFormat = MailFormatText;

messageBody = MessageBody;

try

{

SystemConsoleWriteLine(Sending outgoing message);

SmtpMailSend(message);

}

catch( SystemWebHttpException exHttp )

{

SystemConsoleWriteLine(Exception occurred: +

exHttpMessage);

}

}

}

}

Sending a Message with an Attachment Sample Code

The following sample code contains a C#based Windows Console application that shows how to send an email message that includes an attachment This is done by creating instances of the MessageAttachment class and then adding them to the message through the Attachments collection

using System;

using SystemWebMail;

namespace CodeGuruSendMail

{

/// <summary>

/// console application to demonstrate sending email with an

/// attachment

/// </summary>

class TestMail

{

/// <summary>

/// The main entry point for the application

/// </summary>

[STAThread]

static void Main(string[] args)

{

TestMailSendAttachment(t

mstraw

Test Message Using CDOSYS

Hello World! This is a simple

message sent using CDOSYS

c:\\myattachmenttxt);

}

/// <summary>

/// Send a message using the NET wrapper for Collaborative Data

/// Objects (CDO) This method should be used when sending to

/// a single recipient only; otherwise the list of recipients

/// will be known

/// </summary>

/// <param name=MessageFrom>Message originator</param>

/// <param name=MessageTo>Message receipent</param>

/// <param name=MessageSubject>Message subject</param>

/// <param name=MessageBody>Message body</param>

/// <param name=MessageAttachmentPath>Path to attachment

/// </param>

public static void SendAttachment(string MessageFrom

string MessageTo

string MessageSubject

string MessageBody

string MessageAttachmentPath)

{

// Create and setup the message

MailMessage message = new MailMessage();

messageFrom = MessageFrom;

messageTo = MessageTo;

messageSubject = MessageSubject;

messageBodyFormat = MailFormatText;

messageBody = MessageBody;

// Create and add the attachment

MailAttachment attachment = new

MailAttachment(MessageAttachmentPath);

messageAttachmentsAdd(attachment);

try

{

// Deliver the message

SystemConsoleWriteLine(Sending outgoing message);

SmtpMailSend(message);

}

catch( SystemWebHttpException exHttp )

{

SystemConsoleWriteLine(Exception occurred: +

exHttpMessage);

}

}

}

}

Possible Enhancements

We have demonstrated how to send email messages in a couple of ways It is now up to you to think about ways in which you can utilize this functionality within your applications Here are some ideas to consider on your own:

Email alerts—when a fatal or unrecoverable application error occurs your application could email information to a designated location so that it is immediately known

Build a Webbased contact form—you can allow users to send customer feedback by filling out a Web form and then programmatically emailing it to the appropriate contact(s)

Subscription service—when sending mail by using CDOSYS for a subscriptiontype service you may want to send multiple messages instead of a single message with all of the recipients When a message has too many recipients it can drastically slow processing as all of the recipients are processed It is often better to break the list of recipients into multiple lists and send multiple messages

Send messages using Bcc—when sending mail using by CDOSYS for a subscriptiontype service you may want to address messages using the Bcc instead of To This will keep the list of recipients unknown to all of those that receive it

Send HTMLformatted mail—the message body format can be set to HTML This will allow the body of the message to be sent in HTML format rather than plain text

               

上一篇:用钩子(hook)实现C#的屏幕键盘效果

下一篇:C#:把其他进制的数转换为十进制