76

Re: PHP код для небольшой админки. Ошибка.

Написано: sendmail_path = "C:/Serv/xampp/sendmail/sendmail.exe -t"

77

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Написано: sendmail_path = "C:/Serv/xampp/sendmail/sendmail.exe -t"

Очень хорошо, тогда ищите где подключается c:\Serv\xampp\sendmail\sendmail.php

78 (изменено: Ketsyki, 2011-04-14 16:41:11)

Re: PHP код для небольшой админки. Ошибка.

А вы не могли бы посоветовать какой-нибудь бесплатный хост, на котором можно было бы проверить отправку почты? А то надоело мучиться с настройками.

79

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

А вы не могли бы посоветовать какой-нибудь бесплатный хост, на котором можно было бы проверить отправку почты?

Нет, бесплатный хостинг посоветовать не могу, не знаком с ними.

80 (изменено: Ketsyki, 2011-04-18 18:42:54)

Re: PHP код для небольшой админки. Ошибка.

А как мне, хотя бы, проверить работоспособность кода из учебника?

P.S. А как считать value чекбоксов, если неизвестно, сколько чекбоксов на странице, но известно, что их имена имеют такой вид: to1 to2 to3... ?

81

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

А как мне, хотя бы, проверить работоспособность кода из учебника?

Если вы имеете в виду функцию mail(), то я уже давал рецепт выше.

Ketsyki сказал:

А как считать value чекбоксов, если неизвестно, сколько чекбоксов на странице, но известно, что их имена имеют такой вид: to1 to2 to3

Если количество галочек заранее неизвестно, то их выводить надо в виде массива.

<input type="checkbox" name="check[]" value="on_1" />
<input type="checkbox" name="check[]" value="on_2" />

Далее в коде перебираем.

<?php
if (isset($_POST['check'])) {
  foreach($_POST['check'] as $check) {
    if (strlen($check) > 0) {
      // Галочка отмечена и имеет какое-то значение value.
    }
  }
}
?>

82 (изменено: Ketsyki, 2011-04-19 21:28:37)

Re: PHP код для небольшой админки. Ошибка.

Я хочу проверить, работает ли код из учебника. Сам код приведен в 72 посте. Лично у меня он никак не хочет работать. Пытался найти бесплатный хостинг, но мне сказали, что там, как правило, отключают отправку почты, чтоб не было спама.

И зачем там джаваскрипт и ссылка на сайт bigtip? У меня про этот скрипт в учебнике нет ни одного комментария.




Так, все. Забил на учебник.

Проверьте, пожалуйста, правильно ли я все понял.

<?php 

// Выбираем email возле которых стоят галочки. (в переменной to содержаться email на которы хотим отправить письмо)
if (isset($_POST['check'])) {
  foreach($_POST['check'] as $check) {
    if (strlen($check) > 0) {
      $to = $to . ", " . $check;
    }
  }
}

//Начинаем отправку почты.

//Пишем тему сообщения
$subject = "Birthday Reminders for August"; 
//Пишем сообщение
$message = ' 
<html> 
    <head> 
        <title>Birthday Reminders for August</title> 
    </head> 
    <body> 
        <p>Here are the birthdays upcoming in August!</p> 
    </body> 
</html>'; 
// Указываем кодировку письма
$headers  = "Content-type: text/html; charset=windows-1251 \r\n"; 

//Пишем, от кого письмо
$headers .= "From: Birthday Reminder <birthday@example.com>\r\n"; 
// Отправляем скрытую копию. Плохо понимаю, что это такое. Но мне кажется, что копия отправленного письма отправляется на тот email, который тут написан. (Поправьте, пожалуйста, если не правильно :))
$headers .= "Bcc: birthday-archive@example.com\r\n"; 
// Ну и отправляем письмо.
mail($to, $subject, $message, $headers); 
?>

Теперь разбираюсь, как отправлять файлы. Вот пример кода с сайта http://phpclub.ru/detail/article/mail :

<?php 
//Подключаем PEAR.
include('Mail.php'); 
include('Mail/mime.php'); 

// В переменных text и html содержится текст сообщения.
$text = 'Text version of email'; 
$html = '<html><body>HTML version of email</body></html>'; 
//Пишем расположение файла.
$file = '/home/richard/example.php'; 
//Дальше не могу понять строку.
$crlf = "\r\n"; 
//Тут пишем от кого послано письмо и тему письма.
$hdrs = array( 
              'From'    => 'you@yourdomain.com', 
              'Subject' => 'Test mime message' 
              ); 
