Использование электронной почты

Весьма часто разработчику Web-приложений приходится использовать в своих проектах функцию автоматической отправки электронной почты. Чаще всего электронные письма, которые создаются и отправляются автоматически, без участия администраторов, содержат какие-либо уведомления. Например, о совершении покупки в онлайновом магазине, или о подписке на рассылку новостей сайта. Так или иначе, практически ни один из серьезных проектов не обходится без использования электронной почты, и, следовательно, нам необходимо рассмотреть механизм ее использования в работе Web-приложений.

Для этого применяется класс SmtpMaii, располагающийся в пространстве имен System. Web. Mail. Основное его свойство SmtpServer типа string содержит адрес почтового сервера, на который будет отсылаться сообщение. А метод send отсылает письмо на этот сервер. В качестве параметра этому методу передается значение типа MaiiMessage. Именно этот тип полностью определяет отсылаемое сообщение. Рассмотрим этот тип подробнее.

    Attachments. Свойство задает список файлов, присоединяемых к письму Свойство имеет значение типа iList. Этот тип является коллекцией наименований файлов. всс. Свойство типа string. Его значением является список адресов электронной почты, по которым будет отправлено электронное письмо. Следует, однако, заметить, что в этом свойстве задаются адреса, входящие в список ВСС (Blind Carbon Сору), т. е. получатели, чьи адреса указаны в полях То (Кому) и Сору (Копия) не увидят в заголовке письма адреса из списка ВСС. Адреса, входящие в список ВСС, разделяются запятой. Body. Свойство типа string. В нем находится само тело электронного письма. BodyEncoding. Свойство типа Encoding. Задает кодировку символов сообщения. Тип Encoding является перечислимым типом. BodyFormat. Свойство типа MailFormat, в котором устанавливается формат тела электронного письма. Свойство может принимать значения Text и Html. Сс. Свойство типа string. В этом свойстве записываются адреса, разделенные запятыми, по которым будет отправлена копия электронного сообщения. From. Свойство типа string, в котором указывается электронный адрес отправителя письма. Priority. Свойство перечислимого типа MaiiPriority, в котором указывается приоритет отсылаемого письма. Свойство может принимать значения High, Low И Normal. Subject. Свойство типа string. В нем записывается тема отправляемого письма.   то. Свойство типа string. В нем указывается адрес электронной почты, по которому будет отправлено создаваемое сообщение.

Теперь, когда мы знаем структуру объектов, применяемых для отправки электронных писем, рассмотрим пример использования этой технологии. Создадим Web-приложение, которое будет предназначено для отправки ^пользователем сообщений по электронной почте.

На стартовой странице, которую мы сохраним под именем default. aspx, следует разместить три однострочных поля текстового ввода. В первое из них. пользователь будет вводить адрес получателя письма, во второе — обратный адрес, а третье поле предназначено для указания темы отправляемого сообщения. Также нам потребуется одно многострочное поле, в котором пользователь будет писать текст сообщения, и кнопка, подтверждающая отправку сообщения. К первым двум полям ввода, которые будут предназначены для ; ввода адресов электронной почты, следует присоединить компоненты под 'названием RegularExpressionValidator. Они будут следить за правильностью ввода адресов. В листинге
3.51 приведен HTML-код Web-страницы в режиме ее разработки.

Листинг 3.51

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="default. aspx. vb" Inherits="mailer. WebForml"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<titlex/title>

<meta name="GENERATOR" content="Microsoft Visual 7.0">

<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">

<meta name="vs_defaultClientScript" content="JavaScript">

<meta name="vs_targetSchema" con-tent="http://schemas. /intellisense/ie5">

</HEAD>

<body MS_POSITIONING="GridLayout">

<form id="Forml" method="post" runat="server">

<asp:Label id="Labell" style="Z-INDEX: 101; LEFT: 37px;

POSITION: absolute;

TOP: 24px" runat="server" Width="257px" Height="19px"> Виртуальный no4TaMT</asp:Label>

<asp;RegularExpressionValidator id="RegularExpressionValidator3" style="Z-INDEX: 110; LEFT: 34px;

POSITION: absolute;

