Функция cot_mail в Cotonti
Функция cot_mail используется для отправки электронных писем в системе. Она может работать как с использованием стандартной PHP-функции mail(), так и с кастомизированными методами доставки, если они определены в cot_mail_custom().
Описание функции cot_mail
Функция cot_mail используется для отправки электронных писем в системе. Она может работать как с использованием стандартной PHP-функции mail(), так и с кастомизированными методами доставки, если они определены в cot_mail_custom(). Эта функция поддерживает различные параметры для отправки письма, включая несколько получателей, темы, текста сообщения и дополнительных заголовков.
Код функции
/**
* Sends mail with standard PHP mail().
* If cot_mail_custom() function exists, it will be called instead of the PHP
* function. This way custom mail delivery methods, such as SMTP, are
* supported.
*
* @param array{
* to: array|string,
* from?: array|string,
* cc?: array|string,
* bcc?: array|string
* }|string $toOrParams
* if string - recipient email:
* [email protected]
* [email protected], [email protected]
* User <[email protected]>
* User <[email protected]>, Another User <[email protected]>
* [
* 'to' => [['[email protected]', 'User'], '[email protected]', 'User3 <[email protected]>'],
* 'from' => ['[email protected]', 'SiteTitle'] // (optional) Default value will be used if absent
* 'cc' => [['[email protected]', 'User4'], '[email protected]', 'User6 <[email protected]>'], // (optional)
* Add more recipients
* 'bcc' => [['[email protected]', 'User7'], '[email protected]', 'User9 <[email protected]>'], // (optional)
* Add hidden recipients
* ]
*
* @param string $subject Subject
* @param string $body Message body
* @param string|array $additionalHeaders Additional Message headers
* @param bool $customTemplate Use custom template
* @param string $additionalParameters Additional parameters passed to sendmail
* @return bool
*
* @see https://www.php.net/manual/en/function.mail.php
* @see http://www.faqs.org/rfcs/rfc2822.html
*/
function cot_mail(
$toOrParams,
$subject,
$body,
$additionalHeaders = '',
$customTemplate = false,
$additionalParameters = '',
$html = false
) {
global $cfg, $cot_mail_senders;
if (function_exists('cot_mail_custom')) {
return cot_mail_custom(
$toOrParams,
$subject,
$body,
$additionalHeaders,
$customTemplate,
$additionalParameters,
$html
);
}
$ret = true;
if (is_array($cot_mail_senders) && count($cot_mail_senders) > 0) {
foreach ($cot_mail_senders as $func) {
$ret &= $func($toOrParams, $subject, $body, $additionalHeaders, $additionalParameters, $html);
}
return $ret;
}
$to = $from = $fromName = $cc = $bcc = null;
if (empty($toOrParams)) {
return false;
}
if (is_string($toOrParams)) {
$to = $toOrParams;
} else {
if (empty($toOrParams['to'])) {
$toOrParams = ['to' => $toOrParams];
}
$to = cot_mailPrepareAddress($toOrParams['to']);
}
if (!empty($toOrParams['from'])) {
if (is_string($toOrParams['from'])) {
$from = $toOrParams['from'];
} elseif (is_array($toOrParams['from'])) {
$from = $toOrParams['from'][0];
$fromName = $toOrParams['from'][1];
}
}
if (!empty($toOrParams['cc'])) {
$cc = cot_mailPrepareAddress($toOrParams['cc']);
}
if (!empty($toOrParams['bcc'])) {
$bcc = cot_mailPrepareAddress($toOrParams['cc']);
}
if (isset(Cot::$cfg['email_from_address']) && !empty(Cot::$cfg['email_from_address'])) {
$fromHeaderEmail = Cot::$cfg['email_from_address'];
} else {
// If admin email is on the same domain as site
$tmp = explode('@', Cot::$cfg['adminemail']);
if (!empty($tmp[1]) && $tmp[1] == Cot::$sys['domain']) {
$fromHeaderEmail = Cot::$cfg['adminemail'];
} else {
$fromHeaderEmail = 'mail_sender@' . Cot::$sys['domain'];
}
}
$fromHeaderName = !empty($fromName) ? $fromName : Cot::$cfg['maintitle'];
$fromHeaderName = mb_encode_mimeheader($fromHeaderName, 'UTF-8', 'B', "\n");
if (empty($from)) {
$from = Cot::$cfg['adminemail'];
}
$headers = 'From: ' . $fromHeaderName . ' <' . $fromHeaderEmail . ">\r\n";
if (!empty($from)) {
if (!empty($fromName)) {
$fromName = mb_encode_mimeheader($fromName, 'UTF-8', 'B', "\n");
$headers .= 'Reply-To: ' . $fromName . ' <' . $from . ">\r\n";
} else {
$headers .= 'Reply-To: ' . $from . "\r\n";
}
}
if (!empty($cc)) {
$headers .= 'Cc: ' . $cc . "\r\n";
}
if (!empty($bcc)) {
$headers .= 'Bcc: ' . $bcc . "\r\n";
}
$headers .= 'Message-ID: ' . md5(uniqid(microtime())) . '@' . $_SERVER['SERVER_NAME'] . "\r\n";
$type_body = $html ? 'html' : 'plain';
$headers .= 'Content-Type: text/' . $type_body . "; charset=UTF-8\r\n";
$headers .= "Content-Transfer-Encoding: base64\r\n";
if (!empty($additionalHeaders)) {
if (is_array($additionalHeaders)) {
foreach ($additionalHeaders as $key => $header) {
$headers .= $key . ': ' . $header . "\r\n";
}
} else {
$headers .= $additionalHeaders . "\r\n";
}
}
$headers .= 'X-Mailer: Cotonti v.' . Cot::$cfg['version'];
if (!$customTemplate) {
$body_params = array(
'SITE_TITLE' => $cfg['maintitle'],
'SITE_URL' => $cfg['mainurl'],
'SITE_DESCRIPTION' => $cfg['subtitle'],
'ADMIN_EMAIL' => $cfg['adminemail'],
'MAIL_SUBJECT' => $subject,
'MAIL_BODY' => $body
);
$subject_params = array(
'SITE_TITLE' => Cot::$cfg['maintitle'],
'SITE_DESCRIPTION' => Cot::$cfg['subtitle'],
'MAIL_SUBJECT' => $subject
);
$subjectPrepared = cot_title(Cot::$cfg['subject_mail'], $subject_params, false);
$bodyMail = Cot::$cfg['body_mail'];
if ($html) {
// Normalise to \n
$bodyMail = str_replace(["\r\n", "\r"], "\n", $bodyMail);
$bodyMail = str_replace("\n", "<br />\n", $bodyMail);
}
$bodyPrepared = cot_title($bodyMail, $body_params, false);
} else {
$subjectPrepared = $subject;
$bodyPrepared = $body;
}
// Message body line should be separated with a CRLF (\r\n). Lines should not be larger than 70 characters.
// (RFC 2822) http://www.faqs.org/rfcs/rfc2822.html
// Normalise to \n
$bodyPrepared = str_replace(["\r\n", "\r"], "\n", $bodyPrepared);
// Now convert LE as needed
$bodyPrepared = str_replace("\n", "\r\n", $bodyPrepared);
//$bodyPrepared = wordwrap($bodyPrepared, 70, "\r\n");
$bodyPrepared = base64_encode($bodyPrepared);
$subjectPrepared = mb_encode_mimeheader($subjectPrepared, 'UTF-8', 'B', "\n");
if (ini_get('safe_mode')) {
mail($to, $subjectPrepared, $bodyPrepared, $headers);
} else {
if (empty($additionalParameters)) {
$additionalParameters = '';
}
mail($to, $subjectPrepared, $bodyPrepared, $headers, $additionalParameters);
}
if (function_exists('cot_stat_inc')) {
cot_stat_inc('totalmailsent');
}
/* === Hook === */
foreach (cot_getextplugins('mail.send.done') as $pl) {
include $pl;
}
/* ===== */
return true;
}
Параметры функции cot_mail:
1. $toOrParams (array|string):
Если строка, то это адрес получателя (например, "[email protected]").
Если массив, то он может содержать:
to — список получателей (обязательный параметр).
from — адрес отправителя (необязательно).
cc — список получателей для копии (необязательно).
bcc — скрытые получатели (необязательно).
Пример:
$toOrParams = [
'to' => ['[email protected]', '[email protected]'],
'from' => ['[email protected]', 'Admin'],
'cc' => ['[email protected]'],
'bcc' => ['[email protected]']
];
2. $subject (string):
Тема письма.
3. $body (string):
Текст сообщения.
4. $additionalHeaders (string|array):
Дополнительные заголовки для сообщения. Может быть строкой или массивом заголовков.
5. $customTemplate (bool):
Если true, то используется пользовательский шаблон для письма (по умолчанию используется стандартный шаблон).
6. $additionalParameters (string):
Дополнительные параметры для функции отправки почты, например, для sendmail.
7. $html (bool):
Если true, то письмо будет отправлено как HTML.
Логика работы функции:
Проверка функции cot_mail_custom:
Если функция cot_mail_custom() существует, она будет вызвана вместо стандартной функции PHP mail(). Это позволяет использовать кастомные методы доставки почты (например, SMTP).
Подготовка получателей:
В случае, если параметры $toOrParams являются строкой, она интерпретируется как список получателей.
В случае массива to, cc, и bcc может быть передано несколько получателей в виде массива строк.
Подготовка заголовков:
Заголовки для письма формируются с учетом отправителя, получателей (Cc, Bcc) и других настроек.
Шаблоны письма:
Если параметр $customTemplate равен false, используется стандартный шаблон с данными о сайте и письме. В противном случае, используется тело и тема письма, переданные в функцию.
Отправка письма:
Письмо отправляется с помощью стандартной PHP-функции mail(). Заголовки и тело письма кодируются в соответствии с RFC 2822.
Плагин-система:
После отправки письма вызываются плагины (если они есть) через систему хуков, что позволяет расширить функциональность.
Пример использования функции cot_mail :
$to = [
'to' => ['[email protected]', '[email protected]'],
'from' => ['[email protected]', 'Admin'],
'cc' => ['[email protected]'],
'bcc' => ['[email protected]']
];
$subject = "Test Email";
$body = "This is a test email message.";
cot_mail($to, $subject, $body);
Примечания:
Многофункциональность: Функция поддерживает отправку писем нескольким получателям, добавление копий и скрытых копий, а также работу с кастомизированными методами доставки.
Безопасность и проверка: Перед отправкой письма проверяется существование получателей, а также настраивается правильная кодировка и разделители в теле письма.
Функция cot_mail является важной частью системы уведомлений и общения с пользователями в системе Cotonti.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 21.01.2025 10:07
- Последнее обновление: 21.01.2025 10:17