//Опять непонятная строка
$mime = new Mail_mime($crlf); 
//Теперь вообще ничего не понятно, но есть предположения, как это может работать.
//Возможно, что дальше прикрепляется файл и определяется формат письма (html или простой текст.)
$mime->setTXTBody($text); 
$mime->setHTMLBody($html); 
$mime->addAttachment($file, 'text/plain'); 
//Тут, вроде бы, переменно body присваивается или переменная text или html, но как это делается я не пойму.
$body = $mime->get(); 
$hdrs = $mime->headers($hdrs); 

$mail =& Mail::factory('mail'); 
//Теперь отправляется письмо на email postmaster@localhost, в hdrs содержиться тема письма и от кого оно отправлено, в body - текст письма.
$mail->send('postmaster@localhost', $hdrs, $body); 
?> 

83

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Отправляем скрытую копию. Плохо понимаю, что это такое. Но мне кажется, что копия отправленного письма отправляется на тот email, который тут написан. (Поправьте, пожалуйста, если не правильно smile)

Все верно, это копия письма. Если копию отправлять не надо, то строку можно удалить.

Ketsyki сказал:

//Дальше не могу понять строку.
$crlf = "\r\n";

Эту строку трогать не надо, оставляйте ее всегда в таком виде. Из-за особенностей операционных систем, они по разному обрабатывают символы переноса строки, \r\n - это лучший вариант и его надо использовать.

Ketsyki сказал:

//Опять непонятная строка
$mime = new Mail_mime($crlf);

Создание класса. В переменной $mime создается класс к которому дальше будет происходить обращение.

Здесь формируется тело письма. Если письмо состоит из текста, то используется функция setTXTBody(), при HTML письме используется функция setHTMLBody(). Не используйте обе функции, только одну из них.
$mime->setTXTBody($text);
$mime->setHTMLBody($html);

Здесь происходит прикрепление файла к письму. Обратите внимание, что кроме содержимого файла, вторым параметром надо передавать в функции его MIME тип; у текстового файла это будет text/plain.
$mime->addAttachment($file, 'text/plain');

Создается закодированное тело письма состоящее из текста и прикрепленного файла, все в виде одной кучи нечитаемых (закодированных) символов.
$body = $mime->get();

Формируются заголовки письма.
$hdrs = $mime->headers($hdrs);

Теперь создается ссылка на класс Mail, в виде параметра передается (mail), что указывает классу использовать функцию mail() PHP.
$mail =& Mail::factory('mail');

Отправка письма. Первый параметр - это адресат (кому), второй параметр - это сформированные заголовки письма, третий параметр - это тело письма вместе с прикрепленным файлом.
$mail->send('postmaster@localhost', $hdrs, $body);

84 (изменено: Ketsyki, 2011-04-20 14:05:24)

Re: PHP код для небольшой админки. Ошибка.

Ага. Вроде понял.
И вот еще 2 вопросика:
1. На сайте написано, что надо поставить библиотеку http://pear.php.net/package/Mail_Mime. Но в коде библиотеку подключают так:
include('Mail.php');
include('Mail/mime.php');

В Mail_Mime файла Mail.php нет. Вы писали, что надо поставить еще http://pear.php.net/package/Mail. А вот как это правильно поставить? Сперва в папку со страницей отправки почты распаковать Mail, а потом распаковать туда же Mail_mime? Но тогда получается, что надо написать не include('Mail/mime.php');, а include('mime.php').

2. text/plain - это текстовый файл. Это файлы формата .txt .doc .pdf? И, например, файл .doc, в котором есть картинки, нормально отправится?

85 (изменено: Ketsyki, 2011-04-20 19:00:05)

Re: PHP код для небольшой админки. Ошибка.

Так, с 1 вопросом разобрался. Переустановил сервер, снова настроил заглушку, написал пробный код:

<?php

include('Mail.php'); 
include('Mail/mime.php');

if (isset($_POST['check'])) {
  foreach($_POST['check'] as $check) {
    if (strlen($check) > 0) {
      $to = $to . ", " . $check;
    }
  }
}



$text = 'Text version of email'; 
 

$file = '/atts/file.txt'; 

$crlf = "\r\n"; 