TOP: 149px" runat="server" ЕггогМеззаде="Введен неверный адрес электронной почты"

 ControlToValidate="TextBox4" ValidationExpression="\w+([-+.]\w+)*@\ w+([-.]\w+)*\.\w+([-. ] \w+)*"X/asp:RegularExpressionValidator>

НЕ нашли? Не то? Что вы ищете?

<asp:TextBox id="TextBox4" style="Z-INDEX: 109; LEFT: 195px;

POSITION: absolute;

TOP: 115px" runat="server" Width="193px" Height="24px"x/asp:TextBox>

<asp:Label id="Labe!4" style="Z-INDEX: 108; LEFT: 37px;

POSITION: absolute;

TOP: 122px" runat="server" Width="151px" Height= "17рх">Адрес отправителЖ/asp: Label>

<asp:RegularExpressionValidator id="RegularExpressionValidator2" style="Z-INDEX: 104; LEFT: ЗЗрх;

POSITION: absolute;

TOP: 91px" runat="server" ЕггогМеззаде="Введен неверный адрес электронной почты" 4>ControlToValidate="TextBoxl" ValidationExpression="\w+([-+.]\w+)*@\ w+{ [-%>. 1 \w+) *\. \w+{ [-. ] \w-t-) *"x/asp:RegularExpressionValidator>

<asp:Label id="Labe!2" style="Z-INDEX: 102; LEFT: 37px;

POSITION: absolute;

TOP: 59px" runat="server" Width="127px" Height= "19рх">Дцрес получателя</азр^аЬе!>

<asp:TextBox id="TextBoxl" style="Z-INDEX: 103; LEFT: 195px;

POSITION: absolute;

TOP: 52px" runat="server" Width="193px" Height="24px"x/asp:TextBox>

<asp:RegularExpressionValidator id="RegularExpressionValidatorl" style="Z-INDEX: 105; LEFT: ЗЗрх;

POSITION: absolute;

TOP: 91px" runat="server" ЕггогМеззаде="Введен неверный адрес электронной почты" ControlToValidate="TextBoxl" ValidationExpression="\w+([-+.]\w+)*@\ w+([-.]\w+)*\.\w+([-.]\w+)*"x/asp:RegularExpressionValidator>

<asp:Label id="Labe!3" style="Z-INDEX: 106; LEFT: 37px;

 POSITION: absolute;

TOP: 186px" runat="server">TeMa письма</азр:Label>

<asp:TextBox id="TextBox2" style="Z-INDEX: 107; LEFT: 195px;

POSITION: absolute;

TOP: 177px" runat="server" Width="192px" Height="26px"x/asp:TextBox>

<asp:Label id="Labe!5" style="Z-INDEX: 111; LEFT: 37px;

POSITION: absolute;

TOP: 220px" runat="server">TeKCT nMCbMa</asp:Label>

<asp:TextBox id="TextBox3" style="Z-INDEX: 112; LEFT: 37px;

POSITION: absolute; TOP: 246px" runat="server" Width="353px" Height="99px" Rows="5"x/asp:TextBox>

<asp:Button id="Buttonl" style="Z-INDEX: 113; LEFT: 41px;

 POSITION: absolute;

TOP: 358px" runat="server" Width="166px" Height="24px" Text= "Отправить nMCbMO"x/asp:Button>

</form>

</body>

</HTML>

После того, как пользователь заполнит все поля и нажмет на подтверждающую кнопку, необходимо сформировать и отправить письмо. Этим будет заниматься класс, связанный с проектируемой страницей. Код этого класса приведен в листинге 3.52.

Листинг 3.51

Public Class WebForml

Inherits System. Web. UI. Page

Protected WithEvents Labell As System. Web. Ul. WebControls. Label Protected WithEvents Label2

As System. Web. Ul. WebControls. Label Protected WithEvents TextBoxl

As System. Web. UI. WebControls. TextBox

Protected WithEvents RegularExpressionValidatorl

As System. Web. UI. Webcontrols. RegularExpressionvalidator

Protected WithEvents Label3

As System. Web. Ul. WebControls. Label Protected WithEvents TextBox2

As System. Web. UI. WebControls. TextBox

Protected WithEvents RegularExpressionValidator2

As System. Web. UI. Webcontrols. RegularExpressionvalidator

Protected WithEvents Label4 As System. Web. Ul. WebControls. Label Protected WithEvents TextBox4

As System. Web. UI. WebControls. TextBox

Protected WithEvents RegularExpressionValidatorS

As System. Web. UI. WebControls. RegularExpressionvalidator

Protected WithEvents Labels

As System. Web. UI. WebControls. Label Protected WithEvents TextBoxS

As System. Web. Ul. WebControls. TextBox Protected WithEvents Buttonl

As System. Web. Ul. WebControls. Button

iRegion " Web Form Designer Generated Code "

'This call is required by the Web Form Designer.

<System. Diagnostics. DebuggerStepThrough()> Private Sub InitializeComponent()

End Sub

Private Sub Page_Init(ByVal sender

As System. Object, ByVal e

As System. EventArgs) Handles MyBase. Init

'CODEGEN: This method call is required by the Web Form Designer

 'Do not modify it using the code editor. InitializeComponent() End Sub

#End Region

Private Sub Page_Load(ByVal sender

As System. Object, ByVal

e As System. EventArgs) Handles MyBase. Load

'Put user code to initialize the page here

End' Sub

Private Sub Buttonl_Click(ByVal sender As System. Object, ByVal

e As System. EventArgs) Handles Buttonl. Click

Dim email As New Web. Mail. MailMessage() Dim smtp

As New Web. Mail. SmtpMail() email. To = TextBoxl. Text email. From = TextBox4.

Text email. Subject = TextBox2.Text email. Body = TextBox3.Text

smtp. SmtpServer = "my. *****" 'Задали имя используемого SMTP-сервера smtp. Send(email)

Response. Redirect("Webform. aspx")

End Sub

End Class

Рассмотрим несколько внимательнее обработчик события Buttoni_ciick. Для отправки электронного письма нам потребуются две переменные. Одна из них будет иметь тип MailMessage, и в ней будет располагаться полное описание отсылаемого сообщения, а вторая переменная будет иметь тип SmtpMail. Вторая переменная предназначена уже для отсылки созданного сообщения.

При объявлении этих переменных мы одновременно и создаем экземпляры соответствующих объектов при помощи оператора New. Следует также отметить, что искомые классы находятся в пространстве имен System. Web. Mail. Так как прямые вызовы конструкторов этих классов встречаются в нашей процедуре всего два раза, автор счел возможным не импортировать все пространство имен, а вместо этого использовать полные наименования конструкторов.

После того, как переменные созданы, можно приступать к их заполнению. Данные, введенные пользователем в поля ввода, мы присваиваем соответствующим свойствам переменной email. После того, как электронное сообщение сформировано, его необходимо отправить. Для этого необходимо воспользоваться переменной smtp. Сначала задать доменное имя или IP-адрес используемого SMTP-сервера при помощи свойства SmtpServer, а затем, воспользовавшись методом send, отправить письмо.

После того, как письмо будет отправлено, пользователь будет переадресован на другую Web-страницу, на которой отображается всего лишь сообщение о том, что электронное письмо отправлено успешно. В силу того, что эта страница максимально проста, мы не будем приводить ее листинга здесь.

Листинг 3.53

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML> <HEAD>

<title></title>

<meta name="GENERATOR" content="Microsoft Visual 7.0">

<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">

<meta name="vs_defaultClientScript" content="JavaScript">

<meta name="vs_targetSchema" content="http://schemas. /intellisense/ie5">

</HEAD>

<body MS_POSITIONING="GridLayout">

<form< name="Forml" method="post" action="default. aspx" language= "javascript" 4>onsubmit="ValidatorOnSubmit();" id="Forml">

<input type="hidden" name="__VIEWSTATE" value="dDwtNzQ! ODMxMDQ7Oz4=" />

<script language="javascript" src="/aspnet_client/system_Web/ l_0_2914_16/WebUIValidation. js"X/script>

<span id="Labell" style="height:19px;width:257px;Z-INDEX: 101; LEFT: 37px;

POSITION: absolute; TOP: 24рх">Виртуальный почтамт</зрап>

<span id="RegularExpressionValidator3" controltovalidate="TextBox4" еггогтеззаде="Введен неверный адрес электронной почты" evaluationfunction= "RegularExpressionValidatorEvaluatelsValid" validationexpression="\ w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" style="color:Red;Z-INDEX:110; LEFT:34px;

POSITION:absolute;

TOP:149px;visibility:hidden;">Введен неверный адрес электронной почты</зрап>

<input name="TextBox4" type="text" id="TextBox4"

style="height:24px;width:193px;Z-INDEX: 109; LEFT: 195px;

POSITION: absolute;

TOP: 115px" />

<span id="Labe!4" style="height:17px;width:151px;Z-INDEX: 108; LEFT: 37px;

POSITION: absolute; TOP: 122рх">Ддрес отлравителя</зрап>

<span id="RegularExpressionValidator2" controltovalidate="TextBoxl" еггоппеззаде="Введен неверный адрес электронной почты" evaluationfunction= "RegularExpressionValidatorEvaluatelsValid" validationexpression="\ w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" style="color:Red;Z-INDEX:104; EFT:33px;

POSITION:absolute;TOP:91px;visibility:hidden; ">Введен неверный адрес электронной почты</зрап>

<span id="Labe!2" style="height:19px;width:127px;Z-INDEX: 102; LEFT: 37px;

POSITION: absolute;

TOP: 59рх">Адрес получателя</зрап>

<input name="TextBoxl" type="text" id="TextBoxl"

style="height:24px;width:193px;Z-INDEX: 103; LEFT: 195px;

 POSITION: absolute;

TOP: 52px" />

<span id="RegularExpressionValidatorl" controltovalidate="TextBoxl" еггогтеззаде="Введен неверный адрес электронной почты" evaluationfunction= "RegularExpressionValidatorEvaluatelsValid" validationexpression="\ w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" style="color:Red;Z-INDEX:105; LEFT:33px;

POSITION:absolute;

TOP:91px;visibility:hidden;">Введен неверный адрес электронной почты</зрап>

<span id="Labe!3" style="Z-INDEX: 106; LEFT: 37px;

POSITION: absolute;

TOP: 186рх">Тема письма</зрап>

<input name="TextBox2" type="text" id="TextBox2" style= "height:26px;width:192px;Z-INDEX: 107; LEFT: 195px;

POSITION: absolute;

TOP: 177px" />

<span id="Labe!5" style="Z-INDEX: 111; LEFT: 37px;

POSITION: absolute; TOP: 220рх">Текст письма</зрап>

<input name="TextBox3" type="text" id="TextBox3" style= "height:99px;width:353px;Z-INDEX: 112; LEFT: 37px;

POSITION: absolute;

TOP: 246px" />

<input type="submit" name="Buttonl" value="OTnpaBMTb письмо" onclick= "if (typeof(Page ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="Buttonl" style="height:24px;width:166px;

Z-INDEX: 113; LEFT: 41px; POSITION: absolute;

TOP: 358px" />

<script language="javascript">

var Page_Validators = new

Array (document. all [ "RegularExpressionValidatorS " ] document. all [ "RegularExpressionValidator2"] ,

document . all [ "RegularExpressionValidatorl" ] ) ;

</script>

<script language=" javascript"> <! — \ var Page_ValidationActive = false/-

if (typeof (clientlnformation) != "undefined" && clientlnf ormation. appName.

indexOf ("Explorer") != -1) {

if (typeof (Page_ValidationVer) == "undefined")

alert ("Unable to find script library ' /aspnet_client/ system_Web/l_0_2914_16/WebUIValidation. js' .

Try placing this file manually, or reinstall by running 'aspnet_regiis - c'.");

else if (Page_ValidationVer l~ "121")

alert ("This page uses an incorrect version of WebUIValidation. js. The page expects version 121.

The script library is " + Page_ValidationVer + ".");

else

ValidatorOnLoad ( ) ; }

function ValidatorOnSubmit () { if (Page_ValidationActive) { ValidatorConmonOnSubmit ( ) ;

</script>

</form>

</body>

</HTML>

Естественно, HTML-код страницы получился столь большим из-за того, что при ее создании были использованы компоненты системы проверки достоверности, которые реализуются при помощи Java-сценариев, действующих на стороне пользователя.