HomeASP › Web почта на ASP

Web почта на ASP

Вернер А. Р., центр Интернет АСФ КемГУ.

Содержание:
Введение
1. Авторизация
2. Чтение почтового ящика пользователя
3. Чтение почтового сообщения
4. Создаем новое письмо
5. Адресная книга
6. Выводы

Введение.

Для всех не секрет, что использование электронной почты на базе веб становиться в последнее время популярным.
Есть у такого решения много
достоинств:
— платформенная независимость клиента;
— нет жесткой привязки клиентского рабочего места;
— для доступа к ящику клиента не нужен POP3 сервер и клиент(иногда нужен);
— для работы с почтовым ящиком используются стандартные программы для веб-серфинга и т. д.;
и недостатков:
— проблемы с плохими каналами при удаленном доступе;
— проблема безопасности;
— локализация сообщений(характерно для не англоязычных систем) и др.
У нас такая проблема возникла в связи с использованием операционной системы Windows NT и прокси сервера для доступа к Интернет. Подобная картина наблюдается, по моему, во многих классах общего доступа.
Обычно класс входит в домен Windows NT и все пользователи имеют свою учетную запись. Поэтому было решено построить веб-почту на базе Windows 4.0 Option Pack для Windows NT Server(OP). В комплекте OP имеется SMTP сервер, пользователи Windows NT имеют автоматически учетную запись на SMTP сервере. И еще один компонент, который нам необходим — Microsoft® CDO for NTS Library(Collaboration Data Objects for Windows NT® Server).
Этот компонент при работе с SMTP сервером обращается к общей папке с сообщениями(обычно …Mailroot/Drop) и работает с ними в зависимости от имени пользователя.
Перейдем непосредственно к тому, как работает веб-почта.

1. Авторизация.

Для авторизации пользователя можно использовать несколько методов.
Самый простой у первой странички убрать анонимный доступ. В этом случае пользователь при обращении к странице должен будет ввести ИМЯ и ПАРОЛЬ в стандартном окне для авторизации.
Я использовал этот метод, но немного изменил его.
Пользователь вводит ИМЯ и ПАРОЛЬ в стандартной форме.

HTML код для индексной(начальной) странички следующий:

...
<form name="Login" action="r.asp" method="POST">
<tr>
  <td>Имя</td>
  <td><input type="Text" name="user" title="Введите Имя."></td>
</tr>
<tr>
  <td>Пароль</td>
  <td><input type="Password" name="passw" title="Введите Пароль."></td
</tr>
<tr>
<td></td>
<td align="RIGHT"><input type="Submit" name="ent" value="Вход"></td>
</td>
</tr>
</form>
...

Следующая страничка(r.asp):

<html>
<head>
<META HTTP-EQUIV="Refresh" CONTENT='0; URL=<%="http://" & Request.Form("user") & _
   ":" & Request.Form("passw") & "@ mail.youhost.ru/index2.asp" %>'>
	<title>Login</title>
</head>
<body bgcolor="#C0C0C0">
Login in progress...
</body>
</html>

Таким образом, формируется простой запрос типа:

http://USERNAME:PASSWORD@mail.youhost.ru/index2.asp

Анонимный доступ к страничке index2.asp должен быть отключен.
Ну а теперь все просто, если ИМЯ и ПАРОЛЬ действительны, то получаем серверную переменную AUTH_USER и используем ее в дальнейшем для проверки успешной авторизации.

Страничка index2.asp:

<%Option Explicit %>
<%
If Request.ServerVariables("LOGON_USER") = "" Then
	Response.Write("403 Access Forbidden")
	Response.End
Else
	Response.Redirect "in.asp"
	Response.End
End If
%>

Как видно из кода, при успешной авторизации пользователь попадает на страничку in.asp — главную страничку веб-почты.

Этот код необходимо вставить на все странички веб-почты!

<%
	  If Request.ServerVariables("LOGON_USER") = "" Then
           Response.Redirect "index.html"
           Response.End
	  End If
%>

Код для авторизации выполненный отдельно доступен по адресу http://averner.ru
Теперь можно перейти к собственно к чтению почтового ящика пользователя.

