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

使用ASP.NET 2.0轻松发送SMTP邮件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (35投票s)

2006年10月4日

11分钟阅读

viewsIcon

523302

downloadIcon

9446

本文探讨了两个主题:向标准电子邮件账户发送电子邮件,以及向手机或寻呼机发送短信。

引言

本文探讨了两个主题:向标准电子邮件账户发送电子邮件,以及向手机或寻呼机发送短信。该方法使用System.Net中包含的SMTP客户端来完成这两种消息提交,所有消息都从ASP.NET 2.0 ASPX页面发送。

SMTP电子邮件部分应用程序将演示以下内容:

  • 使用SMTP配置和发送电子邮件
  • 添加“抄送”地址作为消息收件人
  • 向邮件添加附件

电子邮件应用程序的短信部分将演示以下内容:

  • 通过运营商传递标准电子邮件消息,将短信发送到目标。

除了讨论发送这些消息所需的一小段代码外,本文还将阐述在IIS服务器上通过基于ASP.NET 2.0的网站成功发送消息所需的主要配置要求。

为了使用此演示,您的开发机器上应安装IIS,应安装Visual Studio 2005,并且您的本地IIS实例中应安装可选的SMTP邮件服务器。

图1:演示应用程序的主页

入门

解压缩附件;您会发现一个包含名为“RealMail”的网站项目的解决方案。将解压缩的文件存储到您的系统上,并从IIS创建一个指向该Web应用程序的虚拟目录。然后,在Visual Studio 2005中打开解决方案。查看解决方案资源管理器,您将看到图2中所示的文件。

图2:解决方案资源管理器中的RealMail Web应用程序

解决方案中有两个ASPX页面,第一个(default.aspx)用于使用.NET 2.0 SMTP类库向收件人发送标准邮件;第二个页面用于通过SMTP向蜂窝电话或消息寻呼机发送SMS消息。

IIS配置

您的本地IIS实例必须正确配置,才能通过其SMTP邮件服务器成功发送电子邮件。即使您安装了IIS,SMTP邮件服务器的安装也是可选的,必须明确添加到安装中。如果您不确定是否安装了SMTP邮件服务器,请打开IIS控制面板并检查安装情况;如果已安装,您将在树状视图中看到对默认SMTP虚拟服务器的引用(图3)

图3:已安装的默认SMTP虚拟服务器

如果未安装服务器,您需要使用“添加或删除程序”控制面板中的“添加和删除Windows组件”功能将SMTP服务器添加到IIS安装中。如果您需要进行此附加安装,一旦打开“添加和删除Windows组件”,请单击“Internet信息服务 (IIS)”以突出显示它,然后单击“详细信息”按钮(图4)。这将打开一个IIS对话框;检查此对话框以找到“SMTP服务”,然后单击它以在框中放置一个复选标记(图5)。勾选此项后,单击“确定”按钮以安装SMTP服务器。

图4:Windows组件向导

图5:将SMTP服务添加到IIS

一旦默认SMTP服务器已安装或验证,您现在可以配置它来发送电子邮件。为了配置SMTP服务器,打开IIS控制面板,在树状视图中找到默认SMTP服务器图标,然后选择并右键单击该图标。显示上下文菜单后,找到“属性”,然后单击它以打开“属性”菜单。显示“默认SMTP虚拟服务器属性”对话框后,单击“访问”选项卡(图6)

图6:SMTP属性对话框

选择“身份验证”按钮以显示身份验证选项(图7)

图7:身份验证选项

确保勾选了匿名访问选项,并且所有其他选项都未勾选;在某些情况下,您可能希望使用其他选项,但在大多数涉及公共网站的情况下,这是您想要的选项。验证此设置后,单击“确定”关闭此对话框。

回到“访问”选项卡,找到并点击“中继”按钮以显示中继选项。请注意,已选中“仅以下列表”单选按钮,并且已将本地主机IP地址添加到允许通过SMTP服务器中继的计算机列表中。当然,这对于开发机器来说是可以的,但在部署中,您将使用Web服务器的实际IP地址。如果列表中没有显示IP地址,请点击“添加”按钮并添加IP地址。完成后,点击“确定”按钮接受更改并关闭对话框(图8)。

图8:中继限制对话框

接下来,从SMTP服务器属性对话框中选择“传输”选项卡(图9)

图9:传输选项对话框

在此对话框中,选择“高级”按钮以显示高级选项对话框(图10)

图10:高级传输对话框

