Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Почта
Форумы портала PHP.SU » PHP » Пользовательские функции » Почта

Страниц (1): [1]
 

1. valenok - 07 Апреля, 2007 - 06:51:00 - перейти к сообщению
Функция отправки e-mail'a с сайта.

Автор Я.
Если что - будем исправлять.

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. #
  5.  
  6. /// Pre define some vars ..
  7. $error=0;
  8. $mail='';
  9. $name='';
  10. $priority=0;
  11. $recipient=0;
  12. $file=Array();
  13. $file['tmp_name']='';
  14. $mes='';
  15. $ok=1;
  16. $filename='';
  17. global $destination;
  18.  
  19. // Check submitance
  20. if(isset($_POST['submited'])){
  21.  
  22. // Checking mail
  23. if(isset($_POST['mail']) && preg_match("/^[-w.]+@([A-z0-9][-A-z0-9]+.)+([A-z]{2,4}.)?[A-z]{2,4}+$/", $_POST['mail']))
  24. { $mail = htmlspecialchars($_POST['mail']); }
  25.  
  26. // Checking sender name
  27. if(isset($_POST['name']))
  28. {$name=htmlspecialchars(trim($_POST['name']));}
  29.  
  30. // Checking if mail & name provided, otherwise send message annonymiously
  31. if(!empty($name) && empty($mail)){echo "Leave us youe mail adress and we will contact you .rn"; $ok=0; }
  32. if(empty($name) && !empty($mail)){echo "Forgot your name ? rn"; $ok=0; }
  33.  
  34. // Checking if priority was selected from available list
  35. if(!isset($_POST['priority']) || !ctype_digit($_POST['priority']) ||
  36.         $_POST['priority']>5 || $_POST['priority']<1) {echo "Who's form have you submited ? rn"; $ok=0;}
  37.  else $priority = $_POST['priority'];
  38.  
  39. // Checking if recipient was selected from available list
  40. if(!isset($_POST['recipient']) || !ctype_digit($_POST['recipient']) ||
  41.         $_POST['recipient']>3 || $_POST['recipient']<1) {echo "Who's form have you submited ? rn"; $ok=0;}
  42.  else $recipient = $_POST['recipient'];
  43.  
  44. // --
  45. if(isset($_POST['mes'])){$mes=trim(htmlspecialchars($_POST['mes']));}
  46.         if(empty($mes)){echo "Empty message ?! rn"; $ok=0;}
  47.  
  48. // Checking if file was sent
  49. if(isset($_FILES['file']['name'])){
  50.         $file=$_FILES['file'];
  51. }
  52.  
  53.  
  54.  
  55.  
  56. // Formming message text
  57.  
  58. switch ($priority){
  59.         case 1:  $priority = "extremly important letter."; break;
  60.         case 2:  $priority = "very important."; break;  
  61.         case 3:  $priority = "at least - answer me."; break;  
  62.         case 4:  $priority = "take a look later."; break;  
  63.         case 5:  $priority = "take a look sometimes."; break;
  64. }
  65.  
  66. switch ($recipient){
  67.         case 1:  $recipient="Hi admin,"; break;
  68.         case 2:  $recipient="Hi support,"; break;
  69.         case 3:  $recipient="I paid!,"; break;
  70. }
  71.  
  72.  
  73.  
  74. $message=$recipient." ".$priority."rn".nl2br($mes)."rn";
  75. if(!empty($name)){ $message .= "I am ".$name."rn";}
  76. if(!empty($mail)){ $message .= "E-mail: ".$mail."rn";}
  77.  
  78.  
  79.  
  80.  
  81.  
  82. function upload($file){
  83.         global $destination;
  84.         $max_size = 1024 * 1024; // 1024 * 1024 = 1 MB
  85.         $valid_extensions = // Allowed file types to be sent us
  86.                 array("php","doc","xls","pdf","pot","ppa","pps","gz","gzip","wmf","tar","tgz","zip","rar","ace","css","txt","rtx","log");
  87.  
  88.  
  89. if (!isset($file["name"]) || !is_uploaded_file($file['tmp_name'])) return false;
  90.  
  91. // Checking file size
  92. if($file['size'] > $max_size)
  93.         {echo "Ma file size is: 1 MB.rn"; return false;}
  94.  
  95. // Getting file type
  96. $type=substr($file['type'],0,strpos($file['type'],'/'));
  97. $ext=substr($file['name'],strrpos($file['name'],'.')+1);
  98.  
  99. // Checking file type
  100. if(($type==='application' || $type==='text' || $type==='video' || $type==='multipart') && !in_array($ext,$valid_extensions))
  101.         {echo "What file is this ?.rn"; return false;}
  102.  
  103. if($file['error']!=0) {echo "Error uploading file .rn"; return false;}
  104.  
  105. $destination = "/home/public_html/" . basename($file['name']);
  106. if(!move_uploaded_file($file['tmp_name'], $destination))
  107.         {echo "Error uploading file rn"; return false;}
  108. return true;
  109.  
  110. }
  111.  
  112. // Checking whether file was uploaded succesfully
  113. $up = upload($file);
  114. if(!empty($file['type']) && $up) $filename=$destination;
  115. elseif(!empty($file['type']) && !$up){$ok=0; echo "Error uploading file . .rn";}
  116.  
  117. if(!empty($destination)){ $message.="File added..rn"; }
  118.  
  119.  
  120.  
  121. function XMail($to, $subj, $text, $filename='',$from = "<site> user@site.com") {
  122.     $f         = @fopen($filename,"rb");
  123.     $un        = strtoupper(uniqid(time()));
  124.     $head      = "From: $fromn";
  125.     $head     .= "To: $ton";
  126.     $head     .= "Subject: $subjn";
  127.    
  128.          $head     .= "Mime-Version: 1.0n";
  129.          $head     .= "Content-Type:multipart/mixed;";
  130.          $head     .= "boundary="----------".$un.""nn";
  131.          $zag       = "------------".$un."nContent-Type:text/html; charset=windows-1255n";
  132.          $zag      .= "Content-Transfer-Encoding: 8bitnn$textnn";
  133.          $zag      .= "------------".$un."n";
  134.          $zag      .= "Content-Type: application/octet-stream;";
  135.          $zag      .= "name="".basename($filename).""n";
  136.          $zag      .= "Content-Transfer-Encoding:base64n";
  137.          $zag      .= "Content-Disposition:attachment;";
  138.          $zag      .= "filename="".basename($filename).""nn";
  139.          $zag      .= chunk_split(base64_encode(@fread($f,@filesize($filename))))."n";
  140.        
  141.     return mail($to, $subj, $zag, $head);
  142. }
  143.  
  144. // If users input passed all our checks - send the message
  145. if($ok && XMail("admin@site.com","Mail from site",$message,$filename))  echo "Hurray !! Message sent." ;
  146.  
  147.  
  148. // Deleting temporary file
  149. @unlink($destination);
  150.  
  151. }
  152.  
  153.  
  154. ?>
  155.  



