Эта статья появилась вместе с надеждой, что она поможет разработчикам 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> </p>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr valign="top">
<td align="right">Name:</td>
<td width="3%"> </td>
<td nowrap><input type="text" name="txtName" size="35"></td>
</tr>
<tr valign="top">
<td align="right">Company:</td>
<td width="3%"> </td>
<td><input type="text" name="txtCompany" size="35"></td>
</tr>
<tr valign="top">
<td align="right">email:</td>
<td width="3%"> </td>
<td nowrap><input type="text" name="txtEmail" size="35"></td>
</tr>
<tr valign="top">
<td align="right">Telephone:</td>
<td width="3%"> </td>
<td><input type="text" name="txtPhone" size="25"></td>
</tr>
<tr valign="top">
<td align="right">Comments:</td>
<td width="3%"> </td>
<td><textarea name="txtComments" rows="5"
cols="35"></textarea></td>
</tr>
<tr valign="top">
<td align="right"> </td>
<td width="3%"> </td>
<td> </td>
</tr>
<tr valign="top">
<td align="right"><input type="submit"
name="Submit" value="Submit"></td>
<td width="3%"> </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.TextBody
objMail.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