$hdrs = array( 
              'From'    => 'you@yourdomain.com', 
              'Subject' => 'Test mime message' 
              ); 

$mime = new Mail_mime($crlf); 

$mime->setTXTBody($text); 
 
$mime->addAttachment($file, 'text/plain'); 

$body = $mime->get(); 
$hdrs = $mime->headers($hdrs); 

$mail =& Mail::factory('mail'); 
$mail->send($to, $hdrs, $body); 




?>

На выходе получаю:

To: , sfs@sdfs.ru, pupkin@gmail.com, bIbIbIbI@bIbI.com
Subject: Test mime message
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
From: you@yourdomain.com

Text version of email

Тут все правильно?

86

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

В Mail_Mime файла Mail.php нет.

Нет Mail.php - это другой класс, его надо брать отсюда http://pear.php.net/package/Mail . Установка не составит труда, просто скачайте оба архива с классами и распакуйте их в любой каталог, затем обязательно укажите относительный путь к подключаемым двум файлам. Где они будут находиться - значения не имеет.

Заголовки у всех файлов разные и если для текстового .txt файла можно писать text/plain, то для других нужны свои заголовки, иначе они будут неверно приниматься при попытке скачать файл из письма. При загрузке файла через POST, в массиве есть переменная содержащая тип файла $_FILES['userfile']['type'], ее можно использовать. Если файлы не загружаются, а берутся с сервера, то надо подставлять тип файла по расширению: для расширения .pdf подставлять application/pdf; картинка .gif будет image/gif; .doc файл имеет тип application/msword и т. д.

Наиболее распространенные типы файлов можно посмотреть здесь: http://www.w3schools.com/media/media_mimeref.asp

87

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Тут все правильно?

Правильно, только ниже должен идти файл.

И еще один момент - изначально кодировка письма будет latin1, поэтому если вы захотите создать письмо в windows-1251, например, то придется сделать так:

    $param = array(
        'text_encoding' => '7bit',
        'html_encoding' => 'quoted-printable',
        'head_charset' => 'windows-1251',
        'text_charset' => 'windows-1251',
        'html_charset' => 'windows-1251'
    );
    $body = $mime->get($param);

88 (изменено: Ketsyki, 2011-04-20 19:05:38)

Re: PHP код для небольшой админки. Ошибка.

Блин. После этого кода:
if (isset($_POST['check'])) {
  foreach($_POST['check'] as $check) {
    if (strlen($check) > 0) {
      $to = $to . ", " . $check;
    }
  }
}

Перед первым emailом появляется запятая To: , sfs@sdfs.ru, pupkin@gmail.com, bIbIbIbI@bIbI.com

Если я на нее забью и оставлю ее тут, то на отправку почты это не повлияет?

То, что снизу нет файла, это, наверное, из-за заглушки.

89

Re: PHP код для небольшой админки. Ошибка.

Перепишите так.

$a_to = array();
if (isset($_POST['check'])) {
  foreach($_POST['check'] as $check) {
    if (strlen($check) > 0) {
      $a_to[] = $check;
    }
  }
}

if (count($a_to) > 0) {
  $to = implode(', ', $a_to);
}

90

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

То, что снизу нет файла, это, наверное, из-за заглушки.

Не уверен. Тело файла быть должно. Заглушка ничего с письмом обычно не делает, как оно формируется - так и передается на вывод.

91 (изменено: Ketsyki, 2011-04-20 19:15:13)

Re: PHP код для небольшой админки. Ошибка.

Ага. Вроде все.
Значит в итоге такой код должен работать?

<?php

include('Mail.php'); 
include('Mail/mime.php');

$a_to = array();
if (isset($_POST['check'])) {
  foreach($_POST['check'] as $check) {
    if (strlen($check) > 0) {
      $a_to[] = $check;
    }
  }
}

if (count($a_to) > 0) {
  $to = implode(', ', $a_to);
}


$text = 'Text version of email'; 
 

$file = '/atts/file.txt'; 

$crlf = "\r\n"; 

$hdrs = array( 
              'From'    => 'you@yourdomain.com', 
              'Subject' => 'Test mime message' 
              ); 



$param = array(
        'text_encoding' => '7bit',
        'html_encoding' => 'quoted-printable',
        'head_charset' => 'windows-1251',
        'text_charset' => 'windows-1251',
        'html_charset' => 'windows-1251'
    );
    