И сама форма + проверка на js:

PHP:
скопировать код в буфер обмена
  1.  
  2. <Form name='cont' method="post" encType="multipart/form-data" id='cont'>
  3.  
  4. <Table style="color:#8BE294;">
  5.  
  6. <tr>
  7. <td width="15%">Name : </td>
  8. <td><input size=30 name='name'  value="<?PHP if(isset($_POST['name']) && !$ok) echo $_POST['name']; ?>"></td>
  9. </tr>
  10.  
  11. <tr>
  12. <td >e-mail </td>
  13. <td ><input size=30 name='mail' value="<?PHP if(isset($_POST['mail']) && !$ok) echo $_POST['mail']; ?>"> </td>
  14. </tr>
  15.  
  16. <tr>
  17. <td >Priority : </td>
  18. <td >
  19.         <select name="priority">
  20.                 <option value="5">Very important</option>
  21.                 <option value="4">Important</option>
  22.                 <option value="3">Ordinary</option>
  23.                 <option value="2" selected>Low importance</option>
  24.                 <option value="1">Lowest importance</option>
  25.         </select>
  26. </td>
  27. </tr>
  28.  
  29. <tr>
  30. <td >Recipient </td>
  31. <td ><select name="recipient">
  32.         <option value="1" selected>Administartor</option>
  33.         <option value="2">Tech support</option>
  34.         <option value="3">Billing departament</option>
  35.         </select>
  36. </td>
  37. </tr>
  38.  
  39.  
  40. <tr>
  41. <td  >Add file: </td>
  42. <td >(1 MB) max. <input type='file' name='file' >
  43. </tr>
  44.  
  45. </table>
  46.  
  47. Your message:
  48. <textarea name='mes'  rows=7 cols=55><?PHP if(isset($_POST['mes']) && !$ok) echo $_POST['mes']; ?></textarea>
  49.  
  50. <BR><BR>
  51. <center>
  52. <input type='hidden' name='submited' value='sended'>
  53. <input type='button' id='sub'  value="send" onclick="javascript:su();" style="width:33%;">
  54. </center>
  55. </form>
  56.  
  57. <script language="JavaScript">
  58.  
  59. function check(){
  60.         var name = document.getElementById('name').value.replace(/(^s*)|(s*$)/g, "");
  61.         var mail = document.getElementById('mail').value.replace(/(^s*)|(s*$)/g, "");
  62.         var message = document.getElementById('mes').value.replace(/(^s*)|(s*$)/g, "");
  63.         var priority = document.getElementById('priority').value;
  64.         var recipient = document.getElementById('recipient').value;
  65.         var file = document.getElementById('file').value;
  66.  
  67.        
  68.         if(message=='') {window.alert("Empty message?"); return false};
  69.         if(recipient>3 || recipient<1) {window.alert("Wrong recipient."); return false};
  70.         if(priority>5 || priority<1) {window.alert("No priority?"); return false};
  71.  
  72.         if(name=='' && mail=='') { if(confirm("Send message anonymously?")){return true;}else{return false;}}
  73.         else if(name!='' && mail==''){  if(confirm("Send message without e-mail?"))
  74.                                                                         {return true;}else{return false;}
  75.         }
  76.         else if(name=='' && mail!=''){ window.alert("Please enter your name."); return false }
  77.         else if(name!='' && mail!='') {
  78.                
  79.                 emailTest = "^[_.0-9a-z-]+@([0-9a-z][0-9a-z_-]+.)+[a-z]{2,4}$";
  80.                 var regex = new RegExp(emailTest,"gi");
  81.                 // window.alert(regex.test(mail));
  82.                 if (!regex.test(mail) || mail.length<6)
  83.                         {window.alert("Please valid your e-mail."); return false;} else{return true;}
  84.  
  85.                
  86.         }
  87.   return true;
  88. }
  89.  
  90.  
  91. function su(){
  92.         if(check()){ cont.submit(); }
  93. }
  94.  
  95. </Script>
  96.  
