Blame | Last modification | View Log | Download
<?php
/*************************
Coppermine Photo Gallery
************************
Copyright (c) 2003-2005 Coppermine Dev Team
v1.1 originaly written by Gregory DEMAR
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
********************************************
Coppermine version: 1.3.3
$Source: /cvsroot/coppermine/stable/include/mailer.inc.php,v $
$Revision: 1.6 $
$Author: gaugau $
$Date: 2005/04/19 03:17:11 $
**********************************************/
$CONFIG['smtp_host'] = '';
$CONFIG['smtp_username'] = '';
$CONFIG['smtp_password'] = '';
// Custom mail function
function cpg_mail($to, $subject, $msg_body, $type = 'text/plain', $sender_name = '', $sender_email = '')
{
global $CONFIG;
global $lang_charset;
if ($sender_name == '') $sender_name = $CONFIG['gallery_name'];
if ($sender_email == '') $sender_email = $CONFIG['gallery_admin_email'];
$charset = $CONFIG['charset'] == 'language file' ? $lang_charset : $CONFIG['charset'];
$extra_headers = "From: $sender_name <$sender_email>\n" . "MIME-Version: 1.0\n" . "Content-type: $type; charset=" . $charset . "\n" . "Content-transfer-encoding: 8bit\n" . "Date: " . gmdate('D, d M Y H:i:s', time()) . " UT\n" ."X-Priority: 3 (Normal)\n" ."X-MSMail-Priority: Normal\n" . "X-Mailer: Coppermine Photo Gallery\n" ."Importance: Normal";
// Fix any bare linefeeds in the message to make it RFC821 Compliant.
$message = preg_replace("/(?<!\r)\n/si", "\r\n", $msg_body);
if (empty($CONFIG['smtp_host'])) {
return mail($to, $subject, $msg_body, $extra_headers);
} else {
return smtp_mail($to, $subject, $msg_body, $extra_headers);
}
}
/**
* smtp.php
* -------------------
* begin : Wed May 09 2001
* copyright : (C) 2001 The phpBB Group
* email : support@phpbb.com
*
* $Id: mailer.inc.php,v 1.6 2005/04/19 03:17:11 gaugau Exp $
*/
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
// This function has been modified as provided
// by SirSir to allow multiline responses when
// using SMTP Extensions
function server_parse($socket, $response)
{
while (substr($server_response, 3, 1) != ' ') {
if (!($server_response = fgets($socket, 256))) {
cpg_die(ERROR, "Couldn't get mail server response codes", __FILE__, __LINE__);
}
}
if (!(substr($server_response, 0, 3) == $response)) {
cpg_die(ERROR, "Ran into problems sending Mail. Response: $server_response", "", __FILE__, __LINE__);
}
}
/**
* Function: smtpmail
* Description: This is a functional replacement for php's builtin mail
* function, that uses smtp.
* Usage: The usage for this function is identical to that of php's
* built in mail function.
*/
function smtp_mail($mail_to, $subject, $message, $headers = "")
{
// For now I'm using an array based $smtp_vars to hold the smtp server
// info, but it should probably change to $CONFIG...
// then the relevant info would be $CONFIG['smtp_host'] and
// $CONFIG['smtp_port'].
global $CONFIG;
// Fix any bare linefeeds in the message to make it RFC821 Compliant.
$message = preg_replace("/(?<!\r)\n/si", "\r\n", $message);
if ($headers != "") {
if (is_array($headers)) {
if (sizeof($headers) > 1) {
$headers = join("\n", $headers);
} else {
$headers = $headers[0];
}
}
$headers = chop($headers);
// Make sure there are no bare linefeeds in the headers
$headers = preg_replace("/(?<!\r)\n/si", "\r\n", $headers);
// Ok this is rather confusing all things considered,
// but we have to grab bcc and cc headers and treat them differently
// Something we really didn't take into consideration originally
$header_array = explode("\n", $headers);
@reset($header_array);
$headers = "";
while (list(, $header) = each($header_array)) {
if (preg_match("/^cc:/si", $header)) {
$cc = preg_replace("/^cc:(.*)/si", "\\1", $header);
} else if (preg_match("/^bcc:/si", $header)) {
$bcc = preg_replace("/^bcc:(.*)/si", "\\1", $header);
$header = "";
}
$headers .= $header . "\n";
}
$headers = chop($headers);
$cc = explode(",", $cc);
$bcc = explode(",", $bcc);
}
if (trim($mail_to) == "") {
cpg_die(ERROR, "No email address specified", __FILE__, __LINE__);
}
if (trim($subject) == "") {
cpg_die(ERROR, "No email Subject specified", __FILE__, __LINE__);
}
if (trim($message) == "") {
cpg_die(ERROR, "Email message was blank", __FILE__, __LINE__);
}
$mail_to_array = explode(",", $mail_to);
// Ok we have error checked as much as we can to this point let's get on
// it already.
if (!$socket = fsockopen($CONFIG['smtp_host'], 25, $errno, $errstr, 20)) {
cpg_die(ERROR, "Could not connect to smtp host : $errno : $errstr", __FILE__, __LINE__);
}
server_parse($socket, "220");
if (!empty($CONFIG['smtp_username']) && !empty($CONFIG['smtp_password'])) {
// Send the RFC2554 specified EHLO.
// This improved as provided by SirSir to accomodate
// both SMTP AND ESMTP capable servers
fputs($socket, "EHLO " . $CONFIG['smtp_host'] . "\r\n");
server_parse($socket, "250");
fputs($socket, "AUTH LOGIN\r\n");
server_parse($socket, "334");
fputs($socket, base64_encode($CONFIG['smtp_username']) . "\r\n");
server_parse($socket, "334");
fputs($socket, base64_encode($CONFIG['smtp_password']) . "\r\n");
server_parse($socket, "235");
} else {
// Send the RFC821 specified HELO.
fputs($socket, "HELO " . $CONFIG['smtp_host'] . "\r\n");
server_parse($socket, "250");
}
// From this point onward most server response codes should be 250
// Specify who the mail is from....
fputs($socket, "MAIL FROM: <" . $CONFIG['gallery_admin_email'] . ">\r\n");
server_parse($socket, "250");
// Specify each user to send to and build to header.
$to_header = "To: ";
@reset($mail_to_array);
while (list(, $mail_to_address) = each($mail_to_array)) {
// Add an additional bit of error checking to the To field.
$mail_to_address = trim($mail_to_address);
if (preg_match('/[^ ]+\@[^ ]+/', $mail_to_address)) {
fputs($socket, "RCPT TO: <$mail_to_address>\r\n");
server_parse($socket, "250");
}
$to_header .= (($mail_to_address != '') ? ', ' : '') . "<$mail_to_address>";
}
// Ok now do the CC and BCC fields...
@reset($bcc);
while (list(, $bcc_address) = each($bcc)) {
// Add an additional bit of error checking to bcc header...
$bcc_address = trim($bcc_address);
if (preg_match('/[^ ]+\@[^ ]+/', $bcc_address)) {
fputs($socket, "RCPT TO: <$bcc_address>\r\n");
server_parse($socket, "250");
}
}
@reset($cc);
while (list(, $cc_address) = each($cc)) {
// Add an additional bit of error checking to cc header
$cc_address = trim($cc_address);
if (preg_match('/[^ ]+\@[^ ]+/', $cc_address)) {
fputs($socket, "RCPT TO: <$cc_address>\r\n");
server_parse($socket, "250");
}
}
// Ok now we tell the server we are ready to start sending data
fputs($socket, "DATA\r\n");
// This is the last response code we look for until the end of the message.
server_parse($socket, "354");
// Send the Subject Line...
fputs($socket, "Subject: $subject\r\n");
// Now the To Header.
fputs($socket, "$to_header\r\n");
// Now any custom headers....
fputs($socket, "$headers\r\n\r\n");
// Ok now we are ready for the message...
fputs($socket, "$message\r\n");
// Ok the all the ingredients are mixed in let's cook this puppy...
fputs($socket, ".\r\n");
server_parse($socket, "250");
// Now tell the server we are done and close the socket...
fputs($socket, "QUIT\r\n");
fclose($socket);
return true;
}
?>