在此对话框中,有两点需要说明:首先,“完全限定域名”属性应该已经预先填充,您可以点击“检查DNS”按钮来验证设置。下一个选项可能是整个过程中最关键的项目;智能主机属性必须设置为指向一个有效的SMTP邮件服务器,该服务器允许您中继邮件。在大多数情况下,您将键入您的互联网服务提供商的默认SMTP邮件服务器名称;地址很可能采用“mail.something.com”的格式,其中“something”是互联网服务提供商的域名。有两种简单的方法可以获取此信息:一种是,如果您正在使用Outlook,打开Outlook并拉出您的电子邮件账户信息;邮件服务器将列在那里。第二种方法是猜测,您可以通过ping服务器来验证您的猜测。

如果您的互联网提供商名称是“foxtrox”,请尝试ping mail.foxtrot.com;如果得到响应,那可能就是您要使用的。如果不起作用,请联系您的管理员并向他们询问SMTP邮件服务器的信息;不要尝试插入Exchange服务器,即使您的公司正在使用Exchange服务器,也可能有一个SMTP邮件服务器。唯一的另一个障碍是确保SMTP邮件服务器允许您中继,同样,如果服务器退回您的邮件,您可能需要与管理员沟通。完成这些设置后,点击“确定”按钮保存设置并关闭对话框。

最后要做的是检查安全选项卡,确保账户配置正确;完成后,您的安全设置应如图所示(图11)

图11:SMTP服务器的安全设置

一切设置完成后,单击“确定”按钮保存设置并关闭“默认SMTP虚拟服务器属性”对话框。

代码:从ASP.NET 2.0网页发送电子邮件

打开附带示例项目中的default.aspx代码窗口,检查用于发送电子邮件的代码。

导入

请注意,该项目仅包含三个导入

Imports System
Imports System.Net
Imports System.Net.Mail

该应用程序使用System.NET.Mail库来格式化和发送基于SMTP的电子邮件消息;这些导入是运行项目和发送电子邮件消息所必需的。这也是ASP.NET 2.0和Visual Studio 2005的新功能。

声明

在项目开头的声明部分,您将看到一个标准类声明,后面跟着一个名为“Declarations”的区域;在Declarations区域中,是用于包含发送邮件所需信息的一组变量

Partial Class _Default_
        Inherits System.Web.UI.Page

#Region "Declarations"

    ' message elements

    Private mMailServer As String
    Private mTo As String
    Private mFrom As String
    Private mMsg As String
    Private mSubject As String
    Private mCC As String
    Private mPort As Integer

#End Region

代码

第一段代码是一个用于生成警报的子程序;它与发送消息的主题无关,但我经常在需要从网页生成警报时使用此代码块。代码非常简单。它只是将定义和显示警报框所需的JavaScript代码放置到Label控件的文本字段中,然后将该控件添加到当前页面;由于Label会触发传递给它的任何JavaScript,因此一旦控件添加到页面,警报框就会触发。

Private Sub MessageBox(ByVal strMsg As String)

    ' generate a popup message using javascript alert function

    ' dumped into a label with the string argument passed in

    ' to supply the alert box text

    Dim lbl As New Label
    lbl.Text = "<script language="'javascript'">" & Environment.NewLine _

                & "window.alert(" & "'" & strMsg & "'" & ")</script>"

    ' add the label to the page to display the alert

    Page.Controls.Add(lbl)

End Sub

应用程序中唯一的其他代码是“发送”按钮的Click事件处理程序;此处理程序捕获用户在页面中的输入,使用这些输入填充与消息相关的变量,然后使用变量内容格式化消息。您可能会注意到,服务器和端口设置是从web.config文件中包含的AppSettings中提取的。

在检查代码时,请注意文件附件和抄送列表是如何由Try-Catch块中包含的代码处理的。如果您想添加密送(BCC收件人),您可以以类似于处理标准抄送列表的方式添加它们。

这是整个代码块