2. -SCHATTEN- - 15 Апреля, 2007 - 15:00:06 - перейти к сообщению
send_mail.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. //Передача функции e-mail'а, темы письма, текста письма и прикрепленного файла
  4. $email = $_POST['email'];
  5. $theme = $_POST['theme'];
  6. $msg = $_POST['msg'];
  7. $file_name = $_FILES['file']['name'];
  8. $file_tmp_name = $_FILES['file']['tmp_name'];
  9. function send_mail($to,$thm,$html,$path)
  10. {
  11.         $fopen = fopen($path, "r");
  12.         if(!$fopen)
  13.         {
  14.                 print "File is broken";
  15.                 exit();
  16.         }
  17.         $file = fread($fopen, filesize($path));
  18.         fclose($fopen);
  19.        
  20.         $boundary = "--".md5(uniqid(time())); //генерируем разделитель
  21.         $headers .= "MIME-Version: 1.0n";
  22.         $headers .= "Content-Type: multipart/mixed; boundary="$boundary"n";
  23.         $multipart .= "--$boundaryn";
  24.         $kod = 'windows-1251'; // or koi8-r
  25.         $multipart .= "Content-Type: text/html; charset=$kodn";
  26.         $multipart .= "Content-Transfer-Encoding: Quote-Printednn";
  27.         $multipart .= "$htmlnn";
  28.        
  29.         $message_part = "--$boundaryn";
  30.         $message_part .= "Content-Type: application/octet-streamn";
  31.         $message_part .= "Content-Transfer-Encoding: base64n";
  32.         $message_part .= "Content-Disposition: attachment; filename = "".$path.""nn";
  33.         $message_part .= chunk_split(base64_encode($file))."n";
  34.         $multypart .= $message_part."--$boundary--n";
  35.        
  36.         if(!mail($to, $thm, $multipart, $headers))
  37.         {
  38.                 exit ("Error, email is not send");
  39.         }
  40. }
  41.  
  42.  
  43. function FileInMail ($email,$theme,$msg,$file_name,$file_tmp_name)
  44. {
  45.         if(empty($email)) exit("Введите адрес получателя");
  46.        
  47.         //checking e-mail address
  48.         $pattern = "/^[0-9a-z_]+@[0-9a-z_^.]+.[a-z]{2,6}$/i";
  49.         if(!preg_match($pattern, $email))
  50.         {
  51.                 exit ("e-mail is incorrect");
  52.         }
  53.         $email = htmlspecialchars(stripslashes($email));
  54.         $theme = htmlspecialchars(stripslashes($theme));
  55.         $msg = htmlspecialchars(stripslashes($msg));
  56.        
  57.         $picture = "";
  58.        
  59.         //if file exist downloading it into our server
  60.         if(!empty($file_tmp_name))
  61.         {
  62.                 //downloadin it
  63.                 $path = $file_name;
  64.                 if(copy($$file_tmp_name, $path)) $picture = $path;
  65.         }
  66.         //sends e-mail
  67.         if(empty($picture)) mail($email, $theme, $msg);
  68.         else send_mail($email, $theme, $msg, $picture);
  69.         //send_mail function
  70. }
  71. ?>
  72.  

