Статьи

Отправка электронной почты с использованием ASP на .Net Server или WinXP Pro

Эта статья появилась вместе с надеждой, что она поможет разработчикам ASP перейти с существующих серверов NT и Windows 2000 на новые платформы веб-серверов Microsoft, поддерживая при этом устаревший код ASP. Весь код прокомментирован и протестирован на Windows XP Pro SP1 и Windows Dot.Net Server 2003 SR1 и SR2.

Возможно, одна из наиболее полезных задач, которые может выполнить веб-сайт, — это предоставить возможность собирать отзывы от посетителей и отправлять эту информацию ответственным сторонам. Большинство разработчиков, использующих ASP с NT или Windows 2000, наслаждались простотой разработки сценариев для отправки и получения электронной почты. DLL, предоставившая удобный почтовый объект CDO, называется cdonts.dll. Длинное название — Collaboration Data Objects для Windows NT® Server или, как я это называю, CDO для NT.

Microsoft и cdonts.dll

Microsoft, по-своему, также называет cdonts.dll CDO для NT.

После выпуска XP мне неоднократно говорили, что XP не запускает определенный почтовый скрипт или что новый сервер .Net заблокировал электронную почту и т. Д. Причина, по которой XP и .Net Server выдают ошибки, скорее чем запускать почтовые сценарии ASP, как это делали NT или Win2k, потому что CDONTS — старая технология.

Когда Windows 2000 была выпущена, Microsoft указала, что cdonts.dll устарела и что новым почтовым объектом для использования был cdosys.dll. Windows 2000 шла с обоими CDO DLL, но написание было на стене. CDONTS выходил, и разработчики ASP должны изучить новый почтовый объект, CDOSYS. К сожалению, не было много информации о том, как перенести существующие сценарии ASP для работы с CDOSYS.

Windows XP Pro и .Net Server 2003 больше не поставляются с CDONTS, поэтому, если вы запустите скрипт электронной почты CDONTS, вы получите ошибку. Опытные разработчики ASP, вероятно, думают: «Ну, я всегда мог взять cdonts.dll из моего дистрибутива Win2k и зарегистрировать его на моем компьютере с XP или Dot.Net». И вы можете, но это противоречит Лицензионному соглашению с конечным пользователем (EULA) от Microsoft, и, поскольку использование нового почтового объекта относительно просто, почему бы не воспользоваться этим? Новый объект требует меньше накладных расходов, и если вы покопаетесь в нем, вы обнаружите, что он также обладает большей функциональностью.

Классический ASP-скрипт

Вот пример скрипта обратной связи с использованием классического ASP / CDONTS.

<% 

'EMAIL FORM USING CLASSIC ASP AND CDONTS  
Dim varName, varEmail,  
varCompany, varTelephone, varComments, varSend, thisPage
varName  = Request.Form("txtName")
varEmail  = Request.Form("txtEmail")
varCompany  = Request.Form("txtCompany")
varTelephone  = Request.Form("txtPhone")
varComments  = Request.Form("txtComments")
varSend  = Request.Form("send")
thisPage  = Request.ServerVariables("SCRIPT_NAME")

If not varSend = 1 Then  
'OUTPUT THE CONTACT FORM

%>

<form action="<%= thisPage %>" method="post">
 <input type="hidden" name="send" value="1">  
   <p>Feel free to contact us using this web form</p>
   <p>&nbsp;</p>
     <table width="100%" border="0" cellspacing="0" cellpadding="0">
       <tr valign="top">  
         <td align="right">Name:</td>
         <td width="3%">&nbsp;</td>
         <td nowrap><input type="text" name="txtName" size="35"></td>
       </tr>
       <tr valign="top">  
         <td align="right">Company:</td>
         <td width="3%">&nbsp;</td>
         <td><input type="text" name="txtCompany" size="35"></td>
       </tr>
       <tr valign="top">  
         <td align="right">email:</td>
         <td width="3%">&nbsp;</td>
         <td nowrap><input type="text" name="txtEmail" size="35"></td>
       </tr>
       <tr valign="top">  
         <td align="right">Telephone:</td>
         <td width="3%">&nbsp;</td>
         <td><input type="text" name="txtPhone" size="25"></td>
       </tr>
       <tr valign="top">  
         <td align="right">Comments:</td>
         <td width="3%">&nbsp;</td>
         <td><textarea name="txtComments" rows="5"  
cols="35"></textarea></td>
       </tr>
       <tr valign="top">  
         <td align="right">&nbsp;</td>
         <td width="3%">&nbsp;</td>
         <td>&nbsp;</td>
       </tr>
       <tr valign="top">  
         <td align="right"><input type="submit"  
name="Submit" value="Submit"></td>
         <td width="3%">&nbsp;</td>
         <td><input type="reset" name="Reset"  
value="Reset" class="frm"></td>
       </tr>
     </table>
   </form>

<%

Else
 'SEND MAIL  
   
   Dim ObjMail
   Set ObjMail = Server.CreateObject("CDONTS.NewMail")
   objMail.From = varName & " <" & varEmail & ">"
   objMail.To = "[email protected]" ' Add your email address
   objMail.Subject = "Contact from Your Website"
   objMail.Body = varName & ""_  
       & VBCrLf & varCompany & ""_  
       & VBCrLf & varTelephone & ""_  
       & VBCrLf & VBCrLf & varComments & VBCrLf  
   objMail.Send

   Set objMail = Nothing

 'AND OUTPUT THANK YOU
   
 Response.Write "Hey "& varName & ",<br />"_  
     & VBCrLf & "Thanks for your feedback.<br />"_
     & VBCrLf & "We'll contact you as soon as possible!"  

End If
   
%>

