Додому Лікування зубів Пунктуальний inurl sendmail php. Надсилання листів за допомогою php

Пунктуальний inurl sendmail php. Надсилання листів за допомогою php

Під час цих функцій відбувається за налаштуваннями в php.ini .

Mail configuration options
Name Default Changeable Changelog
mail.add_x_header "0" PHP_INI_PERDIR Available since PHP 5.3.0.
mail.log NULL PHP_INI_PERDIR Available since PHP 5.3.0. (PHP_INI_SYSTEM|PHP_INI_PERDIR)
mail.force_extra_parameters NULL PHP_INI_PERDIR Available since PHP 5.0.0. (PHP_INI_SYSTEM|PHP_INI_PERDIR)
SMTP "localhost" PHP_INI_ALL
smtp_port "25" PHP_INI_ALL
sendmail_from NULL PHP_INI_ALL
sendmail_path "/usr/sbin/sendmail -t -i" PHP_INI_SYSTEM
Для подальших details і definitions of the PHP_INI_* modes, see the .

Тут's short explanation of the configuration directives.

Add X-PHP-Originating-Scriptщо буде включено UID script, що випливає з filename.

Mail.log string

The path to a log file that will log all mail() calls. Log entries include the full path of the script, line number, To

address and headers. string

Mail.force_extra_parameters Для того, щоб встановити особливі параметри, щоб бути прописані як інші параметри до sendmail binary. Ці параметри will always mail() replace the value of the 5th parameter to

, even in safe mode. string

SMTP mail()Використовується під Windows лише: host name або IP-адреса SMTP-сервера PHP повинна використовуватися для mail sent with the

функція. Smtp_port

int SMTP Used under Windows only: Number of the port to connect to the server specified with the mail() setting when sending mail with

; defaults to 25. string

Sendmail_from Which"From:" mail address should be used in mail sent from PHP under Windows.Це directive also sets the

"Return-Path:" string

header. Sendmail_path Where the sendmail program can be found, usually /usr/sbin/sendmail or /usr/lib/sendmail . configure does honest attempt locating this one for you

and set Sendmail_pathнеобхідно встановити цей directive до sendmail wrapper/replacement їх mail system offers, if any.

Для прикладу, » Users Qmail може бути налаштований спочатку на /var/qmail/bin/sendmail або /var/qmail/bin/qmail-inject . qmail-inject

does no require any option to process mail correctly.

Це прямі роботи також під Windows. Якщо вибрати, smtp , smtp_port і sendmail_from є ignored and specified command is executed.

5 років тому

На Ubuntu 13.04, немає ніякого іншого Distros.

If you simply uncomment the default:

sendmail_path = "sendmail -t -i"

Your mail() functions will all fail. Це означає, що ви повинні place FULL PATH (i.e. /usr/sbin/sendmail -t -i)

Documentation states PHP tries it's best to find the correct sendmail path, but it clearly failed for me.

So, будь-де вводити в FULLPATH до sendmail або ви можете отримати невідповідні помилки результатів.

Як 2-й денний потік: Those that just want to enforce the -f parameter, you can do so in php.ini using: mail.force_extra_parameters =

[email protected]

Ви можете скористатися sendmail path commented out, це буде слід використовувати defaults (under UNIX -t -i options which if you look them up are very important to have set)....

Але, тепер немає ніякого способу, щоб змінити це, навіть з 5-ою думкою про mail() функцію. -f є важливою, тому що якщо не вказано, буде встановлювати, до якого його користувача PHP script is running under, and you may not want that. Also, -f sets the Return-Path: header which is used as the Bounce address, if errors occur, so you can process them. You you

can not set Return-Path: в mail() headers for some reason... you could before. Натисніть на -f option.

2 years ago
Якщо будь-який gets це cryptic error message в PHP error logs:
"sh: -t: command not found"

після upgrading від PHP 5.4, це може бути рішення для вас.

I upgraded PHP від ​​5.4 до 5.6 і всі наші mail() функціональність suddenly broke, без використання надійних повідомлень.

Ini файл; it is now ignored if you use ini_set() specify path to sendmail binary on the fly.

So, just specify "sendmail_path" в php.ini instead. "Це є все, що це - fixed all the mail() functionality for us."

Hope це мало помітити, що деякий час, як дуже багато часу, як я спроможний методипрограми і дослідження. Cheers!

3 years ago

Setting return path:

Return-path header не працює, тому що це не частина smtp.
On *nix -f отримає на mail command
альтернативно
note: no colon after "From"
or you may be able to re-configure you MTA to interpret interpret return-path headers

F is most most reliable method but it mai mean that you can't set any other command-line option due to shell escaping problems.

also note that email formatting requirements different between windows and everything else. sendmail expects only \n line-endings

Нещодавно налаштовував домашній сервер і знадобилося мені там протестувати надсилання пошти. Але біда, при запиті сторінки, яка відправляє пошту вилазила 500 помилка.

Проблема

Почав дивитися, в чому справа. У логах php-fpm нічого цікавого немає, у логах nginx видно, що php-fpm upstream відвалює по таймауту.