При форме :
PHP:
скопировать код в буфер обмена
  1.  
  2. <html>
  3.  
  4. <head>
  5.   <title></title>
  6. </head>
  7.  
  8. <body>
  9.  
  10. <?PHP
  11. if(!empty($_POST))
  12. {
  13.         include "send_mail.php";
  14. }
  15. ?>
  16. <table>
  17. <form enctype='multipart/form-data' method=post>
  18. <tr>
  19. <td width=50%>To:</td>
  20. <td align=right><input type=text name=email maxlength=32></td>
  21. </tr>
  22. <tr>
  23. <td width=50%>Theme:</td>
  24. <td align=right><input type=text name=theme maxlength=64></td>
  25. </tr>
  26. <tr>
  27. <td colspan=2>
  28. Masage:
  29. <textarea cols=50 rows=8 name=msg></textarea>
  30. </td>
  31. </tr>
  32. <tr>
  33. <td width=50%>Photo:</td>
  34. <td align=right><input type=file name=file maxlength=64></td>
  35. </tr>
  36. <tr><td colspan=2><input type=submit value='Send'></td></tr>
  37. </form>
  38. </table>
  39. </body>
  40.  
  41. </html>
3. valenok - 22 Июня, 2008 - 20:10:29 - перейти к сообщению
новая функция для валидации emailа
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. function check_email($mail)
  4. {
  5.         $host = explode("@",$mail); $mxarr = array();
  6.         if (function_exists('getmxrr') && !getmxrr($host[1],$mxarr)) return false;
  7.         if (!preg_match('/^[-!#$%&\'*+\\.\/0-9=?A-Z^_`{|}~]+@([-0-9A-Z]+\.)+([0-9A-Z]){2,4}$/i', $mail)) return false;
  8.         return true;
  9.  
  10. }


