|
| ||||||||||||
| ||||||||||||
|
2001 г
Web почта на ASP.Вернер А. Р., центр Интернет АСФ КемГУ. Содержание:Введение Введение.Ни для кого не секрет, что использование электронной почты на базе вебдоступа становится в последнее время популярным. Есть у такого решения много достоинств:
- платформенная независимость клиента; и недостатков:
- проблемы с плохими каналами при удаленном доступе; У нас такая проблема возникла в связи с использованием операционной системы 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
|
|
CITForum © 1997–2025