2013/04/18 15:28:01 6928#0: *1409 upstream timed out (110: Connection timed out) while reading response header from upstream, client: xx.xx.xx.xx, server: , request: "POST /page.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9010", host: "site.ru", referrer: "http://site.ru"

І тут мені на думку спала ідея заглянути в syslog. Там-то я і побачив цікаві рядки:

Sep 9 18:53:20 mega sm-msp-queue: My unqualified host name (mega) unknown; sleeping for retry Sep 9 18:54:20 mega sm-msp-queue: нерозумна якість нашого майна (mega) -- using short name

Ага, почав грішити у бік sendmail. Намагаюся перезапустити його командою:

Sudo service sendmail restart

і бачу підтвердження своєї припущення.

Andrey@mega:/home/andrey# sudoservice sendmail restart sudo: unable to resolve host xyz.xyz * Restarting Mail Transport Agent (MTA) sendmail andrey@mega:/home/andrey#

Рішення

Справа виявилася в імені сервера. Після того, як поставив таке ім'я сервера (з точкою) - все запрацювало як треба.

127.0.0.1 localhost localhost.localdomain mega mega.foobar

Дякую!

Якщо вам допомогла стаття, або ви хочете підтримати мої дослідження та блог – ось кращий спосібзробити це:

Щоразу налаштовуючи локальний веб-сервер, стикаюся з питанням про заглушку для Sendmail.

Є чудове рішення для Windows: fake sendmail for windows(sendmail.exe) http://glob.com.au/sendmail/
На хабрі є стаття про це рішення: PHP mail під Windows http://habrahabr.ru/post/26518/
Ще одне рішення під Windows: Test Mail Server Tool http://www.toolheap.com/test-mail-server-tool/
Також є стаття для лінуксоїдів: Sendmail-заглушка для Linux http://habrahabr.ru/post/49665/

Особисто мені більше сподобалося рішення на чистому PHP, про яке піде подальший опис.

Особливість цього рішення в тому, що для його налаштування мінімальна, можна навіть обійтися без самого файлу, якщо, звичайно, вам немає потреби знати вміст повідомлення. На мій погляд, такий метод вартий того, що б про нього знали інші розробники PHP.

Питання в тому, що є вашим пріоритетом як розробника, ваші потреби від заглушки, а також ваш рівень знань та умінь.

Із плюсів:

  • Відсутність сторонніх сервісів
  • Кросплатформне рішення для OS на якій встановлений PHP
  • Мінімальний розмір файлу заглушки
  • Мінімальне налаштування
  • Вся логіка заглушки доступна для редагування на PHP
  • Збереження повідомлення у файлі

З мінусів:

  • Відсутність пересилання на реальну поштову скриньку
  • Відсутність зручного доступу до надісланих повідомлень

Список аргументів та можливостей заглушки:

  • --dir<Путь к папке> - Папка для файлів
  • --file<имя файла> - Зберігати кожне повідомлення у конкретному спільному файлі
  • --prepend- Додавати нове повідомлення на початок спільного файлу
  • --open- Автоматично відкривати файл повідомлення у Notepad

Параметри для файлу PHP.INI:

;SMTP = localhost ;smtp_port = 25 ;sendmail_from = mail.force_extra_parameters = sendmail_path = "php.exe C:\sendmail.php --dir C:\mail --open"

Якщо шлях до php.exe прописаний у PATH, то можна не вказувати його в PHP.INI інакше бажано змінити php.exe на<Путь к папке с PHP>\php.exe

Sendmail_path = "C:\server\bin\php\php.exe C:\sendmail.php --dir C:\mail --open"

На лінукс можна відразу вказати шлях до файлу, не забувши попередньо зробити його, що запускається: chmod 755 sendmail.php
sendmail_path = "/home/someuser/sendmail.php --dir /tmp/mail"

Сам sendmail.php скрипт:

#!/usr/bin/env php

Як я і обіцяв, є можливість обійтися зовсім без файлу.

Sendmail_path = "C:serverbin php.php.exe -r "echo 1;"

Або використовувати спрощений варіант рішення

Sendmail_path = "C:\server\bin\php\php.exe C:\sendmail.php"

sendmail.php:

#!/usr/bin/env php

Радий, якщо Вам це буде корисним.

Щоразу налаштовуючи локальний веб-сервер, стикаюся з питанням про заглушку для Sendmail.

Є чудове рішення для Windows: fake sendmail for windows(sendmail.exe) http://glob.com.au/sendmail/
На хабрі є стаття про це рішення: PHP mail під Windows
Ще одне рішення під Windows: Test Mail Server Tool http://www.toolheap.com/test-mail-server-tool/
Також є стаття для лінуксоїдів: Sendmail-заглушка для Linux

Особисто мені більше сподобалося рішення на чистому PHP, про яке піде подальший опис.

Особливість цього рішення в тому, що для його налаштування мінімальна, можна навіть обійтися без самого файлу, якщо, звичайно, вам немає потреби знати вміст повідомлення. На мій погляд, такий метод вартий того, що б про нього знали інші розробники PHP.

Питання в тому, що є вашим пріоритетом як розробника, ваші потреби від заглушки, а також ваш рівень знань та умінь.

