. */ /** * Send an email using a PHP template file. * * This function causes the PHP engine to parse the PHP file specified by #_filename, with the variables passed in the * variable #_v, which should output an [RFC-822](https://tools.ietf.org/html/rfc822) (and its * [successors](https://en.wikipedia.org/wiki/Email#Message_format)) style message. * The function then extracts the headers from the message, grabs the "To" and "Subject" lines from it, and then passes * the "To:", "Subject:", message body, and remaining headers, to the PHP * [mail()](https://secure.php.net/manual/en/function.mail.php) function. * * As an example, consider template file "thanks.php" * * To: <> * Subject: Thank you for your request * Content-Type: text/plain; charset=utf-8 * * Dear , * * Thankyou for your request, one of our staff will contact you . * * * Your request is important to us. * * * Which could then be called with: * * mailTemplate("thanks.php", [ * 'email' => "dave@example.com", * 'name' => "Dave", * 'when' => "tomorrow", * 'important' => FALSE, * ]}; * * Note that, as of this implementation, #_filename is read using * [include](https://secure.php.net/manual/en/function.include.php), so it uses the file-finding rules defined therein. * * Also, it is worth remembering that PHP eats newlines directly following a PHP close tag. Therefore, if you have: * * To: * Subject: ... * * Then the newline following the close tag will be eaten by the PHP parser, and you'll end up with: * * To: example@example.comSubject: ... * * To work around this, you need to either make the closing tag not the last thing on the line (e.g. by adding a * trailing space to the line), or forcibly output a newline yourself from within the PHP, e.g.: * * To: * Subject: ... * * @param string $_filename Filename of PHP template file to send. * @param mixed $_v Associated array of variables to be made available to the mail template. * * @return bool TRUE on success, FALSE on failure. */ function mailTemplate($_filename, $_v) { ob_start(); extract($_v, EXTR_OVERWRITE); if (!include($_filename)) { /* Don't need to raise a warning here, include will do that for us. */ ob_end_clean(); return FALSE; } $email = explode("\n", ob_get_clean()); $to = ""; $subject = ""; $headers = []; for ($i = 0; $i < count($email); ++$i) { $line = rtrim($email[$i], "\r"); if ($line == "") { ++$i; break; } $matches = []; if (preg_match("/^([^:]+): (.*)/", $line, $matches) != 1) { error_log("mailTemplate: " . $_filename . ":" . $i . ": Invalid header: ". $line); return FALSE; } if ($matches[1] == "To") { $to = $matches[2]; } else if ($matches[1] == "Subject") { $subject = $matches[2]; } else { $headers[] = $line; } } $missing = []; if ($to == "") $missing[] = "To:"; if ($subject == "") $missing[] = "Subject:"; if (count($missing)) { error_log("mailTemplate: " . $_filename . ":" . $i . ": Missing header(s): " . implode(", ", $missing)); return FALSE; } if ($i >= count($email)) { error_log("mailTemplate: " . $_filename . ":" . $i . ": Missing email body"); return FALSE; } if (isset($GLOBALS['_DEBUG']) && $GLOBALS['_DEBUG']) { echo "To: {$to}\r\n"; echo "Subject: {$subject}\r\n"; if (count($headers)) { echo implode("\r\n", $headers)."\r\n"; } echo "\r\n"; echo implode("\n", array_slice($email, $i)); return TRUE; } return mail($to, $subject, implode("\n", array_slice($email, $i)), implode("\r\n", $headers)); } ?>