Это не фильтрация и валидация на правильность, а проверка того что email
действительно существует.

email_check.php
Введи сначала xx@yandex.ru потом xx@yandex.rui
4. Ink-developer - 25 Января, 2009 - 11:14:25 - перейти к сообщению
Для реализации обратной связи без заморачивания со скриптами могу предложить данный сервис:
форма обратной связи
5 минут и готово, работает даже на хостинге без php
Устанавливаеш форму обратной связи пишеш админу е-mail на который должны приходить письма и все готово
5. vitaliy_mad - 26 Января, 2009 - 03:33:44 - перейти к сообщению
Функция отправки почты через сокеты с поддержкой аутенификции... идея принадлежит i-novice.net. редакированное под мои нужды...
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. // Функция для чтения ответа сервера. Выбрасывает исключение в случае ошибки
  5. function read_smtp_answer($socket) {
  6.     $read = socket_read($socket, 1024);
  7.     if ($read{0} != '2' && $read{0} != '3') {
  8.         if (!empty($read)) {
  9.             throw new Exception('SMTP failed: '.$read."\n");
  10.         } else {
  11.             throw new Exception('Unknown error'."\n");
  12.         }
  13.     }
  14. }
  15.    
  16.     // Функция для отправки запроса серверу
  17. function write_smtp_response($socket, $msg) {
  18.     $msg = $msg."\r\n";
  19.     socket_write($socket, $msg, strlen($msg));
  20. }
  21.  
  22. /*
  23.  send-mail функция отправки письма по протоколу SMTP с использование сокетов. PHP должен быть собран с опцией sockets
  24.  параметры:
  25. $from - адрес отправителя. без <>. Жто требование выполняется функцией
  26. $to - адрес получателя. без <>. Жто требование выполняется функцией
  27. $message - текст сообщения
  28. $subject - тема сообщения
  29. $auth - массив с информацией о SMTP аутинификации. Используется LOGIN:
  30.     'isauth' - true - использовать ауутенификацию. false - не использовать
  31.     'login' -  Логин к почтовому ящику
  32.     'passwd' - Пароль к почтовому ящику
  33. $serv - массив с информацией о сервере
  34.     'host' - доменное имя хоста почтового сервера
  35.     'port' - порт почтового сервера (обычно 25)
  36.  
  37. */
  38. function send_mail($from,$to,$message,$subject,$auth=array('isauth'=>false,'login'=>"",'passwd'=>""),$serv=array('host'=>'mail.localhost','port'=>'25'))
  39. {
  40.     $address = $serv['host']; // адрес smtp-сервера
  41.     $port    = $serv['port'];          // порт (стандартный smtp - 25)
  42.    
  43.     if ($auth['isauth'])
  44.     {
  45.         $login   = $auth['login'];    // логин к ящику
  46.         $pwd     = $auth['passwd'];    // пароль к ящику
  47.     }
  48.    
  49.     try {
  50.        
  51.         // Создаем сокет
  52.         $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  53.         if ($socket < 0) {
  54.             throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
  55.         }
  56.  
  57.         // Соединяем сокет к серверу
  58.         echo 'Connect to \''.$address.':'.$port.'\' ... ';
  59.         $result = socket_connect($socket, $address, $port);
  60.         if ($result === false) {
  61.             throw new Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."\n");
  62.         }
  63.        
  64.         // Читаем информацию о сервере
  65.         read_smtp_answer($socket);
  66.        
  67.         // Приветствуем сервер
  68.         write_smtp_response($socket, 'EHLO '.$login);
  69.         read_smtp_answer($socket); // ответ сервера
  70.            
  71.         // Делаем запрос авторизации
  72.         write_smtp_response($socket, 'AUTH LOGIN');
  73.         read_smtp_answer($socket);
  74.        
  75.         // Отравляем логин
  76.         write_smtp_response($socket, base64_encode($login));
  77.  
  78.        
  79.         // Отравляем пароль
  80.         write_smtp_response($socket, base64_encode($pwd));
  81.         read_smtp_answer($socket);
  82.  
  83.         // Задаем адрес отправителя
  84.         write_smtp_response($socket, 'MAIL FROM:<'.$from.'>');
  85.         read_smtp_answer($socket);
  86.        
  87.         // Задаем адрес получателя
  88.         write_smtp_response($socket, 'RCPT TO:<'.$to.'>');
  89.         read_smtp_answer($socket);
  90.        
  91.         // Готовим сервер к приему данных
  92.         write_smtp_response($socket, 'DATA');
  93.        
  94.         // Отправляем данные
  95.         $message = "To: $to\r\n".$message; // добавляем заголовок сообщения "адрес получателя"
  96.         $message = "Subject: $subject\r\n".$message; // заголовок "тема сообщения"
  97.         $message = "Content-Type: text/plain\r\n".$message; // заголовок "тема сообщения"
  98.         write_smtp_response($socket, $message."\r\n.");
  99.         read_smtp_answer($socket);
  100.        
  101.         // Отсоединяемся от сервера
  102.         write_smtp_response($socket, 'QUIT');
  103.         read_smtp_answer($socket);
  104.        
  105.     } catch (Exception $e) {
  106.         echo "\nError: ".$e->getMessage();
  107.     }
  108.    
  109.     if (isset($socket)) {
  110.         socket_close($socket);
  111.     }
  112.  
  113. }
  114.  
  115.  
  116. ?>
  117.  

