Работаем с веб-почтой
на ASP
Автор: Александр
Вернер, http://verner.asf.ru/
Источник: http://www.relib.com/
Введение
Для всех не секрет, что использование электронной почты на базе веб становиться в последнее время популярным. Есть у такого решения много достоинств:
- платформенная независимость
клиента;
- нет жесткой привязки клиентского рабочего
места;
- для доступа к ящику клиента не нужен 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://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 замедляет свою работу. Ну и конечно необходимо позаботиться о безопасности.