65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ASP.NET 助手轻松发送电子邮件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (25投票s)

2014年8月11日

CPOL

11分钟阅读

viewsIcon

77007

downloadIcon

1774

本文解释了如何使用 ASP.NET Web 助手发送电子邮件,而无需处理连接。

引言

本文解释了 ASP.NET 中使用 .NET Web 助手内置的电子邮件发送功能。本文解释了如何在 ASP.NET 网站中实现这些类,并使用更少的代码向客户发送电子邮件。

背景

在当今世界,电子邮件发送几乎是所有事情的基础。人们喜欢向朋友发送关于他们刚刚在网络上发现的新事物的电子邮件。他们希望向网站管理员、朋友等发送电子邮件,告诉他们自己的感受以及方式。

以前,这是使用 C# 的 MailMessage 类处理的,但现在 ASP.NET 已经接管了与互联网相关的功能,使用 ASP.NET 内置的 WebMail 类功能发送电子邮件更好。

许多用户正在询问与此问题相关的问题。因此,我想写一篇文章解释这个类以及如何使用它并将其实现到您自己的网站中,以允许用户拥有此电子邮件功能。

环境要求

在继续发送电子邮件之前,您需要注意一些事项。本文是使用 Microsoft WebMatrix 开发的 ASP.NET 网站编写的。您可以从 Microsoft 的网站上获取自己的 WebMatrix 副本。

下载此软件后,您将获得在您自己的计算机上运行您的网站进行测试所需的所有软件。此软件安装 Web 平台安装程序,该程序为您完成所有剩余的工作。

完成后,继续执行后续步骤。

什么是 ASP.NET WebMail

