gwynne Tue, 21 Jul 2009 11:47:57 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=284485
Log: - fix bjori's newlines once and for all, I hope- a bit more reorganization of the code- use easier-to-read-and-understand heredocs- allow a slightly longer subject- give the diff attachment a more useful name- don't use inconsistent tabbing anymore- a couple extra comments Changed paths: U SVNROOT/commit-email.php Modified: SVNROOT/commit-email.php =================================================================== --- SVNROOT/commit-email.php 2009-07-21 11:36:18 UTC (rev 284484) +++ SVNROOT/commit-email.php 2009-07-21 11:47:57 UTC (rev 284485) @@ -146,72 +146,89 @@ ($diffs_length > 8192 ? NULL : $commit_info['diffs'])); // ----------------------------------------------------------------------------------------------------------------------------- -// Build e-mail -$boundary = sha1("{$commit_info['author']}{$commit_info['date']}"); -$messageid = "{$commit_info['author']}-{$commit_info['date']}-{$REV}-" . mt_rand(); -$subject = "svn: " . ($parent_path === '' ? '/' : $parent_path); - -foreach ($commit_info['changed_paths'] as $changed_path) { - $changed_path = trim(strstr($changed_path, ' ')); - if (substr($changed_path, -1) !== '/') { - $subject .= ' ' . substr($changed_path, strlen($parent_path)); - } -} -$subject = substr($subject, 0, 950); // Max SMTP line length = 998. Some slop in this value. - -$fullname = "=?utf-8?q?" . imap_8bit(str_replace(array('?', ' '), array('=3F', '_'), $commit_info['author_name'])) . "?="; - -$msg_headers = "From: {$fullname} <{$commit_info['author']...@php.net>\r\n" . - "To: " . implode(', ', $emails_to) . "\r\n" . - "Message-ID: <svn{$message...@svn.php.net>\r\n" . - "Date: " . date(DATE_RFC822, $commit_info['date']) . "\r\n" . - "Subject: {$subject}\r\n" . - "MIME-Version: 1.0\r\n" . - "Content-Type: multipart/mixed; boundary=\"{$boundary}\"\r\n"; - +// Process bugs $bugs_body = ''; if (isset($bug_list) && count($bug_list) > 0) { - $bugs_body = count($bug_list) > 1 ? "Bugs: " : "Bug: "; + $bugs_body = count($bug_list) > 1 ? "\nBugs: " : "\nBug: "; foreach ($bug_list as $n => $bug) { if (isset($bug['error'])) { $status = '(error getting bug information)'; } else { $status = "({$bug['status']}) {$bug['short_desc']}"; } - $bugs_body .= "{$bug['url']} {$status}\r\n "; + $bugs_body .= "{$bug['url']} {$status}\n "; } } -$msg_body = "--{$boundary}\r\n" . - "Content-Type: text/plain; charset=\"utf-8\"\r\n" . - "Content-Transfer-Encoding: 8bit\r\n" . - "\r\n" . - "{$commit_info['author']}\t\t" . date(DATE_RFC2822, $commit_info['date']) . "\r\n" . - "\r\n" . - "Revision: http://svn.php.net/viewvc?view=revision&revision={$REV}\r\n" . - "\r\n" . - "Log:\r\n" . - "{$commit_info['log_message']}\r\n" . - "{$bugs_body}\r\n" . - "\r\n" . - "Changed paths:\r\n" . - "\t" . implode("\r\n\t", $commit_info['changed_paths']) . "\r\n" . - str_replace("\n", "\r\n", $diffs_string); +// ----------------------------------------------------------------------------------------------------------------------------- +// Process changed paths +$paths_list = $parent_path === '' ? '/' : $parent_path; +foreach ($commit_info['changed_paths'] as $changed_path) { + $changed_path = trim(strstr($changed_path, ' ')); + if (substr($changed_path, -1) !== '/') { + $paths_list .= ' ' . substr($changed_path, strlen($parent_path)); + } +} +// ----------------------------------------------------------------------------------------------------------------------------- +// Build e-mail +$boundary = sha1("{$commit_info['author']}{$commit_info['date']}"); +$messageid = "{$commit_info['author']}-{$commit_info['date']}-{$REV}-" . mt_rand(); +$subject = substr("svn: {$paths_list}", 0, 970); // Max SMTP line length = 998. Some slop in this value. +$email_date = date(DATE_RFC2822, $commit_info['date']); +$fullname = "=?utf-8?q?" . imap_8bit(str_replace(array('?', ' '), array('=3F', '_'), $commit_info['author_name'])) . "?="; +$email_list = implode(', ', $emails_to); +$readable_path_list = " " . implode("\n ", $commit_info['changed_paths']); +$nspaces = str_repeat(" ", max(1, 72 - strlen($commit_info['author']) - strlen($email_date))); + +$msg_body = <<<MIMEBODY +From: {$fullname} <{$commit_info['author']...@php.net> +To: {$email_list} +Message-ID: <svn{$message...@svn.php.net> +Date: {$email_date} +Subject: {$subject} +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="{$boundary}" + +--{$boundary} +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +{$commit_info['author']}{$nspaces}{$email_date} + +Revision: http://svn.php.net/viewvc?view=revision&revision={$REV} + +Log: +{$commit_info['log_message']} +{$bugs_body} +Changed paths: +{$readable_path_list} + +{$diffs_string} +--{$boundary} +MIMEBODY; + if ($diffs_string === NULL) { - $msg_body .= - "--{$boundary}\r\n" . - "Content-Type: text/x-diff; encoding=\"utf-8\"\r\n" . - "Content-Disposition: attachment; filename=\"{$boundary}.txt\"\r\n" . - "Content-Transfer-Encoding: base64\r\n" . - "\r\n" . - wordwrap(base64_encode($commit_info['diffs']), 80, "\r\n", TRUE) . "\r\n"; + $diff_data = wordwrap(base64_encode($commit_info['diffs']), 80, "\n", TRUE); + $msg_body .= <<<MIMEBODY + +Content-Type: text/x-diff; encoding="utf-8" +Content-Disposition: attachment; filename="svn-diffs-{$REV}.txt" +Content-Transfer-Encoding: base64 + +{$diff_data} +--{$boundary} +MIMEBODY; } -$msg_body .= "\r\n--{$boundary}--"; +// The -- at the end finishes off the MIME body. +$msg_body .= "--"; +// Yes, I really DID mean to do two str_replace()s instead of using array() +// parameters. This absolutely ensures that the replacements will be done in the +// correct order. +$msg_body = str_replace(PHP_EOL, "\r\n", $msg_body); +$msg_body = str_replace("\r\n.\r\n", "\r\n..\r\n", $msg_body); -$complete_email = $msg_headers . "\r\n" . str_replace("\r\n.\r\n", "\r\n..\r\n", $msg_body); - // ----------------------------------------------------------------------------------------------------------------------------- // Send e-mail if ($is_DEBUG) { @@ -223,19 +240,23 @@ fail("Couldn't connect to SMTP server {$smtp_server}. Errno: {$errno}.\n"); } -fwrite($socket, - "EHLO localhost\r\n" . - "MAIL FROM:<this-will-bou...@php.net> BODY=8BITMIME\r\n"); -foreach ($emails_to as $send_addr) { - fwrite($socket, "RCPT TO:<{$send_addr}>\r\n"); -} -fwrite($socket, - "DATA\r\n" . - $complete_email . "\r\n" . - ".\r\n" . - "QUIT\r\n"); +$rcpt_commands = "RCPT TO:<" . implode(">\r\nRCPT TO:<", $emails_to) . ">"; +fwrite($socket, <<<SMTP +EHLO localhost\r +MAIL FROM:<this-will-bou...@php.net> BODY=8BITMIME\r +{$rcpt_commands}\r +DATA\r +{$msg_body}\r +.\r +QUIT\r +SMTP + ); + if (!$is_DEBUG) { + // For the record, I don't bother parsing errors here because the local MTA + // pretty much never errors out directly. Instead the errors come from the + // upstream MTAs (such as on lists), which I can't access from here anyway. $discard = stream_get_contents($socket); } fclose($socket);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php