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 автоматически получают на нем учетную запись. Еще один компонент, который нам необходим - 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 замедляет свою работу.

Ну и, конечно, необходимо позаботиться о безопасности.

Вернер А. Р., оригинальный текст http://verner.asf.ru