ASP.NET WebMail 是一个类,用于处理您网站上的电子邮件。这个类是一个帮助类,正如 MSDN 所说,“是简化 ASP.NET Web Pages 中 Web 编程的组件”。它是 .NET Framework 的 Web Helpers 类的一部分。您可以通过多种方式访问此类,如果您有一个 .cshtml 页面(C# 嵌入式 HTML 页面),其中所有必需的类和命名空间都已编译,或者您也可以使用其直接类名访问此类,并在任何 .cs(C# 类)文件中访问它。

System.Web.Helpers.WebMail;

这将启用您网站中的 WebMail 功能。之后,您可以在代码中轻松访问其属性和方法,并从您的网站或您的程序软件发送 WebMail(电子邮件)。

与所有其他类一样,WebMail 也有一些您可以用于自定义服务的方法和属性。WebMail 类的内置成员(属性)如下:

  1. EnableSsl (bool)
    此属性为电子邮件设置安全套接字层。大多数 SMTP 服务器都要求它。今天,当我准备这篇文章时,我发现 Gmail 服务器需要它。否则,它会取消连接。设置后,您就可以使用它了。
  2. From (string)
    此属性设置 Webmail 的“发件人”字段。这也是电子邮件中显示发件人电子邮件地址的部分。
  3. Password (string)
    这是您发送电子邮件的用户帐户的密码。
  4. SmtpPort (int)
    这是您连接然后将电子邮件发送到服务器上的客户端的端口。请记住,大多数情况下,25 可以用作其值。但您也可以查看服务提供商提供的文档以了解他们的端口。Gmail 也接受 25 服务器端口。我一直都在使用它。
  5. SmtpServer (string)
    SmtpServer 告诉 WebMail 要连接的服务器。您在此字段中指定所提供的服务。
  6. UserName
    您在电子邮件服务提供商处的用户名。

我想在这里明确一点。FromUserName 字段之间存在差异。区别在于,UserName 用于连接到服务器,而 From 字段只是作为 String 传递给服务器,仅用于指示 From 字段。UserNamePassword 用于登录服务器,它们与您注册时提供的信息相同。例如,我的 Gmail 帐户是:justinxxxxx@gmail.com 密码 ******, 我会将此传递给 UserNamePassword 字段,而 From 字段也可以是我的兄弟的电子邮件或我的公司电子邮件等。

请务必记住上述段落!

现在让我们讨论 WebMail 类提供的方法,正如我们所知,这是一个与电子邮件相关的类,因此它只提供一个方法。它是

public static void Send(
    string to,
    string subject,
    string body,
    string from,
    string cc,
    IEnumerable<string> filesToAttach,
    bool isBodyHtml,
    IEnumerable<string> additionalHeaders,
    string bcc,
    string contentEncoding,
    string headerEncoding,
    string priority,
    string replyTo
)

这个类提供的唯一方法是 Send 方法,用于发送电子邮件。您不需要像在 MailMessage 中那样配置这个类或您创建的实例,您只需传递参数,WebMail 会处理所有事情。

这里只讨论所需的参数,其余的都是可选的。无论您是否提供它们,WebMail 都不关心。还有一点,也是最有趣的一点是,您不需要记住顺序。您可以以任何顺序传递它们,只需记住按顺序传递前三个参数即可。因为它们是必需的。

  1. to (string)
    这是收件人的电子邮件地址。
  2. subject (string)
    要发送的电子邮件的主题。一个简短的消息来描述电子邮件。
  3. body (string)
    此参数包含所有电子邮件正文内容。您将构成 Web 邮件电子邮件正文的整个 HTML 传递给此参数。您可以将图像附加到文档中,您可以使用 HTML 代码(例如粗体、斜体等)来设置 HTML 内容的样式。
  4. isBodyHtml (bool)
    用于指示正文参数中的 HTML 应呈现为 HTML 标记而不是纯 string

其余参数并非必需,电子邮件将仅使用这些参数发送。尽管 isBodyHtml 参数也不是必需的,但我认为值得一提。

Using the Code

您可以下载本文随附的附件。它包含您测试本文代码和理解过程所需的所有代码。

首先,我已经更改了网站的位置,以便用户尝试访问主页时默认运行电子邮件页面。其代码如下:

Response.Redirect("~/SendEmail");

如果您想从我提供的模板构建您的项目,请删除此项。

下一步是使用简单的 HTML 表单元素来接受用户数据并将其传递给服务器进行处理。为此,我在根文件夹中有一个简单的 SendEmail.cshtml 页面,并编写了最基本的表单,如下所示:

@{
    Layout = "~/_SiteLayout.cshtml";
    Page.Title = "Send email";
}

<!DOCTYPE html>
<html>
<head>
</head>
<body>
  <h2>Send basic Email - ASP.NET WebMail helper</h2>
  <form method="post" action="ProcessFile.cshtml">
    <div>
        Your name:<br />
        <input type="text" name="customerName" />
    </div>

    <div>
        Your email address: <br />
        <input type="text" name="customerEmail" />
    </div>

    <div>
        Subject line: <br />
        <input type="text" size= 30 name="subjectLine" />
    </div>
      <div>
          Message: <br />
          <textarea name="message" style="width: 300px;"></textarea>
      </div>
    <div>
        File to attach: <br />
        <input type="text" name="fileAttachment" />
    </div>

    <div>
        <input type="submit" value="Submit" />
    </div>
  </form>
</body>
</html>

您可以看到 HTML 非常简单易懂,您可以将详细信息添加到表单中,例如您的姓名、您的电子邮件地址、您的消息,然后如果您想附加文件,则可以将文件附加到 WebMail。正如我在上面的块中已经提到的,如果根本没有附件,则无需传递任何参数。您只需要传递必需的对象,例如收件人、主题、正文即可。您可以传递或不传递其余项目。

此表单的 action 属性是 ProcessFile.cshtml,这是您将被重定向到的新文件,因为 action 属性的工作是将表单数据传递到下一页,您将在那里处理服务器端编码。如果您将代码发布在同一页面上,则可以忽略此属性。因为它是当前页面位置。

其 HTML 代码如下:

@{
    Layout = "~/_SiteLayout.cshtml";

    var customerName = Request["customerName"];
    var customerEmail = Request["customerEmail"]; 
    var customerRequest = Request["customerRequest"];
    var subjectLine = Request["subjectLine"];
    var message = Request["message"];
    var fileAttachment = Request["fileAttachment"];
    var with = "with";
    var errorMessage = "";

    // use a try catch block and send the email
    try {
        // Initialize WebMail helper
        WebMail.SmtpServer = "your-smtp-server";
        WebMail.SmtpPort = 25;
        WebMail.UserName = "your-username";
        WebMail.Password = "password";
        WebMail.From = "your-email-address";
        WebMail.EnableSsl = true;

        // Create array containing file name
        var filesList = new string [] { fileAttachment };

        // Attach file and send email
        // if there is no link to file then send email
        // without any attachment
        if(fileAttachment == null || fileAttachment.IsEmpty()) {
            WebMail.Send(to: customerEmail,
            subject: subjectLine,
            body: "From: " + customerName + "\n\nHis message: " + message);
            with = "without";
        } else {
            // otherwise, send email with file attached
            WebMail.Send(to: customerEmail,
            subject: subjectLine,
            body: "From: " + customerName + "\n\nHis message: " + message,
            filesToAttach: filesList);
        }
    }
    catch (Exception ex ) {
        // errorMessage is the message provided by the exception.
        errorMessage = ex.Message;
    }
}
<!DOCTYPE html>
<html>
<head>
    <title>Request for Assistance</title>
</head>
<body>
  <p>Sorry to hear that you are having trouble, <b>@customerName</b>.</p>
    @if(errorMessage == "")
    {
        <p><b>@customerName</b>, thank you for your interest.</p>
        <p>An email message has been sent to our customer service
           department <b>@with</b> the <b>@fileAttachment</b> file attached.</p>
    }
    else
    {
        <p><b>The email was <em>not</em> sent.</b></p>
        <p>Please check that the code in the ProcessRequest page has 
           correct settings for the SMTP server name, a user name, 
           a password, and a "from" address.
        </p>
        <p>The following error was reported:</p>
        <p><em>@errorMessage</em></p>
    }
</body>
</html>

此页面只接受表单中的数据,然后在此代码块之后,它初始化 WebMail 类。此为 static 类,因此无需像下面这样创建此类的新实例:

WebMail webMail = new WebMail();

...就像您使用 MailMessage 类一样。此功能使其非常易于使用。您需要编辑 WebMail 属性,以便代码正常工作,并且服务器接受您发送电子邮件的请求。在您进一步操作之前,我希望您编辑代码以避免进一步的错误和摸不着头脑。

然后你将你的凭据和参数传递给它,它就会将电子邮件发送给客户或任何需要发送电子邮件的人。

此页面上的 HTML 根据电子邮件的情况呈现。如果电子邮件已发送,HTML 会显示:“好的,请稍等,我们会尽快回复您,我们已收到您的电子邮件。”如果电子邮件未发送,则会显示:“抱歉,发生错误,我们无法接收电子邮件。”

您会在我的代码中注意到一个 try catch 块。这是因为,在处理电子邮件时,您必须使用它。当您连接到新服务器时,如果无法连接,您会收到一个异常。如果有任何证书错误,您会收到一个错误。如果缺少参数,您会收到一个错误。几乎所有事情都会出错,这就是为什么我将电子邮件发送功能放在 Try Catch 块中,这样如果发生任何错误,我不会看到 IIS 生成的错误页面,而是会看到一条消息,表示电子邮件未发送,以及另一段文字告诉我错误是什么。

这就是为什么在许多阶段可能引发异常的情况下使用 try catch 是一个很好的做法,因为损坏的用户界面会带来糟糕的用户体验。

本文测试的截图如下:

Email form

这是主页面,即电子邮件发送应用程序的表单。您可以看到它包含了所有必需的基本字段和一个用于文件名的附加字段。我将在最后一张图片中解释它。下一步是处理错误。

Error sending email

如果在电子邮件发送过程中出现任何错误,catch 块将执行,您将收到错误通知。首先,您应该检查 WebMail 属性设置,如果一切正常,那么请查看您刚刚犯的错误。它会告诉您电子邮件未发送,请检查代码。

Email sent without attachment

如果电子邮件正常发送,则显示此 HTML。干得好!

但你应该看到没有文件被附加。那是因为你没有费心去附加任何文件(文件名字段留空)。它是使用...

if(fileAttachment == null || fileAttachment.IsEmpty()) {

块,并且只执行电子邮件(纯文本)部分,没有附件。

Email sent with attachment

现在,这次您会注意到页面中有一个额外的 HTML 文本。这是因为当您发送电子邮件时,您还附加了文件(通过填写文件系统中文件的完整位置)。您不能只写文件名“HelloWorld.txt”,您需要提供文件系统中文件的完整链接,例如“C:\Users\<username>\Documents\HelloWorld.txt”,ASP.NET 会将此文件附加到电子邮件中。

添加友好的发件人字段

大多数公司会在“发件人”字段中使用自己的名字,并在一个灰色的小字段中显示其电子邮件地址。显示公司名称似乎更用户友好,因为用户可以通过阅读名称更快地了解电子邮件发件人,而不是通过阅读公司的电子邮件地址。

要添加此功能,只需编辑 WebMail 类的 .From 字段。并使其成为

WebMail.From = "\"Afzaal Ahmad Zeeshan\" <hello@example.com>";

现在将向用户显示 Afzaal Ahmad Zeeshan,而不是电子邮件地址 hello@example.com。这是一种更用户友好的发送电子邮件的方式。

关注点

我学会了如何将文件附件附加到 WebMail 类,直到今天我才知道这一点。今天,当我开始写这篇文章时,我回到 WebMatrix 并创建了一个新项目,之后,我只是尝试将一个简单的字符串链接传递给文件,然后文件就被发送了。:) 所以,也许长辈们说“教导他人是增加自己知识的一种方式”是真的。

http://msdn.microsoft.com/en-us/library/system.web.helpers.webmail(v=vs.111).aspx (WebMail 类 MSDN)

历史

  • 第二个版本:添加了支持友好的“发件人”字段,而不是电子邮件地址。
  • 帖子第一版
© . All rights reserved.