2. Чтение почтового ящика пользователя.

Для просмотра почтового ящика открываем сессию методом LogonSMTP и инициализируем объект сообщений objMessages:

<%
Dim mLog
Dim objSession
Dim objMessages
Dim muName
domain = "youhost.ru"

muName = Request.ServerVariables("LOGON_USER")
Set objSession = CreateObject("CDONTS.Session")
mLog = objSession.LogonSMTP(muName, muName & "@" & domain)
Set objMessages = objSession.Inbox.Messages
%>

Если сообщений нет:

objMessages.Count <= 0

то пишем клиенту:

Response.Write "Вам нет сообщений"

Если сообщения есть то организуем цикл:

Dim mCol(objMessages.Count)

	For i = 1 To objMessages.Count
	Set ofMsg = mCol(i)
	Set objAddrEntry = ofMsg.Sender

Пишем клиенту строки в таблице:

<tr>

<span style="color: #008000;">' проверяем важность</span>

&lt;td&gt;
&lt;% Select Case ofMsg.Importance
	Case 0 %&gt;
&lt;img src="images/impor_l.gif" border=0 alt="Не важно."&gt;
&lt;% Case 1 %&gt;
&lt;img src="images/impor_0.gif" border=0 alt="Простое письмо."&gt;
&lt;% Case 2 %&gt;
&lt;img src="images/impor_h.gif" border=0 alt="Очень важно!!!"&gt;
&lt;% End Select %&gt;
&lt;/td&gt;

Если в сообщении есть вложения то:

&lt;td&gt;
&lt;% If ofMsg.Attachments.Count &gt; 0 Then  %&gt;
&lt;img src="images/att.gif" border=0 alt="С письмом(возможно пришли файлы)!"&gt;
&lt;% Else %&gt;
&lt;img src="images/att0.gif"&gt;
&lt;% End If %&gt;&lt;/center&gt;
&lt;/td&gt;

Пишем время сообщения:

&lt;td&gt;
&lt;%= ofMsg.TimeReceived %&gt;
&lt;/td&gt;

Тема сообщения:

&lt;TD&gt;
&lt;% If ofMsg.Subject = "" Then %&gt;
Без темы
&lt;% Else %&gt;
&lt;%= ofMsg.Subject %&gt;
&lt;% End If %&gt;
&lt;/TD&gt;

И на последок размер сообщения:

&lt;TD&gt;
&lt;%= ofMsg.Size %&gt;
&lt;/TD&gt;

<span style="color: #008000;">' Идем к следующему сообщению</span>

&lt;/TR&gt;
&lt;% Next %&gt;

Вот собственно и все. Результат выглядит примерно так:

3. Чтение почтового сообщения.

Текст письма.

<span style="color: #008000;">' делаем активным например первое сообщение</span>
&lt;% Set ofMsg = objMessages.Item(1) %&gt;

<span style="color: #008000;">' если необходимо обрабатываем текст сообщения</span>
&lt;%
Dim tre
tre = Mid(ofMsg.HTMLText, InStr(ofMsg.HTMLText, "&lt;/HEAD&gt;")+7)
tre = Replace(tre, "&lt;/BODY&gt;", "")
tre = Replace(tre, "&lt;/HTML&gt;", "")
%&gt;
<span style="color: #008000;">' выводим</span>
&lt;%= tre%&gt;

Если в почтовом сообщении есть вложения то:

&lt;% If ofMsg.Attachments.Count &gt; 0 Then %&gt;
&lt;%
Dim ic, fname, fs
<span style="color: #008000;">' физический путь к вложениям пользователя</span>
path = "C:InetpubwMailAtt"
Set fs = CreateObject("Scripting.FileSystemObject")
For ic = 1 To ofMsg.Attachments.Count
fname = ofMsg.Attachments.Item(ic).Name
If fname &lt;&gt; "" Then

<span style="color: #008000;">' проверяем наличие папки для пользователя</span>
		If fs.FolderExists(path&amp;muName)=False Then fs.CreateFolder(path&amp;muName)

