mod_fcgid, не используя несколько php интерпретаторов для параллельных запросов

Это почтовое Учебное руководство по Средству передачи SiteGround cPanel должно объяснить все, что необходимо разбудить набор средства передачи.

Редактирование 10/20: Запись сценария удара для выполнения этой задачи казалась, что это будет забава (сначала, так или иначе), но отсутствие MIME многослойная поддержка в formail делает это ужасным.

Я мог бы дать Сценарию PHP попытку позднее, но предложение для использования пакетного решения имеет больше смысла, чем попытка прокрутить собственное.

Редактирование 10/21: Я взял этого как своего рода проблема, таким образом, здесь (без любой гарантии кода поддержки/работы) то, что я придумал - я все еще рекомендую использовать существующее решение по использованию этого сценария, но я не мог сопротивляться сценариям подтверждения концепции.

Я получил его работающий с cPanel установкой, но я не побеспокоил поддержку w/MIME так вложения, и электронная почта HTML будет разделена, и только простой текст будет поставлен.

  1. Сохраните сценарий (ниже) в файл и обновление для соответствия cPanel конфигурации
  2. Загрузите файл на /home/example/mail-everyone.php (или подобный), и следуют руководству по установке канала к сценарию (Адрес для Передачи: "все", Канал к программе: "почта-everyone.php")
  3. Отправьте несколько тестовых сообщений - необходимо видеть хит сообщения Ваш 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);
?>

0
задан 22 August 2012 в 16:38
1 ответ

OK , config was OK , it was just firefox that queued the requests :D нет проблем с использованием wget и safari

переключено на mod_fastcgi Apache mod_fastcgi

0
ответ дан 24 November 2019 в 11:30

Теги

Похожие вопросы