Статьи - Загрузка файлов на сервер и посылка e-mail с вложениями
Загрузка файлов на сервер и посылка e-mail с вложениями
Одним из популярнейших вопросов во всевозможных форумах является вопрос «Как загрузить файл на сервер?». А ведь на самом деле это не так сложно, как кажется на первый взгляд. И чтобы не было совсем легко – пусть скрипт, который приведен ниже еще и посылает этот файл по почте, в виде вложения.
Для использования скрипта нужно установить 2 модуля: MIME::Lite и CGI
Второй скорее всего у вас есть, а первый необходимо скачать. Документацию по CGI.pm можно посмотреть здесь
Приступим к разбору листинга:
Строчки с первой по третью не делают ничего очень важного. Первая – стандартное начало любого скрипта, вторая и третья – по вкусу.
5-12 строки – конфигурация скрипта:
Cтроки 7,8,9 – параметры письма (соответственно от кого, к кому и тема)
Cтрока 10 – значение INCLUDE_META, которое если равно 1, то в письмо включается еще одно вложение с различной служебной информацией: о загруженном файле, переменных окружения и т.д.
Строка 14 – подключение модуля CGI.pm. Здесь не используется объектно-ориентированный интерфейс, а просто импортируются все функции.
16 строка – получение переданных браузером параметров, если они есть. Если в процессе закачки файла возникнет ошибка, то скрипт сразу прервет свою работу и сообщит об ошибке (cgi_error()). При проверке в Perl 5.0 под Windows я столкнулся с ошибкой – обругали меня за то, что функции cgi_error() нет. Пришлось сходить на CPAN.org и взять новую версию CGI.pm (в моем случае это была версия 2.74)
Строки с 22 по 37 выводят форму для загрузки файла. Форма объявляется как multipart, в HTML-виде это выглядит так: enctype="multipart/form-data". Строка 29 – специальное поле для загрузки файла, в браузере оно отображается с кнопочкой «Обзор» (или “Browse”) справа.
Строки 30 и 31 предлагают пользователю определить, как будет передаваться файл – как текст (mime-тип: quoted-printable) или как бинарник (тип: base64)
Форма закончилась – начался разбор параметров. Если скрипт вызывается первый раз – то здесь его работа закончится, а если пользователь нажимает кнопку Upload – то далее идет обработка:
Строка 40 – подключение модуля MIME::Lite
Строка 41 и 42 – получение файла, который пользователь загрузил и информации о нем в переменные $file и $info. $file в зависимости от контекста - и файл, и строка.
Строки 43-45 создают объект-письмо $msg. Ему присваиваются поля «от кого», «кому» и «тема» - ведь письмо должно куда-то придти.
Если включен конфигурационный параметр INCLUDE_META – строки с 46 по 56 создают первое вложение в письмо, содержащее служебную информацию. Если вдруг в этой служебной информации будут русские буквы – то лучше Encoding поменять на 8bit.
Строки 57-65 выполняют основную работу – создают вложение-файл, закачанный пользователем. 58-60 строки – выбор типа вложения, в зависимости от того, который был указан в форме.
Ну и последние строчки скрипта – с 66 по 74 – отправляют сообщение по почте. Здесь используется метод send_by_smtp(), он более универсален, однако использует модуль Net::SMTP. Можно также использовать send_by_sendmail() (тогда sendmail будет искаться в /usr/lib/, что можно поменять, передав параметр Sendmail=>…, подробнее смотрите в модуле MIME::Lite)
А если при передаче произошла ошибка при отправке письма – то скрипт просто выдаст пользователю на страницу все что должен был отправить по почте.
Вот такой хороший скриптик. Может быть он и не будет работать на вашем сервере сам по себе, но зато его части очень даже можно использовать в любом проекте.