<span style="color: #008000;">' пишем вложение(я) в папку</span>
		ofMsg.Attachments.Item(ic).WriteToFile path&amp;muName&amp;"/"&amp;fname
%&gt;
&lt;%= ic %&gt;: &lt;a href='att/&lt;%= muName&amp;"/"&amp;fname%&gt;'&gt;&lt;%= fname%&gt;&lt;/a&gt;&lt;br&gt;
&lt;%
End If
Next
%&gt;
&lt;%End If%&gt;

Результат выглядит примерно так:

Вот собственно и все. Теперь рассмотрим создание почтового сообщения.

Форма для почтового сообщения(упращенная):

 

&lt;form action="newmail.asp?mTo=&lt;%= mTo%&gt;&amp;mSubject=&lt;%= mSubject%&gt;&amp;
mText=&lt;%= Request("mText") %&gt;" method="POST"&gt;
&lt;input type="Hidden" name="mSend" value="1"&gt;
&lt;input type="Hidden" name="FileName2" value="&lt;%= mAttachment&amp;fExt %&gt;"&gt;
&lt;input type="Text" name="mTo" title="" value=&lt;%= Request("mTo")%&gt;&gt;&lt;br&gt;
&lt;input type="Text" name="mSubject" title="" value=&lt;%= Request("mSubject")%&gt;&gt;
&lt;textarea name="mText" cols="50" rows="14" title=""&gt;&lt;%= Request("mText") %&gt;&lt;/textarea&gt;
&lt;select name="mPriority"&gt;
&lt;option value="0"&gt;Низкий&lt;/option&gt;
&lt;option value="1" selected&gt;Нормальный&lt;/option&gt;
&lt;option value="2"&gt;Высокий&lt;/option&gt;
&lt;/select&gt;

&lt;input type="Submit" name="Send" value="Отправить"&gt;
&lt;/form&gt;

Выглядит это так:

 

Определяем необходимые переменные с формы и не только:

 

&lt;%
Dim objNewMail
Dim i, muName, recipient, fl, Post, file, fs, afl, er
Dim mTo, mSubject, mText, mAttachment, mPriority, fExt
Post = ""
muName = Request.ServerVariables("LOGON_USER")
mTo = Request.Form("mTo")
mSubject = Request.Form("mSubject")
mText = Request.Form("mText")
mAttachment = Request.Form("FileName")
fExt = Request.Form("FileExtention")
mPriority = Request.Form("mPriority")
file = Request.Form("FileName2")
%&gt;

Если все переменные не пустые то формируем почтовое сообщение:

 

If Request("mSend") = 1 And mTo &lt;&gt; "" Then
	Dim myMail
	Set myMail = CreateObject("CDONTS.NewMail")
	myMail.From = muName &amp; "@" &amp; domain
	myMail.To = mTo
	myMail.Subject = mSubject
	myMail.Body = mText
	myMail.Importance = Request.Form("mPriority")
<span style="color: #008000;">' собственно посылаем сообщение</span>
	er=myMail.Send
	Set myMail = Nothing
End If

Если необходимо создать почтовое сообщение с вложением, то для этого нужен компонент для загрузки вложения на сервер(например Posting Acceptor от Microsoft или любой другой работающий по RFC 1867). После загрузки вложения его очень просто присоединить к письму:

 

	myMail.AttachFile path&amp;muName&amp;""&amp;file

5. Адресная книга и др.

Адресную книгу можно создать сохраняя в текстовом файле данные об адресатах. Например вот так:

 

Можно сохранять индивидуальные настройки для каждого пользователя используя текстовый документ или Cookies.
Большой недостаток VB-Script — мало функций для работы с текстовыми строками.

 

(файл newmail.asp)

Как видно из вышесказанного построение веб почты на ASP под Windows NT вполне возможно и довольно просто.
Есть конечно и большие недостатки.
SMTP сервер при плохих каналах может терять сообщения и др.
При большом количестве почтовых сообщений компонент CDO замедляет свою работу.
Ну и конечно необходимо позаботиться о безопасности.

Leave a Comment