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