--<< Возврат к содержанию >>-- Назад

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

--<< Возврат к содержанию >>-- Назад