Protected Sub btnSend_Click(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles btnSend.Click

    'send message


    Dim strMsg As String
    strMsg = txtMessage.Text

    mTo = Trim(txtTo.Text)
    mFrom = Trim(txtFrom.Text)
    mSubject = Trim(txtSubject.Text)
    mMsg = Trim(txtMessage.Text)
    mMailServer = ConfigurationManager.AppSettings.Get("MyMailServer")
    mPort = ConfigurationManager.AppSettings.Get("MyMailServerPort")
    mCC = Trim(txtCC.Text)

    Try

        Dim message As New MailMessage(mFrom, mTo, mSubject, mMsg)

        If fileAttachments.HasFile Then
            Dim attached As New 
            Attachment(Trim(fileAttachments.PostedFile.FileName.ToString()))
            message.Attachments.Add(attached)
        End If

        If mCC <> "" Or mCC <> String.Empty Then
            Dim strCC() As String = Split(mCC, ";")
            Dim strThisCC As String
            For Each strThisCC In strCC
                message.CC.Add(Trim(strThisCC))
            Next
        End If


        Dim mySmtpClient As New SmtpClient(mMailServer, mPort)
        mySmtpClient.UseDefaultCredentials = True
        mySmtpClient.Send(message)

        MessageBox("The mail message has been sent to " & message.To.ToString())

    Catch ex As FormatException

        MessageBox("Format Exception: " & ex.Message)

    Catch ex As SmtpException

        MessageBox("SMTP Exception:  " & ex.Message)

    Catch ex As Exception

        MessageBox("General Exception:  " & ex.Message)

    End Try

End Sub

Try-Catch块中,请注意捕获了格式、SMTP和一般异常,并使用代码块开头的MessageBox子例程将其显示给用户。

代码:通过ASP.NET 2.0发送短信

打开包含的示例项目中的sendSmsMsg.aspx代码窗口,并检查用于以电子邮件形式发送短信的代码。

导入

请注意,该项目仅包含三个导入

Imports System
Imports System.Net
Imports System.Net.Mail

该应用程序使用System.NET.Mail库来格式化和发送基于SMTP的电子邮件消息;这些导入是运行项目和发送基于电子邮件的短信所必需的。

声明

在项目开头的声明部分,您会注意到一个标准类声明,后面跟着一个名为“Declarations”的区域;在Declarations区域中,是用于包含发送基于电子邮件的短信所需信息的一组变量

Partial Class sendSmsMsg _
        Inherits System.Web.UI.Page

#Region "Declarations"

    ' message elements

    Private mMailServer As String
    Private mTo As String
    Private mFrom As String
    Private mMsg As String
    Private mSubject As String
    Private mPort As Integer

#End Region

代码

到目前为止,您可能已经注意到,一切都是相同的;从现在开始,情况将继续相似,但有一些界面和变量差异使得通过SMTP服务器发送SMS消息成为可能。

关于发送短信最有趣的一点是,您不需要做任何特别的事情。运营商提供了一个接口,您可以通过该接口(在某些限制下)向手机订阅者发送电子邮件,然后运营商会将该消息作为短信传输给订阅者。

一般来说,需要知道的重要事项是,订阅者的地址是他们的十位手机号码(区号和号码)以及运营商指定的地址。此应用程序包含大多数美国运营商以及一些海外运营商的列表。如果您位于美国境外,您可能需要做一些研究才能找到您目标运营商的正确地址,我应该指出,有些运营商不支持此接口。

在页面加载事件处理程序中,我用运营商列表填充了一个下拉列表

Protected Sub Page_Load(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles Me.Load

    ' Load the names of the common carriers 

    cboCarrier.Items.Add("@itelemigcelular.com.br")
    cboCarrier.Items.Add("@message.alltel.com")
    cboCarrier.Items.Add("@message.pioneerenidcellular.com")
    cboCarrier.Items.Add("@messaging.cellone-sf.com")
    cboCarrier.Items.Add("@messaging.centurytel.net")
    cboCarrier.Items.Add("@messaging.sprintpcs.com")
    cboCarrier.Items.Add("@mobile.att.net")
    cboCarrier.Items.Add("@mobile.cell1se.com")
    cboCarrier.Items.Add("@mobile.celloneusa.com")
    cboCarrier.Items.Add("@mobile.dobson.net")
    cboCarrier.Items.Add("@mobile.mycingular.com")
    cboCarrier.Items.Add("@mobile.mycingular.net")
    cboCarrier.Items.Add("@mobile.surewest.com")
    cboCarrier.Items.Add("@msg.acsalaska.com")
    cboCarrier.Items.Add("@msg.clearnet.com")
    cboCarrier.Items.Add("@msg.mactel.com")
    cboCarrier.Items.Add("@msg.myvzw.com")
    cboCarrier.Items.Add("@msg.telus.com")
    cboCarrier.Items.Add("@mycellular.com")
    cboCarrier.Items.Add("@mycingular.com")
    cboCarrier.Items.Add("@mycingular.net")
    cboCarrier.Items.Add("@mycingular.textmsg.com")
    cboCarrier.Items.Add("@o2.net.br")
    cboCarrier.Items.Add("@ondefor.com")
    cboCarrier.Items.Add("@pcs.rogers.com")
    cboCarrier.Items.Add("@personal-net.com.ar")
    cboCarrier.Items.Add("@personal.net.py")
    cboCarrier.Items.Add("@portafree.com")
    cboCarrier.Items.Add("@qwest.com")
    cboCarrier.Items.Add("@qwestmp.com")
    cboCarrier.Items.Add("@sbcemail.com")
    cboCarrier.Items.Add("@sms.bluecell.com")
    cboCarrier.Items.Add("@sms.cwjamaica.com")
    cboCarrier.Items.Add("@sms.edgewireless.com")
    cboCarrier.Items.Add("@sms.hickorytech.com")
    cboCarrier.Items.Add("@sms.net.nz")
    cboCarrier.Items.Add("@sms.pscel.com")
    cboCarrier.Items.Add("@smsc.vzpacifica.net")
    cboCarrier.Items.Add("@speedmemo.com")
    cboCarrier.Items.Add("@suncom1.com")
    cboCarrier.Items.Add("@sungram.com")
    cboCarrier.Items.Add("@telesurf.com.py")
    cboCarrier.Items.Add("@teletexto.rcp.net.pe")
    cboCarrier.Items.Add("@text.houstoncellular.net")
    cboCarrier.Items.Add("@text.telus.com")
    cboCarrier.Items.Add("@timnet.com")
    cboCarrier.Items.Add("@timnet.com.br")
    cboCarrier.Items.Add("@tms.suncom.com")
    cboCarrier.Items.Add("@tmomail.net")
    cboCarrier.Items.Add("@tsttmobile.co.tt")
    cboCarrier.Items.Add("@txt.bellmobility.ca")
    cboCarrier.Items.Add("@typetalk.ruralcellular.com")
    cboCarrier.Items.Add("@unistar.unifon.com.ar")
    cboCarrier.Items.Add("@uscc.textmsg.com")
    cboCarrier.Items.Add("@voicestream.net")
    cboCarrier.Items.Add("@vtext.com")
    cboCarrier.Items.Add("@wireless.bellsouth.com")

End Sub

使用该应用程序时,您将在用于定义收件人地址的区域中看到此运营商列表(参见图12)

图12:用于寻址SMS收件人的运营商列表

该消息包含“收件人”地址、“发件人”地址、主题行和消息正文本身(长度限制为140个字符)。

单击“发送”按钮将通过执行以下Click事件处理程序启动整个过程

Protected Sub Button2_Click(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles Button2.Click

    'send message


    Dim strMsg As String
    strMsg = txtMessage.Text

    If strMsg.Length >= 140 Then
        strMsg = strMsg.Substring(1, 140)
    End If

    mTo = Trim(txtToNumber.Text) & _
          Trim(cboCarrier.SelectedItem.ToString())
    mFrom = Trim(txtFrom.Text)
    mSubject = Trim(txtSubject.Text)
    mMsg = Trim(txtMessage.Text)
    mMailServer = ConfigurationManager.AppSettings.Get("MyMailServer")
    mPort = ConfigurationManager.AppSettings.Get("MyMailServerPort")

    Try

        Dim message As New MailMessage(mFrom, mTo, mSubject, mmsg)
        Dim mySmtpClient As New SmtpClient(mMailServer, mPort)
        mySmtpClient.UseDefaultCredentials = True
        mySmtpClient.Send(message)

        MessageBox("The mail message has been sent to " & _
                    message.To.ToString())

    Catch ex As FormatException

        MessageBox("Format Exception: " & ex.Message)

    Catch ex As SmtpException

        MessageBox("SMTP Exception:  " & ex.Message)

    Catch ex As Exception

        MessageBox("General Exception:  " & ex.Message)

    End Try


End Sub

正如您将很快看到的,代码是相同的,只有几个 minor 差异;一个涉及验证消息大小是否小于 140 个字符,另一个主要差异在于收件人地址的构建方式。

当然,不言而喻,消息的接收者需要为交易支付费用,尽管将其设置为循环几千次并向您前妻的离婚律师发送“生日快乐”的祝福可能很诱人,但请不要这样做。

此页面中的其余代码与前面描述的默认页面相同;其中包括生成警报的代码;两个页面上还有一个超链接,允许您在页面之间来回切换。

摘要

本文和示例项目旨在演示使用SMTP通过.NET发送电子邮件消息的方法;这些示例还试图描述使用与发送标准电子邮件消息相同技术向手机订阅者发送短信的便捷性。

© . All rights reserved.