home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 April / PCWorld_2005-04_cd.bin / akce / web / phpnuke / PHP-Nuke-7.5.exe / html / includes / smtp.php < prev    next >
PHP Script  |  2004-01-29  |  10KB  |  248 lines

  1. <?php
  2. /***************************************************************************
  3.  *                              smtp.php
  4.  *                       -------------------
  5.  *   begin                : Wed May 09 2001
  6.  *   copyright            : (C) 2001 The phpBB Group
  7.  *   email                : support@phpbb.com
  8.  *
  9.  *   $Id: smtp.php,v 1.16.2.5 2003/06/12 19:20:20 acydburn Exp $
  10.  *
  11.  ***************************************************************************/
  12. /***************************************************************************
  13. * phpbb2 forums port version 2.0.5 (c) 2003 - Nuke Cops (http://nukecops.com)
  14. *
  15. * Ported by Nuke Cops to phpbb2 standalone 2.0.5 Test
  16. * and debugging completed by the Elite Nukers and site members.
  17. *
  18. * You run this package at your sole risk. Nuke Cops and affiliates cannot
  19. * be held liable if anything goes wrong. You are advised to test this
  20. * package on a development system. Backup everything before implementing
  21. * in a production environment. If something goes wrong, you can always
  22. * backout and restore your backups.
  23. *
  24. * Installing and running this also means you agree to the terms of the AUP
  25. * found at Nuke Cops.
  26. *
  27. * This is version 2.0.5 of the phpbb2 forum port for PHP-Nuke. Work is based
  28. * on Tom Nitzschner's forum port version 2.0.6. Tom's 2.0.6 port was based
  29. * on the phpbb2 standalone version 2.0.3. Our version 2.0.5 from Nuke Cops is
  30. * now reflecting phpbb2 standalone 2.0.5 that fixes some bugs and the
  31. * invalid_session error message.
  32. ***************************************************************************/
  33. /***************************************************************************
  34.  *   This file is part of the phpBB2 port to Nuke 6.0 (c) copyright 2002
  35.  *   by Tom Nitzschner (tom@toms-home.com)
  36.  *   http://bbtonuke.sourceforge.net (or http://www.toms-home.com)
  37.  *
  38.  *   As always, make a backup before messing with anything. All code
  39.  *   release by me is considered sample code only. It may be fully
  40.  *   functual, but you use it at your own risk, if you break it,
  41.  *   you get to fix it too. No waranty is given or implied.
  42.  *
  43.  *   Please post all questions/request about this port on http://bbtonuke.sourceforge.net first,
  44.  *   then on my site. All original header code and copyright messages will be maintained
  45.  *   to give credit where credit is due. If you modify this, the only requirement is
  46.  *   that you also maintain all original copyright messages. All my work is released
  47.  *   under the GNU GENERAL PUBLIC LICENSE. Please see the README for more information.
  48.  *
  49.  ***************************************************************************/
  50. /***************************************************************************
  51.  *
  52.  *   This program is free software; you can redistribute it and/or modify
  53.  *   it under the terms of the GNU General Public License as published by
  54.  *   the Free Software Foundation; either version 2 of the License, or
  55.  *   (at your option) any later version.
  56.  *
  57.  ***************************************************************************/
  58.  
  59. define('SMTP_INCLUDED', 1);
  60.  
  61. //
  62. // This function has been modified as provided
  63. // by SirSir to allow multiline responses when
  64. // using SMTP Extensions
  65. //
  66. function server_parse($socket, $response, $line = __LINE__)
  67. {
  68.         while (substr($server_response, 3, 1) != ' ')
  69.         {
  70.                 if (!($server_response = fgets($socket, 256)))
  71.                 {
  72.                         message_die(GENERAL_ERROR, "Couldn't get mail server response codes", "", $line, __FILE__);
  73.                 }
  74.         }
  75.  
  76.         if (!(substr($server_response, 0, 3) == $response))
  77.         {
  78.                 message_die(GENERAL_ERROR, "Ran into problems sending Mail. Response: $server_response", "", $line, __FILE__);
  79.         }
  80. }
  81.  
  82. // Replacement or substitute for PHP's mail command
  83. function smtpmail($mail_to, $subject, $message, $headers = '')
  84. {
  85.         global $board_config;
  86.  
  87.         // Fix any bare linefeeds in the message to make it RFC821 Compliant.
  88.         $message = preg_replace("#(?<!\r)\n#si", "\r\n", $message);
  89.  
  90.         if ($headers != '')
  91.         {
  92.                 if (is_array($headers))
  93.                 {
  94.                         if (sizeof($headers) > 1)
  95.                         {
  96.                                 $headers = join("\n", $headers);
  97.                         }
  98.                         else
  99.                         {
  100.                                 $headers = $headers[0];
  101.                         }
  102.                 }
  103.                 $headers = chop($headers);
  104.  
  105.                 // Make sure there are no bare linefeeds in the headers
  106.                 $headers = preg_replace('#(?<!\r)\n#si', "\r\n", $headers);
  107.  
  108.                 // Ok this is rather confusing all things considered,
  109.                 // but we have to grab bcc and cc headers and treat them differently
  110.                 // Something we really didn't take into consideration originally
  111.                 $header_array = explode("\r\n", $headers);
  112.                 @reset($header_array);
  113.  
  114.                 $headers = '';
  115.                 while(list(, $header) = each($header_array))
  116.                 {
  117.                         if (preg_match('#^cc:#si', $header))
  118.                         {
  119.                                 $cc = preg_replace('#^cc:(.*)#si', '\1', $header);
  120.                         }
  121.                         else if (preg_match('#^bcc:#si', $header))
  122.                         {
  123.                                 $bcc = preg_replace('#^bcc:(.*)#si', '\1', $header);
  124.                                 $header = '';
  125.                         }
  126.                         $headers .= ($header != '') ? $header . "\r\n" : '';
  127.                 }
  128.  
  129.                 $headers = chop($headers);
  130.         $cc = explode(', ', $cc);
  131.         $bcc = explode(', ', $bcc);
  132.         }
  133.  
  134.         if (trim($subject) == '')
  135.         {
  136.                 message_die(GENERAL_ERROR, "No email Subject specified", "", __LINE__, __FILE__);
  137.         }
  138.  
  139.         if (trim($message) == '')
  140.         {
  141.                 message_die(GENERAL_ERROR, "Email message was blank", "", __LINE__, __FILE__);
  142.         }
  143.  
  144.         // some code was removed here for 2.0.6
  145.  
  146.         // Ok we have error checked as much as we can to this point let's get on
  147.         // it already.
  148.         if( !$socket = fsockopen($board_config['smtp_host'], 25, $errno, $errstr, 20) )
  149.         {
  150.                 message_die(GENERAL_ERROR, "Could not connect to smtp host : $errno : $errstr", "", __LINE__, __FILE__);
  151.         }
  152.  
  153.         // Wait for reply
  154.         server_parse($socket, "220", __LINE__);
  155.  
  156.         // Do we want to use AUTH?, send RFC2554 EHLO, else send RFC821 HELO
  157.         // This improved as provided by SirSir to accomodate
  158.         if( !empty($board_config['smtp_username']) && !empty($board_config['smtp_password']) )
  159.         {
  160.                 fputs($socket, "EHLO " . $board_config['smtp_host'] . "\r\n");
  161.                 server_parse($socket, "250", __LINE__);
  162.  
  163.                 fputs($socket, "AUTH LOGIN\r\n");
  164.                 server_parse($socket, "334", __LINE__);
  165.  
  166.                 fputs($socket, base64_encode($board_config['smtp_username']) . "\r\n");
  167.                 server_parse($socket, "334", __LINE__);
  168.  
  169.                 fputs($socket, base64_encode($board_config['smtp_password']) . "\r\n");
  170.                 server_parse($socket, "235", __LINE__);
  171.         }
  172.         else
  173.         {
  174.                 fputs($socket, "HELO " . $board_config['smtp_host'] . "\r\n");
  175.                 server_parse($socket, "250", __LINE__);
  176.         }
  177.  
  178.         // From this point onward most server response codes should be 250
  179.         // Specify who the mail is from....
  180.         fputs($socket, "MAIL FROM: <" . $board_config['board_email'] . ">\r\n");
  181.         server_parse($socket, "250", __LINE__);
  182.  
  183.         // Specify each user to send to and build to header.
  184.     $to_header = '';
  185.  
  186.     // Add an additional bit of error checking to the To field.
  187.     $mail_to = (trim($mail_to) == '') ? 'Undisclosed-recipients:;' : trim($mail_to);
  188.     if (preg_match('#[^ ]+\@[^ ]+#', $mail_to))
  189.     {
  190.         fputs($socket, "RCPT TO: <$mail_to>\r\n");
  191.         server_parse($socket, "250", __LINE__);
  192.     }
  193.  
  194.         // Ok now do the CC and BCC fields...
  195.         @reset($bcc);
  196.         while(list(, $bcc_address) = each($bcc))
  197.         {
  198.                 // Add an additional bit of error checking to bcc header...
  199.                 $bcc_address = trim($bcc_address);
  200.                 if (preg_match('#[^ ]+\@[^ ]+#', $bcc_address))
  201.                 {
  202.                         fputs($socket, "RCPT TO: <$bcc_address>\r\n");
  203.                         server_parse($socket, "250", __LINE__);
  204.                 }
  205.         }
  206.  
  207.         @reset($cc);
  208.         while(list(, $cc_address) = each($cc))
  209.         {
  210.                 // Add an additional bit of error checking to cc header
  211.                 $cc_address = trim($cc_address);
  212.                 if (preg_match('#[^ ]+\@[^ ]+#', $cc_address))
  213.                 {
  214.                         fputs($socket, "RCPT TO: <$cc_address>\r\n");
  215.                         server_parse($socket, "250", __LINE__);
  216.                 }
  217.         }
  218.  
  219.         // Ok now we tell the server we are ready to start sending data
  220.         fputs($socket, "DATA\r\n");
  221.  
  222.         // This is the last response code we look for until the end of the message.
  223.         server_parse($socket, "354", __LINE__);
  224.  
  225.         // Send the Subject Line...
  226.         fputs($socket, "Subject: $subject\r\n");
  227.  
  228.         // Now the To Header.
  229.         fputs($socket, "To: $mail_to\r\n");
  230.  
  231.         // Now any custom headers....
  232.         fputs($socket, "$headers\r\n\r\n");
  233.  
  234.         // Ok now we are ready for the message...
  235.         fputs($socket, "$message\r\n");
  236.  
  237.         // Ok the all the ingredients are mixed in let's cook this puppy...
  238.         fputs($socket, ".\r\n");
  239.         server_parse($socket, "250", __LINE__);
  240.  
  241.         // Now tell the server we are done and close the socket...
  242.         fputs($socket, "QUIT\r\n");
  243.         fclose($socket);
  244.  
  245.         return TRUE;
  246. }
  247.  
  248. ?>