Вернер А. Р., центр Интернет АСФ КемГУ.
Введение.
Ни для кого не секрет, что использование электронной почты на базе вебдоступа становится в последнее время популярным.
Есть у такого решения много достоинств:
- платформенная независимость клиента;
- нет жесткой привязки клиентского рабочего места;
- для доступа к письмам не нужны POP3-сервер и клиент (иногда, правда, все же нужны);
- для работы с почтовым ящиком используются стандартные программы для вебсерфинга и т. д.;
и недостатков:
- проблемы с плохими каналами при удаленном доступе;
- проблема безопасности;
- локализация сообщений (характерно для неанглоязычных систем) и др.
У нас такая проблема возникла в связи с использованием операционной системы Windows NT и прокси-сервера для доступа к интернету. Подобная картина наблюдается, по-моему, во многих классах общего доступа.
Обычно класс входит в домен Windows NT и все пользователи имеют свою учетную запись. Поэтому было решено построить вебпочту на базе Windows 4.0 Option Pack для Windows NT Server (OP). В комплекте OP имеется SMTP-сервер, и пользователи Windows NT автоматически получают на нем учетную запись. Еще один компонент, который нам необходим - 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://verner.asf.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>
' проверяем важность
<td>
<% Select Case ofMsg.Importance
Case 0 %>
<img src="images/impor_l.gif" border=0 alt="Не важно.">
<% Case 1 %>
<img src="images/impor_0.gif" border=0 alt="Простое письмо.">
<% Case 2 %>
<img src="images/impor_h.gif" border=0 alt="Очень важно!!!">
<% End Select %>
</td>
Если в сообщении есть вложения, то:
<td>
<% If ofMsg.Attachments.Count > 0 Then %>
<img src="images/att.gif" border=0 alt="С письмом!">
<% Else %>
<img src="images/att0.gif">
<% End If %></center>
</td>
Пишем время сообщения:
<td>
<%= ofMsg.TimeReceived %>
</td>
Тема сообщения:
<TD>
<% If ofMsg.Subject = "" Then %>
Без темы
<% Else %>
<%= ofMsg.Subject %>
<% End If %>
</TD>
И напоследок размер сообщения:
<TD>
<%= ofMsg.Size %>
</TD>
' Идем к следующему сообщению
</TR>
<% Next %>
3. Чтение почтового сообщения.
Текст письма.
' делаем активным, например, первое сообщение
<% Set ofMsg = objMessages.Item(1) %>
' если необходимо, обрабатываем текст сообщения
<%
Dim tre
tre = Mid(ofMsg.HTMLText, InStr(ofMsg.HTMLText, "</HEAD>")+7)
tre = Replace(tre, "</BODY>", "")
tre = Replace(tre, "</HTML>", "")
%>
' выводим
<%= tre%>
Если в почтовом сообщении есть вложения, то:
<% If ofMsg.Attachments.Count > 0 Then %>
<%
Dim ic, fname, fs
' физический путь к вложениям пользователя
path = "C:\Inetpub\wMail\Att\"
Set fs = CreateObject("Scripting.FileSystemObject")
For ic = 1 To ofMsg.Attachments.Count
fname = ofMsg.Attachments.Item(ic).Name
If fname <> "" Then
' проверяем наличие папки для пользователя
If fs.FolderExists(path&muName)=False Then fs.CreateFolder(path&muName)
' пишем вложение(я) в папку
ofMsg.Attachments.Item(ic).WriteToFile path&muName&"/"&fname
%>
<%= ic %>: <a href='att/<%= muName&"/"&fname%>'><%= fname%></a><br>
<%
End If
Next
%>
<%End If%>
Теперь рассмотрим создание почтового сообщения.
4. Создаем новое письмо (файл newmail.asp)
Форма для почтового сообщения (упращенная):
<form action="newmail.asp?mTo=<%= mTo%>&mSubject=
<%= mSubject%>&mText=<%= Request("mText") %>" method="POST">
<input type="Hidden" name="mSend" value="1">
<input type="Hidden" name="FileName2" value="<%= mAttachment&fExt %>">
<input type="Text" name="mTo" title="" value=<%= Request("mTo")%>><br>
<input type="Text" name="mSubject" title="" value=<%= Request("mSubject")%>>
<textarea name="mText" cols="50" rows="14" title="">
<%= Request("mText") %></textarea>
<select name="mPriority">
<option value="0">Низкий</option>
<option value="1" selected>Нормальный</option>
<option value="2">Высокий</option>
</select>
<input type="Submit" name="Send" value="Отправить">
</form>
Определяем необходимые переменные с формы и не только:
<%
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")
%>
Если все переменные не пусты, то формируем почтовое сообщение:
If Request("mSend") = 1 And mTo <> "" Then
Dim myMail
Set myMail = CreateObject("CDONTS.NewMail")
myMail.From = muName & "@" & domain
myMail.To = mTo
myMail.Subject = mSubject
myMail.Body = mText
myMail.Importance = Request.Form("mPriority")
' собственно посылаем сообщение
er=myMail.Send
Set myMail = Nothing
End If
Если необходимо создать почтовое сообщение с вложением, то для этого нужен компонент для загрузки вложения на сервер (например, Posting Acceptor от Microsoft или любой другой, работающий по RFC 1867). После загрузки вложения его очень просто присоединить к письму:
myMail.AttachFile path&muName&"\"&file
5. Адресная книга и др.
Адресную книгу можно создать, сохраняя в текстовом файле данные об адресатах. Например вот так:
Можно сохранять индивидуальные настройки для каждого пользователя, используя текстовый документ или Cookies.
Большой недостаток VB-Script - мало функций для работы с текстовыми строками.
6. Выводы.
Как видно из вышесказанного, построение вебпочты на ASP под Windows NT вполне возможно и довольно просто.
Есть и недостатки: SMTP-сервер при плохих каналах может терять сообщения и др.; при большом количестве почтовых сообщений компонент CDO замедляет свою работу.
Ну и, конечно, необходимо позаботиться о безопасности.