Пример использования:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $serv=array('host'=>'mail.example.com','port'=>'25');
  4. $auth=array('isauth'=>true,'login'=>'client@example.com','passwd'=>'mypasswd');
  5. $from='client@exapmle.com';
  6. $to='client2@example2.com';
  7. $subject="Заголовок";
  8. $mess="Это сообщения является информационным. Просьба не отвечать на него...";
  9.  
  10. send_mail($from,$to,$mess,$subject,$auth,$serv);
  11. ?>
  12.  
6. martiny007 - 16 Февраля, 2009 - 10:53:52 - перейти к сообщению
Реально работает сервис http://www[dot]vipform[dot]ru - форма обратной связи на html. Сервис предоствляет возможность использовать форму обратной связи на любом сайте. Я сам правда не ставил её - у меня нет сайта. Но у приятеля моего несколько таких форм на сайте.
7. Вездеход - 16 Февраля, 2009 - 13:25:47 - перейти к сообщению
martiny007 пишет:
Реально работает сервис http://www[dot]vipform[dot]ru - форма обратной связи на html. Сервис предоствляет возможность использовать форму обратной связи на любом сайте. Я сам правда не ставил её - у меня нет сайта. Но у приятеля моего несколько таких форм на сайте.

чувак, форма в десятки раз круче этой пишется максимум за час. так что вопрос - нафига ж брать с этого сайта? тем более зависить от кого то...
8. martiny007 - 21 Февраля, 2009 - 07:40:00 - перейти к сообщению
Я не спорю, если ты можешь сам сделать то своё лучше конечно. Но если хостинг например не поддеоживает php, если нет времени, если нет функции mail - а это весь бесплатный хостинг, то на мой взгляд достаточно удобный сервис.

 

Powered by ExBB FM 1.0 RC1