jandrews3 Posted August 9, 2008 Share Posted August 9, 2008 I've got a serious problem trying to use the mail() function. The new VPS server I'm using requires authentication. This nullifies the mail() function's usefulness, I'm told. The company tells me that they cannot disable the authentication requirement for my account, and suggested the following solution, found at http://email.about.com/od/emailprogrammingtips/qt/et073006.htm: <?php require_once "Mail.php"; $from = "Sandra Sender <[email protected]>"; $to = "Ramona Recipient <[email protected]>"; $subject = "Hi!"; $body = "Hi,\n\nHow are you?"; $host = "ssl://mail.example.com"; $port = "465"; $username = "smtp_username"; $password = "smtp_password"; $headers = array ('From' => $from, 'To' => $to, 'Subject' => $subject); $smtp = Mail::factory('smtp', array ('host' => $host, 'port' => $port, 'auth' => true, 'username' => $username, 'password' => $password)); $mail = $smtp->send($to, $headers, $body); if (PEAR::isError($mail)) { echo("<p>" . $mail->getMessage() . "</p>"); } else { echo("<p>Message successfully sent!</p>"); } ?> I'm really having a hard time understanding this script and making it work. Frankly, I'd rather just disable authentication, but that is apparently not an option. SO, HERE'S WHERE I'M AT: The solution script they suggested begins with a require_once"Mail.php" command, BUT WHAT IS THIS FILE? Where do they say what's in it? How can I require a file that I don't have. As usual, I'm sure the solution is easy for others to understand, but my limited experience with this makes it VERY VERY difficult. I NEED HELP PLEEEEEEASE! Link to comment https://forums.phpfreaks.com/topic/118931-php-mail-serious-problem/ Share on other sites More sharing options...
lynxus Posted August 9, 2008 Share Posted August 9, 2008 That script is using SSL , if its just normal username and password auth then use: Looks like you need to install the pear mail package: http://pear.php.net/package/Mail Also see : http://email.about.com/od/emailprogrammingtips/qt/et073006.htm Mail.php is probably a file in the Pear package. The $from and $to vars i suppose you can change on the fly using $_POST. Ie: $from = $_POST["from"]; <?php require_once "Mail.php"; $from = "Sandra Sender <[email protected]>"; $to = "Ramona Recipient <[email protected]>"; $subject = "Hi!"; $body = "Hi,\n\nHow are you?"; $host = "mail.example.com"; $username = "smtp_username"; $password = "smtp_password"; $headers = array ('From' => $from, 'To' => $to, 'Subject' => $subject); $smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password)); $mail = $smtp->send($to, $headers, $body); if (PEAR::isError($mail)) { echo("<p>" . $mail->getMessage() . "</p>"); } else { echo("<p>Message successfully sent!</p>"); } ?> Mail.php ( from the pear package ) <?php // // +----------------------------------------------------------------------+ // | PHP Version 4 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997-2003 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.02 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available at through the world-wide-web at | // | http://www.php.net/license/2_02.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | [email protected] so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Author: Chuck Hagenbuch <[email protected]> | // +----------------------------------------------------------------------+ // // $Id: Mail.php,v 1.20 2007/10/06 17:00:00 chagenbu Exp $ require_once 'PEAR.php'; /** * PEAR's Mail:: interface. Defines the interface for implementing * mailers under the PEAR hierarchy, and provides supporting functions * useful in multiple mailer backends. * * @access public * @version $Revision: 1.20 $ * @package Mail */ class Mail { /** * Line terminator used for separating header lines. * @var string */ var $sep = "\r\n"; /** * Provides an interface for generating Mail:: objects of various * types * * @param string $driver The kind of Mail:: object to instantiate. * @param array $params The parameters to pass to the Mail:: object. * @return object Mail a instance of the driver class or if fails a PEAR Error * @access public */ function &factory($driver, $params = array()) { $driver = strtolower($driver); @include_once 'Mail/' . $driver . '.php'; $class = 'Mail_' . $driver; if (class_exists($class)) { $mailer = new $class($params); return $mailer; } else { return PEAR::raiseError('Unable to find class for driver ' . $driver); } } /** * Implements Mail::send() function using php's built-in mail() * command. * * @param mixed $recipients Either a comma-seperated list of recipients * (RFC822 compliant), or an array of recipients, * each RFC822 valid. This may contain recipients not * specified in the headers, for Bcc:, resending * messages, etc. * * @param array $headers The array of headers to send with the mail, in an * associative array, where the array key is the * header name (ie, 'Subject'), and the array value * is the header value (ie, 'test'). The header * produced from those values would be 'Subject: * test'. * * @param string $body The full text of the message body, including any * Mime parts, etc. * * @return mixed Returns true on success, or a PEAR_Error * containing a descriptive error message on * failure. * * @access public * @deprecated use Mail_mail::send instead */ function send($recipients, $headers, $body) { if (!is_array($headers)) { return PEAR::raiseError('$headers must be an array'); } $result = $this->_sanitizeHeaders($headers); if (is_a($result, 'PEAR_Error')) { return $result; } // if we're passed an array of recipients, implode it. if (is_array($recipients)) { $recipients = implode(', ', $recipients); } // get the Subject out of the headers array so that we can // pass it as a seperate argument to mail(). $subject = ''; if (isset($headers['Subject'])) { $subject = $headers['Subject']; unset($headers['Subject']); } // flatten the headers out. list(, $text_headers) = Mail::prepareHeaders($headers); return mail($recipients, $subject, $body, $text_headers); } /** * Sanitize an array of mail headers by removing any additional header * strings present in a legitimate header's value. The goal of this * filter is to prevent mail injection attacks. * * @param array $headers The associative array of headers to sanitize. * * @access private */ function _sanitizeHeaders(&$headers) { foreach ($headers as $key => $value) { $headers[$key] = preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i', null, $value); } } /** * Take an array of mail headers and return a string containing * text usable in sending a message. * * @param array $headers The array of headers to prepare, in an associative * array, where the array key is the header name (ie, * 'Subject'), and the array value is the header * value (ie, 'test'). The header produced from those * values would be 'Subject: test'. * * @return mixed Returns false if it encounters a bad address, * otherwise returns an array containing two * elements: Any From: address found in the headers, * and the plain text version of the headers. * @access private */ function prepareHeaders($headers) { $lines = array(); $from = null; foreach ($headers as $key => $value) { if (strcasecmp($key, 'From') === 0) { include_once 'Mail/RFC822.php'; $parser = new Mail_RFC822(); $addresses = $parser->parseAddressList($value, 'localhost', false); if (is_a($addresses, 'PEAR_Error')) { return $addresses; } $from = $addresses[0]->mailbox . '@' . $addresses[0]->host; // Reject envelope From: addresses with spaces. if (strstr($from, ' ')) { return false; } $lines[] = $key . ': ' . $value; } elseif (strcasecmp($key, 'Received') === 0) { $received = array(); if (is_array($value)) { foreach ($value as $line) { $received[] = $key . ': ' . $line; } } else { $received[] = $key . ': ' . $value; } // Put Received: headers at the top. Spam detectors often // flag messages with Received: headers after the Subject: // as spam. $lines = array_merge($received, $lines); } else { // If $value is an array (i.e., a list of addresses), convert // it to a comma-delimited string of its elements (addresses). if (is_array($value)) { $value = implode(', ', $value); } $lines[] = $key . ': ' . $value; } } return array($from, join($this->sep, $lines)); } /** * Take a set of recipients and parse them, returning an array of * bare addresses (forward paths) that can be passed to sendmail * or an smtp server with the rcpt to: command. * * @param mixed Either a comma-seperated list of recipients * (RFC822 compliant), or an array of recipients, * each RFC822 valid. * * @return mixed An array of forward paths (bare addresses) or a PEAR_Error * object if the address list could not be parsed. * @access private */ function parseRecipients($recipients) { include_once 'Mail/RFC822.php'; // if we're passed an array, assume addresses are valid and // implode them before parsing. if (is_array($recipients)) { $recipients = implode(', ', $recipients); } // Parse recipients, leaving out all personal info. This is // for smtp recipients, etc. All relevant personal information // should already be in the headers. $addresses = Mail_RFC822::parseAddressList($recipients, 'localhost', false); // If parseAddressList() returned a PEAR_Error object, just return it. if (is_a($addresses, 'PEAR_Error')) { return $addresses; } $recipients = array(); if (is_array($addresses)) { foreach ($addresses as $ob) { $recipients[] = $ob->mailbox . '@' . $ob->host; } } return $recipients; } } Link to comment https://forums.phpfreaks.com/topic/118931-php-mail-serious-problem/#findComment-612399 Share on other sites More sharing options...
jandrews3 Posted August 9, 2008 Author Share Posted August 9, 2008 In the PEAR package? OK. I've verified that PEAR 1.7.2 is installed on my WHM, but I don't know where to find it. I'm so new to this stuff. Link to comment https://forums.phpfreaks.com/topic/118931-php-mail-serious-problem/#findComment-612409 Share on other sites More sharing options...
lynxus Posted August 9, 2008 Share Posted August 9, 2008 on your WHM ? Whats that lol. You could always try extracting all files from the pear archive to the same directory that your script sits in. Link to comment https://forums.phpfreaks.com/topic/118931-php-mail-serious-problem/#findComment-612411 Share on other sites More sharing options...
dezkit Posted August 9, 2008 Share Posted August 9, 2008 Web host manager Link to comment https://forums.phpfreaks.com/topic/118931-php-mail-serious-problem/#findComment-612412 Share on other sites More sharing options...
lynxus Posted August 9, 2008 Share Posted August 9, 2008 Sorry as i said above , maybe try extracting the files from the archve to the same dir as the script. I only really have experience from working on the machines command line rather than some file manager. Link to comment https://forums.phpfreaks.com/topic/118931-php-mail-serious-problem/#findComment-612414 Share on other sites More sharing options...
Stooney Posted August 9, 2008 Share Posted August 9, 2008 Using smtp with fsockopen is a perfectly viable solution. It's also quite simple and basic. It works the same as telnet session (as far as commands go) and you just use fwrite/fgets to talk to the server. Link to comment https://forums.phpfreaks.com/topic/118931-php-mail-serious-problem/#findComment-612433 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.