$mime = new Mail_mime($crlf); 

$mime->setTXTBody($text); 
 
$mime->addAttachment($file, 'text/plain'); 

$body = $mime->get($param); 
$hdrs = $mime->headers($hdrs); 

$mail =& Mail::factory('mail'); 
$mail->send($to, $hdrs, $body); 




?>

Ну и остается только интерфейс для ввода текста письма прицепить, ну и там по-мелочам...

92

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Значит в итоге такой код должен работать?

Да, должен работать. Только путь к прикрепляемому файлу проверьте с помощью функции file_exists().

93 (изменено: Ketsyki, 2011-04-20 21:50:55)

Re: PHP код для небольшой админки. Ошибка.

Не все оказалось так хорошо.

1. Как с одной страницы на другую передать переменную $to? Я в других местах использовал глобальные переменные, которые у меня находились в отдельном файле. И если хотел получить переменную то просто писал global $to. А тбрать переменную как глобальную с другой страницу что-то не выходит...
2. При отправке сообщения на русском языке вместо текста отправляется вот такое: =CF=F0=E8=E2=E5=F2!
3. Вот этот код:
$hdrs = array(
              'From'    => 'you@yourdomain.com',
              'Subject' => 'Test mime message'
              );
Указывает тему сообщение и от кого оно отправлено. А если у меня есть переменные $From и $Subject, в которых содержится мыло отправителя и тема, то как  мне их в этот код всунуть?

94

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Как с одной страницы на другую передать переменную $to?

Не смог понять.

Ketsyki сказал:

сообщения на русском языке вместо текста отправляется вот такое: =CF=F0=E8=E2=E5=F2

Правильно, именно так и кодируются данные в письмах.

Здесь все элементарно.
$hdrs = array(
              'From'    => $From,
              'Subject' => $Subject
              );

95

Re: PHP код для небольшой админки. Ошибка.

Ну, вот у меня на странице 1.php есть переменная $to. Дальше, при нажатии на кнопку, открывается страница 2.php. И надо как-то передать значение переменной со страницы 1 на страницу 2. Глобальные переменные что-то не хотят работать...

А если данные в письме так кодируются, то юзер то сможет увидеть нормальный текст?
И тема сообщения тоже выглядит так: =?windows-1251?Q?=D2=E5=EC=E0?=

96

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Глобальные переменные что-то не хотят работать

Они и не должны работать. На разных скриптах разные переменные. Передать значения с одной страницы на другую можно только через урл методом GET или через POST, отправкой формы. Как вариант есть еще кукисы COOKIE (не рекомендуется для большого объема данных) и сессии SESSION.

Ketsyki сказал:

А если данные в письме так кодируются, то юзер то сможет увидеть нормальный текст?

Разумеется, для того и кодируется, чтобы все выводилось нормально.

97 (изменено: Ketsyki, 2011-04-20 23:29:40)

Re: PHP код для небольшой админки. Ошибка.

Вобщем, стал загонять emailы в отдельный файл, а потом считывать их оттуда.

98 (изменено: Ketsyki, 2011-04-21 21:28:06)

Re: PHP код для небольшой админки. Ошибка.

Что-то странное происходит...

Щас попробовал запустить код на сервере. Он не заработал. На этом сервере был сайт, на котором уже была страница для отправки почты. Я скопировал оттуда код, изменил его. Код работает, но письмо почему-то на почту не приходит...

Код переписать забыл sad Самое смешное, что на моем локальном сервере в заглушку письмо приходит, а на сервере... все написано правильно, ошибок нет, код срабатывает, но письмо на почту не приходит sad Есть какие-нибудь способы проверить, в чем проблема?

99

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Есть какие-нибудь способы проверить, в чем проблема?

На сервере можно посмотреть журналы ошибок. Можно проверить простейший код отправки письма функцией mail(), здесь есть пример http://lv.php.net/manual/en/function.mail.php. Если пример не работает и функция mail() вернет false - значит не работает сама функция на сервере.

100 (изменено: Ketsyki, 2011-04-22 13:49:30)

Re: PHP код для небольшой админки. Ошибка.

Да просто тут люди, с которыми я пытался запустить код. Могли только управлять сайтом. (странички новые создавать, например) А к настройкам сервера у них доступа нет.

А где этот журнал обычно находиться? А то я только в апаче знаю что, где лежит.