Із плюсів:

  • Відсутність сторонніх сервісів
  • Кросплатформне рішення для OS на якій встановлений PHP
  • Мінімальний розмір файлу заглушки
  • Мінімальне налаштування
  • Вся логіка заглушки доступна для редагування на PHP
  • Збереження повідомлення у файлі

З мінусів:

  • Відсутність пересилання на реальну поштову скриньку
  • Відсутність зручного доступу до надісланих повідомлень

Список аргументів та можливостей заглушки:

  • --dir<Путь к папке> - Папка для файлів
  • --file<имя файла> - Зберігати кожне повідомлення у конкретному спільному файлі
  • --prepend- Додавати нове повідомлення на початок спільного файлу
  • --open- Автоматично відкривати файл повідомлення у Notepad

Параметри для файлу PHP.INI:

;SMTP = localhost ;smtp_port = 25 ;sendmail_from = mail.force_extra_parameters = sendmail_path = "php.exe C:\sendmail.php --dir C:\mail --open"

Якщо шлях до php.exe прописаний у PATH, то можна не вказувати його в PHP.INI інакше бажано змінити php.exe на<Путь к папке с PHP>\php.exe

Sendmail_path = "C:\server\bin\php\php.exe C:\sendmail.php --dir C:\mail --open"

На лінукс можна відразу вказати шлях до файлу, не забувши попередньо зробити його, що запускається: chmod 755 sendmail.php
sendmail_path = "/home/someuser/sendmail.php --dir /tmp/mail"

Сам sendmail.php скрипт:

#!/usr/bin/env php

Як я і обіцяв, є можливість обійтися зовсім без файлу.

Sendmail_path = "C:serverbin php.php.exe -r "echo 1;"

Або використовувати спрощений варіант рішення

Sendmail_path = "C:\server\bin\php\php.exe C:\sendmail.php"

sendmail.php:

#!/usr/bin/env php

Радий, якщо Вам це буде корисним.

Сергій Супрунов

Як працює Sendmail? Корисні подробиці

Частина 4: Взаємодія зі сторонніми програмами

Гуртом і батька добре бити.

Мудрість братнього народу

Як би не був гнучким і функціональним Sendmail, його можливостей не завжди вистачає для вирішення всього різноманіття завдань. Але відкритість ПЗ тим і хороша, що дозволяє нарощувати міць майже без обмежень.

Захисту не буває багато

