Недавно я получил эту работу, поэтому, хотя я бы разделил:
Отправка всей исходящей почты в Отправленные папки с postfix и cyrus imap.
Сделайте postfix отправьте копии экземпляров всех исходящих писем на специальную "отправленную" почтовая учетная запись. Используйте сито на этой специальной учетной записи, чтобы перенаправить все электронные письма в папку "Отправленные", связанные с учетной записью.
Создайте учетную запись пользователя электронной почты для отправленных
Самый простой способ сделать это - создать новую учетную запись unix для отправленных, установка оболочки в /bin/false, чтобы никто не мог регистрироваться в:
Host$ sudo useradd sent host$ sudo chsh -s /bin/false sent
Настроить imap для отправленного пользователя
Используя cyradm, мы создаем новый почтовый ящик (т.е. пользователь) и даем этому пользователю добавить доступ ко всем нашим папкам "Отправленные" imap:
Host$ $ cyradm -user cyrus localhost
Password:
Создайте сито script для отправленной учетной записи
Этот script перенаправляет всю входящую электронную почту на отправленную учетную запись, на Отправлена папка в папке "Входящие" отправителей.
Мой script называется sent.sieve и выглядит примерно так:
# Sieve script for sent. If outgoing email is bcc"ed to this account, # this sieve script will redirect it to the sender Sent folder require ["fileinto"]; if address:is:localpart "From" "userx" { fileinto "user.userx.Sent"; } elsif address:is:localpart "From" "usery" { fileinto "user.usery.Sent"; } elsif address:is:localpart "From" "userz" { fileinto "user.userz.Sent"; }
Вам нужно будет ввести запись для каждого из ваших пользователей (userx, usery, userz в примере выше). Я не смог найти лучший способ сделать это. Предложения приветствуются [email protected]
Установите сито script следующим образом:
Host$ sieveshell localhost -user=sent -a=cyrus
Password:
Настроить сопоставление bcc для postfix
В постфиксном каталоге (/etc/postfix на debian) создайте файл с именем bcc_map выглядит следующим образом:
# copy all locally sent mail to the sent account @yourdomain.com [email protected]
Скомпилируйте это в хэш файл постфикса, используя:
Host$ sudo postmap bcc_map
Добавьте следующую конфигурацию в файл конфигурации postfix main.cf:
Sender_bcc_maps = hash:/etc/postfix/bcc_map
И сделайте postfix перезагрузите его конфигурацию:
host $sudo/etc/init.d/postfix reload
Тестирование и отладка
Отправьте письмо и проверьте, что оно скопировано в папку Sent.
В случае возникновения проблем вы должны проверить журналы cyrus и postfix (все регистрируются на /var/log/syslog на моем хосте debian). Опечатки и неправильные разрешения доступа обычно приводят к тому, что некоторые подсказки отправляются на журналы.
Одной из самых востребованных функций на сайте является форма заявки или заказа, данные из которой отправляются на почту владельцу сайта. Как правило такие формы являются простыми и состоят из двух трех полей для ввода данных. Как же создать такую форму заказа? Здесь потребуется использование языка разметки HTML и языка программирования PHP.
Язык разметки HTML сам по себе несложен, нужно всего лишь разобраться в том как и где ставить те или иные теги. С языком программирования PHP все немного сложнее.
Для программиста создать такую форму не составит труда, а вот HTML верстальщику может показаться сложным некоторые действия.
Первая строка будет следующей
Теперь соберем все вместе.
Теперь сделаем так, чтобы поля в форме стали обязательными для заполнения. Имеем следующий код:
Это будет файл с именем send.php
В файле на первом этапе нужно принять данные из пост массива. Для этого создаем две переменные:
$fio = $_POST["fio"];
$email = $_POST["email"];
Перед названиями переменных в php ставиться знак $, в конце каждой строки ставиться точка с запятой. $_POST это массив в который передаются данный из формы. В форме html при этом указан метод отправки method="post". Так, приняты две переменные из формы html. Для целей защиты своего сайта нужно провести эти переменные через несколько фильтров - функций php.
Первая функция преобразует все символы, которые пользователь попытается добавить в форму:
При этом новые переменные в php не создаются, а используются уже имеющиеся. Что сделает фильтр, он преобразует символ "<" в "<". Также он поступить с другими символами, встречающимися в html коде.
Вторая функция декодирует url, если пользователь попытается его добавить в форму.
$fio = urldecode($fio);
$email = urldecode($email);
Третей функцией мы удалим пробелы с начала и конца строки, если таковые имеются:
$fio = trim($fio);
$email = trim($email);
Существуют и другие функции, позволяющие отфильтровать переменные php. Их использование зависит от того, насколько вы опасаетесь того, что злоумышленник попытается добавить программный код в данную форму отправки данных на почту html.
Проверка данных, передаваемых от HTML формы в файл PHP
Для того, чотбы проверить, работает ли этот код, передаются ли данные можно просто их вывести на экран при помощи функции echo:
echo $fio;
echo "
";
echo $fio;
Вторая строка здесь нужна для того, чтобы разделить вывод переменных php на разные строки.
Для отправки данных на почту нужно воспользоваться функцией mail в PHP.
mail("на какой адрес отправить", "тема письма", "Сообщение (тело письма)","From: с какого email отправляется письмо \r\n");
Например, нужно отправить данные на email владельца сайта или менеджера [email protected].
Тема письма должна быть понятной, а сообщение письма должно содержать то, что указал пользователь в HTML форме.
mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n");
Необходимо добавить условие, которе проверит отправилась ли форма при помощи PHP на указанные адрес электронной почты.
if (mail("[email protected]", "Заказ с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))
{
echo "сообщение успешно отправлено";
} else {
}
Таким образом программный код файла send.php, который отправит данные HTML формы на почту будет выглядеть следующим образом:
$fio = $_POST["fio"];
$email = $_POST["email"];
$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);
$fio = urldecode($fio);
$email = urldecode($email);
$fio = trim($fio);
$email = trim($email);
//echo $fio;
//echo "
";
//echo $email;
if (mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))
{ echo "сообщение успешно отправлено";
} else {
echo "при отправке сообщения возникли ошибки";
}?>
Три строки для проверки, передаются ли данные в файл закомментированы. При необходимости их можно удалить, так как они нужны были только для отладки.
В комментариях к этой статье многие задают вопрос о том, как сделать, чтобы и HTML форма и PHP код отправки данных на почту находились в одном файле, а не двух.
Для реализации такой работы нужно поместить HTML код формы в файл send.php и добавить условие, которое будет проверять наличие переменных в массиве POST (этот массив передается из формы). То есть, если переменные в массиве не существуют, то нужно показать пользователю форму. Иначе нужно принять данные из массива и отправить их адресату.
Давайте посмотрим как изменить PHP код в файле send.php:
Существование переменной в POST массиве мы проверяем PHP функцией isset(). Восклицательный знак перед этой функцией в условии означает отрицание. То есть, если переменной не существует, то нужно показать нашу форму. Если бы я не поставил восклицательный знак, то условие дословно означало бы - "если существует, то показать форму". А это неправильно в нашем случае. Естественно, что вы можете переименовать его в index.php. Если будуту переименовывать файл, то не забудьте переименовать название файла и в строке