Это почтовое Учебное руководство по Средству передачи SiteGround cPanel должно объяснить все, что необходимо разбудить набор средства передачи.
Редактирование 10/20: Запись сценария удара для выполнения этой задачи казалась, что это будет забава (сначала, так или иначе), но отсутствие MIME многослойная поддержка в formail
делает это ужасным.
Я мог бы дать Сценарию PHP попытку позднее, но предложение для использования пакетного решения имеет больше смысла, чем попытка прокрутить собственное.
Редактирование 10/21: Я взял этого как своего рода проблема, таким образом, здесь (без любой гарантии кода поддержки/работы) то, что я придумал - я все еще рекомендую использовать существующее решение по использованию этого сценария, но я не мог сопротивляться сценариям подтверждения концепции.
Я получил его работающий с cPanel установкой, но я не побеспокоил поддержку w/MIME так вложения, и электронная почта HTML будет разделена, и только простой текст будет поставлен.
/home/example/mail-everyone.php
(или подобный), и следуют руководству по установке канала к сценарию (Адрес для Передачи: "все", Канал к программе: "почта-everyone.php")NOTIFY_EMAIL
учетная запись с электронным письмом отладки (пока FLAG_DEBUG
имеет значение false), и все другие cPanel-поддерживающие адреса электронной почты должны видеть простой текст копии BCC.--
constant('EML_SENDER'),
'Reply-To' => constant('NOTIFY_EMAIL'),
'X-Mailer' => constant('EML_XMAILER')
);
$message = implode( constant('END_LINE'), $debugging );
$flag_sent = send_mail( constant('NOTIFY_EMAIL'), __FILE__.': Debug Notice', $message, $outgoing_headers );
}
return;
}
function scan_headers( $search, $target ) {
$matches = array();
$pattern = '/^' . strtolower($target) . ':/i';
if ( preg_match( $pattern, $search ) ) {
return substr( $search, strlen($target . ': ') );
}
}
function send_mail( $to, $subject, $message, $headers_array = false ) {
if ( is_array($headers_array) ) {
$header_string = '';
foreach ( $headers_array as $key => $value ) {
$header_string .= $key.': '.$value . constant('END_LINE');
}
}
return ( @mail( $to, $subject, $message, $header_string ) );
}
if (
!defined('CPANEL_DOMAIN') ||
!defined('CPANEL_PATH') ||
!defined('CPANEL_PATH_USERS') ||
!defined('EML_SENDER') ||
!defined('EML_XMAILER') ||
!defined('FLAG_DEBUG') ||
!defined('FLAG_DEBUG_RAW') ||
!defined('NOTIFY_EMAIL') ||
!defined('END_LINE') ||
constant('NOTIFY_EMAIL') == constant('EML_SENDER')
) {
exit(1);
}
$debugging = array();
$flag_headers = 1;
$flag_plaintext = 1;
$flag_multi_plaintext = 0;
$flag_multi_plaintext_done = 0;
$headers_incoming = array(
'To' => '',
'From' => '',
'Reply-To' => '',
'Subject' => '',
'Cc' => ''
);
$mime_boundary = '';
$plaintext = '';
debugging('searching for users');
$users = array();
$quota_users = @file( constant('CPANEL_PATH_USERS') );
if ( $quota_users && is_array($quota_users) && count($quota_users) ) {
foreach ( $quota_users as $quota_user ) {
$user = strtok($quota_user,':') . '@' . constant('CPANEL_DOMAIN');
debugging('searching for users: +user "'.$user.'"');
$users[] = $user;
}
} else {
debugging('searching for users: ERROR - check CPANEL_PATH_USERS "'.constant('CPANEL_PATH_USERS').'"', true);
exit(1);
}
debugging('searching for users done: ' . count($users) . ' users');
debugging('header processing begins');
$line_count = 0;
$line_last = '';
while( $line = fgets(STDIN) ) {
if ( $line_count >= 5000 ) break;
$line = trim($line);
if ( $flag_headers ) {
foreach ( $headers_incoming as $target => $set ) {
if ( !$set ) {
$found = scan_headers( $line, $target );
if ( $found ) {
$headers_incoming[$target] = $found;
debugging('headers: set '.$target.': "'.$found.'"');
}
}
}
if ( strpos($line, 'boundary=') ) {
$flag_plaintext = false;
debugging('headers: multipart message detected');
}
if ( strlen($line) <= 3 ) {
$flag_headers = false;
debugging('header processing ends');
}
} else if ( $flag_plaintext ) {
// (default) plain text message
// everything after headers will be relayed
debugging('plaintext: +line "'.$line.'"');
$plaintext .= $line . constant('END_LINE');
} else if ( $flag_multi_plaintext ) {
if ( preg_match( '/^' . $mime_boundary . '/', $line ) ) {
debugging('multipart/text: reached boundary "'.$mime_boundary.'"');
$flag_multi_plaintext = false;
$flag_multi_plaintext_done = true;
} else {
debugging('multipart/text: +line "'.$line.'"');
$plaintext .= $line . constant('END_LINE');
}
} else if ( !$flag_multi_plaintext_done ) {
if ( preg_match( '/^Content-Type: text\/plain/', $line ) ) {
$mime_boundary = $line_last;
debugging('multipart/text: matched "Content-Type: text/plain" header');
$flag_multi_plaintext = true;
}
}
if ( constant('FLAG_DEBUG_RAW') ) debugging( 'raw message: +line "' . $line . '"' );
$line_last = $line;
$line_count++;
}
if (
$headers_incoming['To'] != constant('EML_SENDER') ||
$headers_incoming['From'] == constant('EML_SENDER')
) {
debugging( 'skipped resending to avoid loop - To: "'.$headers_incoming['To'].'" / From: "'.$headers_incoming['From'].'"', constant('FLAG_DEBUG') );
exit(0);
}
debugging('resending begins');
if ( strlen($plaintext) ) {
$reply_recipient = ($headers_incoming['Reply-To']) ? $headers_incoming['Reply-To'] : $headers_incoming['From'];
$subject = $headers_incoming['Subject'];
$subject = (defined('EML_SUBJECT_PREPEND')) ? constant('EML_SUBJECT_PREPEND') . $subject : $subject;
$subject = (defined('EML_SUBJECT_APPEND')) ? $subject . constant('EML_SUBJECT_APPEND') : $subject;
$users_bcc = '';
foreach ( $users as $user_email ) {
debugging('resending: +email bcc: "'.$user_email.'"');
$users_bcc .= ($users_bcc) ? ',' . $user_email : $user_email;
}
$outgoing_headers = array(
'From' => constant('EML_SENDER'),
'Cc' => constant('EML_SENDER'),
'Bcc' => $users_bcc,
'Reply-To' => $reply_recipient,
'X-Mailer' => constant('EML_XMAILER')
);
if ( send_mail( constant('NOTIFY_EMAIL'), $subject, $plaintext, $outgoing_headers ) ) {
debugging( 'resending ends - success', constant('FLAG_DEBUG') );
} else {
debugging('resending: failed sending to "'.$users_bcc.'"', constant('FLAG_DEBUG') );
exit(1);
}
} else {
debugging( 'error: nothing to relay', true );
exit(1);
}
exit(0);
?>
OK , config was OK , it was just firefox that queued the requests :D нет проблем с использованием wget и safari
переключено на mod_fastcgi Apache mod_fastcgi