Эта удобная страница обратной связи прекрасно работает на серверах NT и Windows 2000, но будьте внимательны! Если вы запустите указанный выше сценарий на сервере без поддержки CDONTS, вас встретит неприятная ошибка сценария VB, указывающая на то, что вы вызвали какой-то недопустимый класс. Чтобы сделать этот сценарий совместимым с новым почтовым объектом CDOSYS, вам нужно внести пару небольших изменений.

Твики для соответствия CDOSYS

Это действительно не так уж сложно. Первый блок кода ASP и основная форма HTML остаются прежними. Только выходной блок кода ASP должен быть изменен.

В качестве бонуса мы будем использовать атрибут HTMLBody почтового объекта для вывода нашей электронной почты в виде HTML. По умолчанию это также создает текстовую версию для поддержки старых почтовых клиентов.

Внесите эти изменения в последний блок кода ASP (обратите внимание, что измененный код выделен жирным шрифтом):

 <%  
 
Else  
 
'SEND MAIL AND OUTPUT THANK YOU RESPONSE  
   
 'REPLACE LINE RETURNS WITH HTML BREAKS  
 varComments = Replace(varComments, chr(10), "<br />")  
 
 'THE MAIL OBJECT  
 Dim ObjMail  
 Set ObjMail = Server.CreateObject("CDO.Message")  
 objMail.From = varName & " <" & varEmail & ">"  
 objMail.To = "[email protected]" ' add your email address  
 objMail.Subject = "Contact from Your Website"  
 objMail.HTMLBody = varName & "<br />"_  
     & VBCrLf & varCompany & "<br />"_  
     & VBCrLf & varTelephone & "<br />"_  
     & CBCrLf & varComments & "<br />"
   
 objMail.Send  
 
 Set objMail = Nothing  
 
'AND OUTPUT THANK YOU  
     
Response.Write "Hey "& varName & ",<br />"_  
   & VBCrLf & "Thanks for your feedback.<br />"_  
   & VBCrLf & "We'll contact you as soon as possible!"  
 
End If  
 
%>

Как видите, для перехода с CDONTS на CDOSYS необходимо отрегулировать только 3 строки кода, и первое изменение заключается в замене возвращаемых строк ascii тегом разрыва строки html. Если бы мы использовали текстовую версию objMail.TextBodyobjMail.HTMLBody

Во время тестирования, однако, я столкнулся с ошибкой …

Глюк

В бета-версиях .Net Server SR1 и SR2 приведенный выше код должен выполняться без инцидентов, но у меня было немало времени, чтобы убедить его запустить на WinXP Pro. Я не мог избежать этих ошибок:

 Error Type:  
CDO.Message.1 (0x80040220)  
The "SendUsing" configuration value is invalid.

База знаний на msdn.Microsoft.com содержит некоторую информацию об этих ошибках для сервера Exchange, но лучшие ссылки, которые я нашел для ASP и Windows 2000 / XP, приведены в нижней части этой статьи. С тех пор я изменил исходный код CDOSYS, добавив некоторые скрипты конфигурации, чтобы предотвратить ошибку «SendUsing». Если у вас есть проблемы с запуском кода на вашем компьютере с Windows XP Pro или Windows 2000, сделайте следующие дополнения к вашему коду:

Поместите этот код вверху страницы, прежде чем появится какой-либо другой код (статьи на www.asp101.com и www.markforum.tk внесли следующие изменения):

 <!--METADATA TYPE="typelib"   
UUID="CD000000-8B95-11D1-82DB-00C04FB1625D"  
NAME="CDO for Windows 2000 Library" -->  
<!--METADATA TYPE="typelib"  
UUID="00000205-0000-0010-8000-00AA006D2EA4"  
NAME="ADODB Type Library" -->

Последний блок кода должен выглядеть следующим образом (обратите внимание, что измененный код выделен жирным шрифтом):

 <%  
 
Else  
 
'SEND MAIL AND OUTPUT THANK YOU RESPONSE  
   
 'REPLACE LINE RETURNS WITH HTML BREAKS  
 varComments = Replace(varComments, chr(10), "<br />")  
 
 'THE MAIL OBJECT  
 Dim ObjMail  
 Set ObjMail = Server.CreateObject("CDO.Message")  
 
 Set objConfig = CreateObject("CDO.Configuration")  
 
 'Configuration:  
 objConfig.Fields(cdoSendUsingMethod) = cdoSendUsingPort  
 objConfig.Fields(cdoSMTPServer) = "localhost"  
 objConfig.Fields(cdoSMTPServerPort) = 25  
 objConfig.Fields(cdoSMTPAuthenticate) = cdoBasic    
 
 'Update configuration  
 objConfig.Fields.Update  
 Set objMail.Configuration = objConfig
 
 
 objMail.From = varName & " <" & varEmail & ">"  
 objMail.To = "[email protected]" 'Add your email address  
 objMail.Subject = "Contact from Your Website"  
 objMail.HTMLBody = varName & "<br />"_  
     & VBCrLf & varCompany & "<br />"_  
     & VBCrLf & varTelephone & "<br />"_  
     & CBCrLf & varComments & "<br />"    
 objMail.Send  
 
 Set objMail = Nothing  
 Set objConfig = Nothing  
 
'AND OUTPUT THANK YOU  
     
Response.Write "Hey "& varName & ",<br />"_  
   & VBCrLf & "Thanks for your feedback.<br />"_  
   & VBCrLf & "We'll contact you as soon as possible!"  
 
End If  
 
%>
Ресурсы по настройке CDO для Windows XP и Windows 2000

Сеть разработчиков Microsoft
http://msdn.microsoft.com

Отправка электронной почты через внешний SMTP-сервер с использованием CDO на ASP101.com
http://www.asp101.com/articles/john/cdosmtprelay/default.asp