Sendmail, як було показано у попередніх частинах статті (№ 5, 6, 7 за 2006 р. – ; http :// www. samag. ru/cgi-bin/go. pl? q = articles; n=06.2006; a=02; ), дозволяє, використовуючи файл aliases або .forward-файли, перенаправляти вхідні повідомлення на обробку сторонніми програмами. Сам механізм досить простий: лист у вихідному форматі надходить на стандартний вхід (stdin) зазначеної програми або скрипта, який займається його обробкою. Нескладний приклад реалізації такого сценарію на Python можна знайти у статті «Практикум Python: обробляємо електронну пошту, що входить» (№2 за 2006 р. – http :// www. samag. ru/cgi-bin/go. pl? q = articles; n=02.2006; a=01).

Однак тут ховається потенційна проблема безпеки – якщо користувач матиме можливість самостійно вказувати будь-які програми як обробників пошти, то завжди залишається ймовірність, що він скористається цим для несанкціонованого виклику програми, до якої в нормальних умовах у нього немає доступу (наприклад, не надається доступ до командної оболонки, але можна вносити зміни в.forward-файл через веб-інтерфейс). Звичайно, Sendmail знижує до мінімуму негативні наслідки цієї можливості, запускаючи процес, що виконує таку обробку від імені користувача-власника.forward-файлу. Але не можна забувати, що в системі можуть бути файли, на які встановлено біт suid, що в ряді випадків може призвести до сумних наслідків.

Для вирішення цієї проблеми Sendmail можна налаштувати на роботу з обмеженою оболонкою (restricted shell for sendmail) - smrsh. Особливістю цієї оболонки є те, що вона дозволяє запускати програми тільки зі свого каталогу, в системах FreeBSD за промовчанням це /usr/libexec/sm.bin (змінити можна перекомпіляцією утиліти із прапором -DSMRSH_CMDDIR).

Як це працює, найкраще подивитися на прикладі (після ключа -c вказується ім'я програми):

# pwd

/usr/libexec/sm.bin

# ls -l

total 0

# /usr/libexec/smrsh -c w

10:01AM up 20 days, 21:44, 1 user, load averages: 0.00, 0.02, 0.00

USER TTY FROM LOGIN@ IDLE WHAT

serg p0 curs3.myserver. 8:48AM - /usr/libexec/sm.bin/w

# /usr/libexec/smrsh -c who

/usr/libexec/smrsh: "який" недоступний для sendmail programs (stat failed)

# /usr/libexec/smrsh -c thetest

Smrsh test

Як бачите, smrsh дозволяє виконувати ті програми, посилання на які (або самі двійкові файли) розміщені в /usr/libexec/sm.bin. Це саме стосується і скриптів – достатньо вказати посилання на скрипт, робити посилання на інтерпретатор не потрібно. За бажанням ви можете використовувати будь-яке ім'я програми – використовуватиметься ім'я посилання, а не первісне ім'я «бінарника».

Щоб Sendmail використовував для обробки перенаправлень цю оболонку, а не стандартну sh, додайте в mc-файл такий рядок:

FEATURE(smrsh)

Любителі редагувати cf-файл можуть замінити ім'я програми у рядку Mprog, тобто. замість Mprog, P=/bin/sh . . . використовувати Mprog, P=/usr/libexec/smrsh . . . ».

Вхід тільки за перепустками

Якщо для всіх ваших користувачів передбачається робота тільки з вашої підмережі (або в крайньому випадку існує обмежений і стабільний список зовнішніх мереж для доступу до пошти), то завдання обмеження режиму ретрансляції пошти, щоб ваш MTA не став відкритим релеєм, вирішується досить легко з за допомогою файлу access.

Але як тільки у вас з'являються користувачі, яким потрібно забезпечити можливість роботи з їхньою електронною поштою з будь-якої точки світу, виникає певна проблема. І найприйнятнішим її рішенням буде використання аутентифікації.

Мабуть, найзручнішою методикою для Sendmail є використання SASL-автентифікації силами пакету SASL-Auth. За промовчанням Sendmail у FreeBSD збирається без підтримки SASL, у чому можна переконатися, подавши таку команду:

$ sendmail -d0.1 -bv

і уважно вивчивши рядки «Compiled with» щодо згадки про SASL.

Щоб підтримка SASL у Sendmail з'явилася, потрібно перезбирати його. Для цього у вас мають бути вихідні коди системи. Послідовність дій така:

  1. Встановлюємо порти security/cyrus-sasl2-saslauthd. Конфігурацію можна залишити за замовчуванням.
  2. У файлі /usr/local/lib/sasl2/Sendmail.conf перевіряємо значення змінної pwcheck_method. За умовчанням вона визначена як saslauthd, що означає використання універсального демона і буде гарним рішенням у більшості випадків.
  3. Редагуємо /etc/make.conf, додавши кілька рядків, які будуть використовуватися при складанні системних програм:
  4. # Прапори SASL для Sendmail

    SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2

    SENDMAIL_LDFLAGS=-L/usr/local/lib

    SENDMAIL_LDADD=-lsasl2

    # Підтримка порту smtps для sendmail (якщо планується)

    SENDMAIL_CFLAGS+= -D_FER_SMTP_SSL

    Тут ми вказуємо додавати при компіляції Sendmail ці прапори, а також повідомляємо програмі make шляхи до необхідних бібліотек.

  5. Тепер перезбираємо Sendmail:

# cd /usr/src/lib/libsmutil/

# cd ../libsm

# make clean && make depend && make

# cd /usr/src/usr.sbin/sendmail

# make clean && make depend && make && make install

Обов'язково переконайтеся, що встановили пакет cyrus-sasl (див. пункт 1), інакше отримайте помилку про відсутність потрібних бібліотек. До речі, щоб ці бібліотеки не доводилося знаходити по всьому диску, рекомендується ставити все тільки з системи портів.

Тепер у виведеній інформації має бути згадка SASLv2:

$ sendmail -d0.1 –bv

Version 8.13.6

Compiled with: . . .SASLv2 . . .

Це означає, що залишилося підкоригувати за необхідності конфігурацію Sendmail і можна перевіряти роботу системи. Перше, що може вимагати налаштування, це список дозволених методів автентифікації. Те, що ви отримали відразу після перекомпіляції, можна дізнатися, підключившись за допомогою telnet на 25-й порт і ввівши команду EHLO:

$ telnet localhost 25

Trying 127.0.0.1...

Connected to localhost.

Escape character is "^]".

220 server.ru ESMTP Sendmail 8.13.6/8.13.6;

EHLO me

250-server.ru Hello localhost, pleased to meet you

250-ENHANCEDSTATUSCODES

250-PIPELINING

250-8BITMIME

250-SIZE 12500000

250-DSN

250-AUTH GSSAPI DIGEST-MD5 CRAM-MD5

250-DELIVERBY

250 HELP

Третій з кінця рядок якраз і відображає підтримувані механізми автентифікації. Змінити їх список можна за допомогою таких директив:

TRUST_AUTH_MECH(`DIGEST-MD5 LOGIN PLAIN")dnl

define(`confAUTH_MECHANISMS", `DIGEST-MD5 LOGIN PLAIN")dnl

У другому рядку перераховуються підтримувані механізми взагалі, тоді як першою директивою визначаємо список «довірених» механізмів, тобто. тих, під час використання яких буде дозволено пересилання пошти (relaying), навіть якщо адреса клієнта не позначено у базі access як RELAY чи OK.

Хлопці! Та я ж свій!

Іноді може виникнути ситуація, коли ваш сервер для того, щоб передати кудись повідомлення, сам повинен буде пройти автентифікацію. Наприклад, це цілком звичайна ситуація, якщо ваш MTA працює виключно через сервер провайдера, а провайдер не бажає витрачати сили на додавання вашого хоста до списку довірених, наполягаючи на обов'язковому проходженні всіма клієнтами процедури автентифікації.

Для цього існує файл authinfo, який підключається таким чином:

FEATURE(`authinfo", `hash -o /etc/mail/authinfo")

У зазначеному файлі прописуємо параметри аутентифікації на потрібні сервери у такому форматі:

AuthInfo:servak.de "U:" "I:" "P:" "M:LOGIN PLAIN"

Тут servak.de – ім'я дистанційного сервера, якому потрібно буде надати автентифікаційну інформацію. У ключі M вказуються методи, які повинні використовуватися. Не забудьте створити хеш цього файлу.

LDAP – шлях до єднання

У великих корпоративних мережах часто використовуються бази LDAP для зберігання інформації про користувачів цих мереж. І було б дуже розумно скористатися цим механізмом для збереження певної конфігураційної інформації вашого поштового сервера.

Sendmail підтримує можливість роботи з LDAP-базою, дозволяючи вам використовувати службу каталогів замість файлів access, aliases і т. д. Правда, так само, як і у випадку SASL, у FreeBSD він зібраний без підтримки LDAP. Включається ця підтримка аналогічно:

  1. Встановлюємо з портів openldap-client або openldap-server (якщо LDAP-сервера у нас ще немає, і ми хочемо запустити його на цій же машині).
  2. Вносимо зміни до /etc/make.conf:
  3. # Прапори LDAP для Sendmail

    SENDMAIL_CFLAGS+= -I/usr/local/include -DLDAPMAP

    SENDMAIL_LDFLAGS+= -L/usr/local/lib

    SENDMAIL_LDADD+= -lldap -llber

  4. Перебираємо Sendmail, як описано для SASL (див. пункт 4).

Тепер уже знайома нам команда має вивести згадку і про LDAP:

# sendmail -d0.1 -bv root | grep LDAP

Після перекомпіляції (або установки) Sendmail перевірте в /usr/local/etc/openldap/slapd.conf, чи підключена схема sendmail.schema.

Якщо ні, додайте рядок:

include /usr/share/sendmail/cf/sendmail.schema

Ця команда підключить схему для Sendmail (де визначено допустимі атрибути записів), що потрібно правильного заповнення потрібних полів.

Тепер залишилося занести до каталогу LDAP необхідні записи (як це зробити, дивіться в документації з LDAP; кілька корисних посилань наведено в кінці статті) і додати до mc-файлу директиви, що вказують, що слід використовувати LDAP:

define(`confLDAP_DEFAULT_SPEC", `-h ldap.your.domain.ru -b dc=your,dc=domain,dc=ru")

FEATURE(`access_db", `LDAP")

define(`ALIAS_FILE", `ldap:")

Перший рядок визначає параметри LDAP-сервера, другий ми вказуємо, що замість /etc/mail/access слід використовувати службу каталогів, третім рядком аналогічно вказуємо використовувати LDAP для визначення псевдонімів.

Альтернативні LDA

Sendmail дозволяє підключати практично будь-яку програму як локальний агент доставки, природно, за умови, що ця програма буде «поводитися як LDA» (пам'ятаєте? – «якщо це виглядає як качка, крякає як качка і ходить як качка, то це – качка »). Завдяки цьому ми маємо можливість досить сильно впливати на те, як пошта зберігатиметься. Тому не дивно, що, крім стандартного для FreeBSD, mail.local розроблено велику кількість «альтернативних» агентів доставки.

Перш за все згадується дуже потужна програма procmail, що надає найширші можливості по обробці пошти, перш ніж вона потрапить до поштової скриньки користувача. Її часом так активно використовують для боротьби зі спамом, що лист у принципі може взагалі потрапити до користувача. Недарма у багатьох дистрибутивах Linux саме вона працює у парі з Sendmail за умовчанням. Щоб скористатися його перевагами, достатньо підключити цей LDA (директивою MAILER(procmail), відповідний m4-файл входить у стандартне постачання Sendmail) і вказати в mailertable використання цього LDA для потрібних доменів:

your.domain procmail

Другий варіант - включити в mc-файл директиву FEATURE(`local_procmail'), яка дасть вказівку використовувати procmail як стандартний LDA (оголошений як local).

FEATURE(`local_procmail", `/usr/local/bin/maildrop", `maildrop -d $u")

Тут ми скористалися тією ж директивою, тільки замість шляху до procmail вказали необхідний нам. До речі, якщо procmail у вас встановлений нестандартно (тобто не /usr/local/bin), то і для його підключення потрібно вказувати повний шлях. Звичайно, для повноцінної роботи з Maildir ваш POP3/IMAP-сервер теж повинен вміти працювати з цим форматом, втім, це вже зовсім інша історія.

Наступний крок до досконалості – DBMail

Для повного щастя добре ще додати гнучкості поштовим скринькам користувачів. Одне з рішень – використовуватиме їх зберігання реляційну СУБД, як і реалізується проектом DBMail.

Докладно про DBMail тут ми говорити не будемо (цей пакет з успіхом може застосовуватися не тільки у зв'язці з Sendmail, але й іншими популярними MTA). Деяка загальна інформація представлена ​​у врізці «DBMail». Також зверніться до статті Євгена Прокоп'єва «Поштовий сервер на основі реляційної СУБД» (№1 за 2006 р.), де робота DBMail висвітлена дуже детально.

Оскільки розміщення вхідної кореспонденції поштових скриньок користувачів не є функцією MTA (як ви пам'ятаєте з першої частини статті, цим займається агент локальної доставки (LDA)), то з точки зору Sendmail його логіка обробки повідомлень не змінюється. Все що потрібно - це зареєструвати DBMail як LDA і дати вказівку Sendmail використовувати саме його для доставки кореспонденції, як ми це робили для procmail. Перше завдання вирішується однією з наступних директив у mc-файлі:

MAILER(dbmail)

MAILER(dbmail-lmtp)

Друге завдання (щоб Sendmail знав, для якої пошти слід використовувати той чи інший LDA) – налаштування mailtertable для використання цього LDA:

your.domain dbmail

other.domain dbmail-lmpt:

Звичайно, ви можете вказати використання dbmail лише для необхідних доменів. Не забудьте все перезбирати і перезавантажити процес sendmail, щоб зміни набули чинності.

Думаю, можна також безболісно скористатися тим самим прийомом, яким ми підключали maildrop (тобто створивши видимість, що наш dbmail – це procmail і скориставшись готовими шаблонами для цього LDA). Щоправда, практично це не відчував.

Розширені можливості фільтрації

Дуже широкі можливості для обробки повідомлень надають поштові фільтри, що з'явилися у версії 8.11.6 (неофіційно – з 8.10), або «мільтери» (milter, абревіатура від Mail fILTER).

Поштові фільтри широко застосовуються для взаємодії з такими програмами, як антивіруси, спам-фільтри і т. д. Тобто вони, по суті, надають можливість «загортати» повідомлення сторонній програмі, що обробляється, через мережевий або UNIX-сокет. До речі, використання для взаємодії сокетів дозволяє розміщувати програму-фільтр на іншій машині в мережі, що в ряді випадків може бути корисним для централізації обробки або зниження навантаження на основний сервер, якщо фільтрація вимагає суттєвих обчислювальних ресурсів або створює велике навантаження на дискову підсистему. Але не можна забувати і про додаткові затримки в цьому випадку, так само як і про безпеку інформації, що передається по сокету.

Фільтр дозволяє контролювати обробку листа починаючи з моменту встановлення з'єднання з віддаленим сервером і до його отримання. У будь-який момент обробка може бути перервана за допомогою одного з прапорів повернення: ACCEPT (прийняти повідомлення), REJECT (відхилити з повідомленням про це відправника) або DISCARD (відкинути без будь-яких повідомлень). Тобто, скажімо, якщо необхідність відхилити повідомлення буде виявлено на ранніх стадіях сеансу, наприклад, на основі інформації, вміщеної в заголовок, то це можна буде зробити до того, як лист буде прийнято повністю. Ще один приклад використання такої можливості - прийом повідомлення (ACCEPT) без перевірки всіх вкладень на віруси, якщо в заголовку буде виявлено рядок, що інформує про те, що така перевірка вже виконувалася сервером відправника (хоча цілком довіряти таким заголовкам, звичайно ж, не варто) .

Крім рішення про те, прийняти або відхилити повідомлення, milter дозволяє вносити зміни в тему або тіло повідомлення, додавати рядки в заголовок, і т. д. Завдяки цьому можна, наприклад, помістити в заголовок інформацію про виконану антивірусну перевірку або залишити позначку, що лист визнано можливим спамом. Саме так роблять багато антивірусні та антиспамові пакети.

Умовно схема проходження листа через підключені фільтри показано на рис. 1. Фільтрів може бути скільки завгодно багато (реальне обмеження накладається лише навантаженням на систему та вимогами до припустимої затримки при обробці повідомлень). Порядок застосування фільтрів визначається порядком їхнього підключення в конфігураційному файлі.

До речі, про конфігурацію... Підключається milter такою директивою:

INPUT_MAIL_FILTER(`clmilter", `S=local:/var/run/clamav/clmilter.sock,F=, T=S:4m;R:4m")

Першим аргументом передається ім'я фільтра, другим – рядок параметрів. Параметри може бути три:

  • S, який задає сокет, що використовується (може бути local і inet);
  • F, що визначає, як поводитися з листом у разі проблем з milter (F=T означає повертати відправнику тимчасову помилку (temporary fail), F=R – відкинути (reject) з'єднання, порожнє значення F= дає вказівку ігнорувати проблеми з milter та обробляти з'єднання без фільтрації);
  • T задає кілька тайм-аутів (див. таблицю), після закінчення яких фільтр буде визнаний «не відповідає»

Прапори тайм-аутів

У нашому прикладі, якщо clamav-milter не почне приймати повідомлення від Sendmail протягом чотирьох хвилин або не дасть відповіді протягом такого ж часу, повідомлення буде передано на подальшу обробку без фільтрації.

Замість цієї директиви можна підключати фільтри і таким чином:

MAIL_FILTER(`miltergreylist", `S=local:/var/milter-greylist/milter-greylist.sock,F=, T=S:4m;R:4m")dnl

define(`confINPUT_MAIL_FILTERS", `miltergreylist")

Тут процедура підключення фільтра поділена на два етапи – першою директивою ми оголошуємо milter із зазначеними параметрами, другий – реєструємо зазначений milter як фільтр для обробки повідомлень. Якщо за такою схемою потрібно підключити кілька поштових фільтрів, то директива define потрібна тільки одна, в якій через кому перераховуються всі фільтри, що реєструються в потрібному порядку.

Потрібно сказати, що для розробки milter існує чудовий API, що дозволяє досить швидко створювати фільтри рідною для Sendmail мовою C (у списку додаткової літератури ви знайдете посилання на приклад розробки milter для дублювання вихідної пошти на деяку адресу). Існують «прив'язки» до цього API для інших мов програмування, наприклад, для Perl (модуль Sendmail::Milter, у колекції портів – mail/p5-Sendmail-Milter) та Python (інтерфейс Python Milter, у Портах – mail/py-milter ). Прекрасний приклад розробки фільтра на Python розглядався у статті Романа Сузі «Поштовий фільтр, або Milter = Mail + Filter» (№2 за 2003 р., статтю ви можете знайти на сайті журналу в розділі «Статті»).

Електронна пошта широко використовується в різних формах. Звичайно, якщо говорити про ведення групових дискусій, тобто і зручніші засоби: IRC, служби новин (NNTP), веб-форуми, нарешті. Незважаючи на це, списки розсилки електронною поштою досі залишаються досить популярним способом обговорення тих чи інших проблем. Багато відкритих проектів (наприклад, FreeBSD.org, ALT Linux) використовують розсилки для надання технічної підтримки своїм користувачам, для обговорення нових можливостей тестових версій, для повідомлень про виявлені проблеми безпеки…

Однією з найвідоміших систем керування списками розсилки є програма Majordomo. Вона дуже добре інтегрується з серверами Sendmail і має достатній набір функцій для роботи з розсилками.

Установка з колекції портів жодних складнощів не викликає, крім одного невеликого нюансу: починаючи з FreeBSD 5.x Perl перестав бути частиною системи і має встановлюватися з портів, тобто. розміщується у /usr/local/bin. Однак порт Majordomo по-старому хотів бачити /usr/bin/perl. Довелося ставити посилання (хоча можна, звичайно, і Makefile підправити):

# ln /usr/local/bin/perl /usr/bin/perl

Після цього вам потрібно буде вказати, який MTA використовуватиметься (див. рис. 2; наш вибір, думаю, очевидний). Після нетривалої компіляції ми отримаємо трохи нестандартну для FreeBSD схему розміщення файлів: «бінарники» та файли конфігурації будуть розміщені в /usr/local/majordomo. Найбільш важливими є два конфігураційних файли – majordomo.cf, де можна змінити базові налаштування, і aliases.majordomo, що містить налаштований набір псевдонімів, за допомогою яких буде працювати Majordomo.

Принцип взаємодії цього пакету з Sendmail досить простий і ґрунтується на псевдонімах. Наприклад, повідомлення, що надходить на адресу mail.force_extra_parameters =буде перенаправлено програмі /usr/local/majordomo/wrapper та оброблено відповідно до налаштувань списку.

Для того, щоб Majordomo почав працювати, потрібно підключити до Sendmail його файл псевдонімів (хоча можна і просто скопіювати потрібні рядки в /etc/mail/aliases):

define(`ALIAS_FILE", `/etc/mail/aliases, /usr/local/majordomo/aliases.majordomo")

Все – Majordomo готовий до роботи. Надіславши лист із командою «lists» у тілі на свій домен на адресу majordomo, ви отримаєте інформацію про доступні списки розсилки (за замовчуванням там буде test-l та test-l-digest). За образом і подобою ви можете створювати власні списки, для чого потрібно створити порожній файл, відповідний імені розсилки, /usr/local/majordomo/lists, а також aliases.majordomo ввести псевдоніми для самої розсилки, команд, адрес власників і т.д . - Приклад можна подивитися для того ж демо-списку, test-l.

Подальше адміністрування може виконуватись через електронну пошту. Наприклад, щоб поекспериментувати зі списком test-l, насамперед рекомендується змінити пароль адміністратора, надіславши на адресу test-l-request лист у фразі "passwd test-l test mynewpas", де test-l - ім'я списку, для якого змінюється пароль, test – старий пароль (використовується за замовчуванням), mynewpas – новий пароль. У разі удачі ви отримаєте лист із повідомленням «Password changed».

Втім, робота зі списками розсилок – це вже інша тема, і тут не вдаватимемося у подробиці. Тим більше, що до ваших послуг – чудова сторінка довідки, man majordomo.

Підводна частина айсберга

На цьому, мабуть, і завершимо наше знайомство із Sendmail. Природно, навіть у межах такого об'ємного циклу неможливо охопити всі аспекти цього потужного пакета. Тому насамкінець я вирішив навести список посилань (теж далеко не повний), за якими можна отримати додаткову інформацію.

На цьому все! Успіхів!

додаток

Cyrus SASL

Механізм автентифікації SASL (Simple Authentication and Security Layer) використовується для реалізації безпечної автентифікації у зв'язку з іншими Інтернет-протоколами. Крім аутентифікації SASL надає механізми перевірки цілісності даних.

Однією з найпопулярніших реалізацій SASL є бібліотека Cyrus SASL. Будучи розробленою для потреб Cyrus IMAP Server, вона широко використовується і для інших завдань, включаючи автентифікацію SMTP.

Cyrus SASL підтримує широкий набір механізмів автентифікації – CRAM-MD5, DIGEST-MD5, Kerberos, GSSAPI (Специфікація Kerberos 5). При необхідності може бути дозволена підтримка механізмів «плоскої» аутентифікації, таких як LOGIN та PLAIN, проте їх рекомендується використовувати лише під час роботи із захищеним з'єднанням.

Для виконання аутентифікації використовується демон saslauthd, що входить до складу Cyrus SASL. Він уміє проводити перевірку пароля як за власною базою, так і використовуючи механізми PAM, LDAP, системний файл паролів /etc/passwd і т.д.

LDAP

Lightweight Directory Access Protocol – спрощений протокол доступу до каталогів – це протокол, покликаний забезпечити роботу так званої служби каталогів. Служби каталогів використовуються для централізованого зберігання різної інформації, такої як облікові записи користувача, адресні книги, різні настройки.

Спочатку служба каталогів (визначена в протоколі X.500) була орієнтована обслуговування поштових мереж стандарту X.400, розробленого OSI. Для доступу до цієї служби використовувався протокол DAP, який і став основою для розробки більш простого та зручного в роботі LDAP.

Записи, що зберігаються в каталогах LDAP, представлені унікальними іменами (distinguished name) та рядом атрибутів, що визначаються в так званих схемах. Структура записів дозволяє легко організувати записи як дерева.

Основною перевагою LDAP перед "плоськими" файлами або реляційними базами даних є орієнтованість на високу швидкість читання. З урахуванням дуже ефективного кешування використання LDAP, крім централізації інформації, що спрощує її супровід (включаючи резервування), дозволяє також знизити затримки при отриманні інформації, якщо обсяги даних досягають значних величин.

Крім вільної реалізації служби каталогів – OpenLDAP, що широко використовується в системах сімейства UNIX/Linux, існує низка інших (наприклад Active Directory, призначена для управління мережами Windows).

Сам протокол LDAP визначений RFC 1777, RFC 2251 (версія 3). Існує також велика кількість документів, що розширюють і доповнюють.

DBMail

Програма DBMail, розробка якої здійснюється двома датськими фірмами - IC&S і NFG, дозволяє організувати сховище поштових скриньок користувача в базі даних загального призначення. Підтримуються MySQL та PostgreSQL (у версії 2.2 очікується додавання до цього списку та SQLite). Для невеликих поштових серверів, які обслуговують локальну мережу вашого підприємства, додаткова ланка в ланцюзі «поштового обслуговування» користувачів лише зменшить надійність та ускладнить супровід системи, практично нічого не даючи натомість.

Однак на системах з великим числом користувачів або там, де від поштової системи вимагається максимальна гнучкість і можливість реалізувати різні послуги (наприклад, повнотекстовий пошук по всій поштовій скриньці з використанням веб-інтерфейсу) зберігання всіх повідомлень в БД дає майже безмежні можливості. Наприклад, DBMail дуже легко дозволяє встановити максимальний розмір поштової скриньки (у разі використання традиційних сховищ для цього доводиться вдаватися до системного механізму встановлення квот на файлову систему): його потрібно просто вказати в команді створення нового користувача або зміни параметрів його облікового запису:

# dbmail-users -c vasya -m 100M

Будь-яка статистика може бути отримана безпосередньо з бази даних за допомогою звичайного SQL-запиту. Крім того, ви можете використовувати всі переваги реляційних баз, такі як резервування, розміщення на окремому сервері, кластеризація (хоча стосовно СУБД, що підтримуються в даний час, її реалізація вимагає деяких додаткових зусиль; див., наприклад, статтю Андрія Треніна «Створюємо кластер для PostgreSQL » (№1 http://reki.ru/sendmail_setup.html http://unix1.jinr.ru/~lavr/sendmail+sasl2 http://www.milter.org .

  • Роман Сузі, Поштовий фільтр, або Milter = Mail + Filter -.
  • Приклад milter мовою C для дублювання вихідної пошти - http://www.opennet.ru/base/met/mail_copy_milter.txt.html.
  • Інші

    1. Основний сайт проекту DBMail - http://www.dbmail.org.
    2. DBMail Documentation - http://www.helgrim.com/dbmaildocs/installation.html.
    3. SMTP STARTTLS в sendmail/Secure Switch - http://linuxnews.ru/docs/new/starttls.html.
    4. Majordomo і MajorCool HOWTO –



    Нове на сайті

    >

    Найпопулярніше