Вернер А. Р., центр Интернет АСФ КемГУ.
Домашняя страничка.
Введение
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) и работает с ними в зависимости от имени пользователя.
Перейдем непосредственно к тому, как работает вебпочта.
Для авторизации пользователя можно использовать несколько методов.
Самый простой - у первой странички убрать анонимный доступ. В этом случае пользователь при обращении к странице должен будет ввести ИМЯ и ПАРОЛЬ в стандартном окне для авторизации.
Я использовал этот метод, но немного изменил его.
Пользователь вводит ИМЯ и ПАРОЛЬ в стандартной форме.
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.
Теперь можно перейти к собственно к чтению почтового ящика пользователя.
Для просмотра почтового ящика открываем сессию методом 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 %>
Вот, собственно, и все. Результат выглядит примерно так:
Текст письма. ' делаем активным, например, первое сообщение <% 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%>
Результат выглядит примерно так:
Теперь рассмотрим создание почтового сообщения.
Форма для почтового сообщения (упращенная):
<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
Адресную книгу можно создать, сохраняя в текстовом файле данные об адресатах. Например вот так:
Можно сохранять индивидуальные настройки для каждого пользователя, используя текстовый документ или Cookies.
Большой недостаток VB-Script - мало функций для работы с текстовыми строками.
Как видно из вышесказанного, построение вебпочты на ASP под Windows NT вполне возможно и довольно просто.
Есть и недостатки: SMTP-сервер при плохих каналах может терять сообщения и др.; при большом количестве почтовых сообщений компонент CDO замедляет свою работу.
Ну и, конечно, необходимо позаботиться о безопасности.
Вернер А. Р., оригинальный текст http://verner.asf.ru