Logo CitForum CITForum на CD Форумы Газета Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

24.05.2012

Google
WWW CITForum.ru
2001 г

Web почта на ASP.

Вернер А. Р., центр Интернет АСФ КемГУ.
Домашняя страничка.

Содержание:

Введение
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) и работает с ними в зависимости от имени пользователя.

Перейдем непосредственно к тому, как работает вебпочта.

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.ru

Новые публикации:

19 мая

  • Прозрачный механизм удаленного обслуживания системных вызовов

  • Система моделирования Grid: реализация и возможности применения

    Газета:

    Майкл Стоунбрейкер:

  • Ошибки в системах баз данных, согласованность "в конечном счете" и теорема CAP

  • Дискуссия по поводу "NoSQL" не имеет никакого отношения к SQL

    29 апреля

  • Материалы конференции "Корпоративные Базы Данных-2010"

  • Разные облики технологии баз данных (отчет о конференции)

    14 апреля

  • MapReduce: внутри, снаружи или сбоку от параллельных СУБД?

  • Научные вызовы технологиям СУБД

    Обзоры журнала Computer:

    31 марта

  • Рационализация согласованности в "облаках": не платите за то, что вам не требуется

  • Взаимные блокировки в Oracle

  • Архитектура среды тестирования на основе моделей, построенная на базе компонентных технологий

  • Объектное представление XML-документов

    Газета:

  • Microsoft для российских разработчиков: практика с элементами фундаментальности

    10 марта

  • HadoopDB: архитектурный гибрид технологий MapReduce и СУБД для аналитических рабочих нагрузок

  • Классификация OLAP-систем вида xOLAP

  • BGP. Три внешних канала. Балансировка исходящего и входящего трафиков

    Газета:

  • Что мы знаем об iPhone 4G?

    17 февраля

  • MapReduce и параллельные СУБД: друзья или враги?

  • Объектно-ориентированное программирование в ограничениях: новый подход на основе декларативных языков моделирования данных

  • Системологический подход к декомпозиции в объектно-ориентированном анализе и проектировании программного обеспечения

    Газета:

  • Эволюция Wine

    3 февраля

  • Дом на песке

  • Реальное переосмысление "формальных методов"

  • Интервью с Найджелом Пендзом

    Газета:

  • iPad. Первый взгляд на долгожданный планшет от Apple

  • Я не верю в iPad

    20 января

  • SQL/MapReduce: практический подход к поддержке самоописываемых, полиморфных и параллелизуемых функций, определяемых пользователями

  • Данные на лету: как технология потокового SQL помогает преодолеть кризис

    Обзоры журнала Computer:

    2 декабря

  • Сергей Кузнецов. Год эпохи перемен в технологии баз данных

    18 ноября

  • Генерация тестовых программ для подсистемы управления памятью микропроцессора

  • Сравнительный анализ современных технологий разработки тестов для моделей аппаратного обеспечения

    Все публикации >>>


  • IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

    Информация для рекламодателей PR-акции, размещение рекламы — тел. +7 495 6608306, ICQ 232284597 Пресс-релизы — pr@citforum.ru
    Послать комментарий
    Информация для авторов

    Редакция раздаёт котят!

    Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
    Copyright © 1997-2000 CIT, © 2001-2009 CIT Forum
    Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...