[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Почта на сайте
ElfSam
Расскажите, кто знает, о самой технологии



Спустя 3 минуты, 32 секунды (21.08.2009 - 20:43) ElfSam написал(а):
Меня больше всего интересует, как письма хранятся на сервере. В базе данных или в отдельных файлах, а в бд ссылки на эти файлы?

Спустя 2 часа, 19 минут (21.08.2009 - 23:02) Nikitian написал(а):
UNIX По умолчанию письма хранятся в файлах в пользовательских директориях. Другое дело, что некоторые транспорты посты позволяют использовать виртуальных пользователей, почта которых хранится в базе и доступна оттуда же, но это частные случаи.
Вы собственно говоря с какой целью интересуетесь? Если с целью получения познаний, то на специализированные форумы операционных систем, если сделать что-то, то говорите что именно хотите.
Таких извращённых систем, чтобы в базе хранились ссылки на файлы (как это вообще, ведь ссылка на файл - это опция файловой системы!) я не встречал.

Спустя 7 часов, 40 минут, 1 секунда (22.08.2009 - 06:42) ElfSam написал(а):
Так что же получается? При регистрации для каждого пользователя папка создается и там куча его файлов хранится?

Спустя 4 минуты, 30 секунд (22.08.2009 - 06:46) ElfSam написал(а):
Вообще я хочу создать у себя на сайте обмен письмами между пользователями по образу того, что на тут пхп форуме

Спустя 1 день, 4 часа, 24 минуты, 44 секунды (23.08.2009 - 11:11) Teach написал(а):
Цитата
Расскажите, кто знает, о самой технологии

Технология передачи почтовых сообщений с сайта описана достаточно подробно в различных источниках, но число вопросов не уменьшается!
Потому что, ни в одном источнике нет скриптов, которые учитывают все тонкости работы серверов хостинга и кодировки сообщений.
При создании формы с элементами для ввода сообщения в файлах HTML PHP
необходимо и обязательно именовать элементы так, чтобы эти имена совпадали с именами переменных используемых в скрипте передачи почты.
Обычно используются имена: "from","email","msg". Чаще всего, сервера хостинга передают в поле "ОТ" адрес почтовогоящика, который использует сервер! Поэтому указанные имена необходимо "упрятать" в тело сообщения.
Пример скрипта:
PHP
<?  
$to="_@_";адрес куда передать сообшение
$subject
="Сообщение от: $from ";формирование поля "тема"
$fOk="CO.htm";пример имени страницы для возврата после передачи почты
$header
="Content-type: text/plain; charset=\"windows-1251\"";кодировка поля "тема" в почтовых программах
$header
.="Subject: $subject";
$header.="Content-type: text/plain; charset=\"windows-1251\"";
$mes="Отправитель: $from\nАдрес: $email\nСообщение:$msg";формирование тела соощения
mail
($to$subject,$mes,$header);передача почты
Header
("Location: $fOk");возврат на страницу 
exit;

Собщение об отправке почты красиво вывести на самой странице, как и скрипт проверки заполнения формы.
cool.gif

Спустя 2 часа, 22 минуты, 43 секунды (23.08.2009 - 13:34) ElfSam написал(а):
А почта хранится в простых текстовых файлах или html или еще че?

Спустя 1 минута, 15 секунд (23.08.2009 - 13:35) ElfSam написал(а):
И ты не понял, о какой почте я говорю. Я говорю об обмене сообщениями именно на сайте.

Спустя 1 минута, 56 секунд (23.08.2009 - 13:37) Kuliev написал(а):
Цитата (ElfSam @ 23.08.2009 - 15:35)
И ты не понял, о какой почте я говорю. Я говорю об обмене сообщениями именно на сайте.

Если на сайте то храни все в бд.

Спустя 29 минут, 48 секунд (23.08.2009 - 14:07) ElfSam написал(а):
А какой тип поля указывать для хранения текста письма? VARCHAR?

Спустя 1 минута, 49 секунд (23.08.2009 - 14:09) Kuliev написал(а):
Цитата (ElfSam @ 23.08.2009 - 16:07)
А какой тип поля указывать для хранения текста письма? VARCHAR?

TEXT

Спустя 30 минут, 23 секунды (23.08.2009 - 14:39) ElfSam написал(а):
Ну с этим храненибм вроде все понятно.

Спустя 6 дней, 21 час, 35 минут, 3 секунды (30.08.2009 - 12:14) ElfSam написал(а):
Подскажите, а рисунки в базе данных как хранить?

Спустя 13 часов, 45 минут, 59 секунд (31.08.2009 - 02:00) Nikitian написал(а):
В полях типа blob

Спустя 5 часов, 2 минуты, 47 секунд (31.08.2009 - 07:03) ElfSam написал(а):
Так а как сам рисунок в бд засунуть?

Спустя 4 часа, 57 минут, 11 секунд (31.08.2009 - 12:00) ElfSam написал(а):
Вот и реализация обмена почтой на сайте (кое-что еще не доработано):
pochta.php
PHP
<?php
    session_start
(); //запускаем сессию
    include("oformlenie.php"); //подключаем скрипт, который выводит верхнюю часть веб-страницы (шапку, главное меню и т.д.)
    include("mysql_connect.php"); //подключаем скрипт соединения с сервером БД
    if(!isset($_SESSION['id']))//проверка регистрации (если в данный момент ты - гость, то регайся или входи)
       {
          echo '<div class="alert">';
          echo '<h2> Данный раздел доступен только для зарегистрированных пользователей!<br>';
          echo '<a href="main.php"> <<< На главную </a> </h2> </div>';
          exit();
       }
 
//в этом блоке размещена форма для написания иотправки письма:
    echo '
     <div class="blok_leftx2">
               <h3 class="text2">  Написать письмо  </h3> <br>
               <form name="message" action="write_mess_action.php" method="post">
                 Адресат:<br>
                 <input type="radio" name="mess_for" value="admin"> администрации<br>
                 <input type="radio" name="mess_for" value="user">
                 <input type="text" name="for_user" cols=20 value="пользователю"> <p>
                 Заголовок письма: <br>
                  <input type="text" name="header" cols=20> <p>
                 Текст письма: <br>
                 <textarea name="text_mess" cols=20 rows=15> </textarea> <p>
                 <input type="submit" value=" Отправить ">
               </form>
     </div>'
; 

    echo 
'
     <div class="blok_rightx2"> // выводится список писем (пока что и написанных пользователем, и принятых)
       <h3 class="text2"> Ваша почта </h3>
       <h4 class="text1">
          В данном разделе вы можете обмениваться почтой с администрацией. <p>
          <img src="images1/f_norm.gif"> - непрочитанные письма. <br> //стырил с данного сайта
          <img src="images1/f_norm_no.gif"> - прочитанные письма. <p>
       </h4>'
;
       $str_sql = "SELECT * FROM `pochta` WHERE `id`= '".$_SESSION['id']."' OR 
`mess_for`='"
.$_SESSION['user_log']."'";//запрос на вывод этих писем
       ShowMessages($str_sql);
      
?>
<?php
     function ShowMessages
($str_sql)//функция вывода списка писем
       {
         echo '
          <table class="table_center">//список писем будет отображаться в таблице
          <tr>//шапка таблицы
                <td class="fon_td4"> <img src="images1/f_norm.gif"> </td>
                <td class="fon_td4"> Заголовок письма</td>
                <td class="fon_td4"> Отправитель письма </td>
                <td class="fon_td4"> Дата отправки письма </td>
                <td class="fon_td4"> Пометить </td>
           </tr>'
;
           $result=mysql_query($str_sql) or die(mysql_error()."<br>".$str_sql);//выполнение запроса
           if(mysql_num_rows($result)==NULL)//если по запросу не найдено писем, выводим сообщение
              {
               echo '
               <tr> <td colspan=5 class="fon_td5">  --= Нет писем =--</td> </tr> </table> </div>'
;
               exit();
              }
          else //если есть, то выводим список
             {
               while($string = mysql_fetch_row($result))//пока есть строки в таблице
                   {
                     echo '<tr>';
//вот тут чето скрипт неправильно работает. он должен выводить картинку прочитанного письма, если флаг принимает значение yes
                     if($string[3]="no")
                         {
                           echo '<td class="fon_td5"> <img src="images1/f_norm.gif">';
                         }
                     elseif($string[3]="yes")
                         {
                           echo '<td class="fon_td5"> <img src="images1/f_norm_no.gif">';
                         }
//Здесь выводится заголовок письма. он же является ссылкой на сам текс письма
                     echo '<td class="fon_td5"> <a href="show_mess.php?mess_id='.$string[7].'">'.$string[1].'</a></td>';
//здесь указан отправитель письма, если отправитель вы, то скрипт выводит не ваше имя, а пишет "вы"
                     if($string[0]==$_SESSION['id'])
                         {echo '<td class="fon_td5"> Вы </td>';}
                     else
                         
{echo '<td class="fon_td5">'.$string[4].'</td>';}
//здесь все понятно. выводится дата и время отправки письма
                     echo '<td class="fon_td5">'.$string[2].'</td>';
//Пометить письмо, чтоб потом удалить (не реализовано пока)
                     echo '<td class="fon_td5"> <form> <input type="checkbox"> </form> </tr>';
                   }//end while
           echo '</table>';
         }//end if
   }//end function

Если несколькими словами, то здесь в левой части страницынаходится форма для написания письма, а в правой - список ваших писем.

Спустя 1 минута, 8 секунд (31.08.2009 - 12:01) ElfSam написал(а):
Так выглядит веб-страница
user posted image

Спустя 1 минута, 32 секунды (31.08.2009 - 12:03) ElfSam написал(а):
Это еще не все:
write_mess_action.php
PHP
<?php
    session_start
();
    include("oformlenie.php");
    include("mysql_connect.php");
    $header=$_POST['header']; //заголовок письма
    $text_mess=$_POST['text_mess']; //текст письма
    $status="no"; //флаг, означающий, что письмо еще не прочитано
    if($_POST['mess_for']=="пользователю" || $_POST['mess_for']==NULL)
//проверяется введен ли адресат
       {
                     echo '<div class="alert">';
                     echo '<h2> Должен быть указан адресат письма</h2> <p>';
                     echo '<h3> <a href="pochta.php"> <<< Назад </a> </h3>';
                     echo ' </div> ';   
                     exit
();      
       
}

    if($_POST['mess_for']=="admin")
//Если переключатьль в форме установлен напротив "администрации"
       {
         $mess_for="admin";
       }
     else
//Если переключатьль в форме установлен напротив "пользователю"
       {
         $mess_for=$_POST['for_user'];
       }
//запрос на добавление в БД параметров письма
    $str_sql="INSERT INTO `pochta` (`id`, `num_mess`, `date`, `status`, `mess_from`, `mess_for`, `mess_text`) 
VALUES ('"
.$_SESSION['id']."','".$header."', '".date("y-m-d H:i:s")."', '".$status."', '".$_SESSION['user_log']."', '".$mess_for."', '".$text_mess."')";
    $result=mysql_query($str_sql); //выполнение этого запроса
    if($result) 
                  
{
                     echo '<div class="alert">';
                     echo '<h2> Ваше письмо отправлено </h2> <p>';
                     echo '<h3> <a href="pochta.php"> <<< Назад </a> </h3>';
                     echo ' </div> ';
                  }
     else
                 
{
                     echo '<div class="alert">';
                     echo '<h2> Ваше письмо не было отправлено <br>'. mysql_error().'<br/>'.$str_sql.'</h2> <p>';
                     echo '<h3> <a href="pochta.php"> <<< Назад </a> </h3>';
                     echo ' </div> ';
                 }


Этот скрипт обрабатывает данные из формы в скрипте pochta.php

Спустя 1 минута, 25 секунд (31.08.2009 - 12:04) ElfSam написал(а):
И еще один скрипт:
show_mess.php
PHP
<?php
    session_start
();
    include("oformlenie.php");
    include("mysql_connect.php");

    $mess_id=$_GET['mess_id']; //Получаем индекс выбранного письма, переданный по ссылке из скрипта pochta.php
//По этому индексу получим все параметры письма из БД
    $str_sql="SELECT * FROM `pochta` WHERE `mess_id`=$mess_id";
    $result = mysql_query($str_sql) or die(mysql_error()."<br>".$str_sql);
    $string=mysql_fetch_assoc($result);

    if($_SESSION['id']!=$string[id])//если письмо открыл получатель, то флаг устанавливается в значение "yes" (т.е. прочитанное письмо)
       {
         $str_sql="UPDATE `pochta` SET `status`='".yes."' WHERE `mess_id`='".$mess_id."'";
         $result=mysql_query($str_sql) or die(mysql_error()."<br/>".$str_sql);
       }
//тут просто дублируется форма из скрипта pochta.php
    echo '
     <div class="blok_leftx2">
               <h3 class="text2">  Написать письмо  </h3> <br>
               <form name="message" action="write_mess_action.php" method="post">
                 Адресат:<br>
                 <input type="radio" name="mess_for" value="admin"> администрации<br>
                 <input type="radio" name="mess_for" value="user">
                 <input type="text" name="for_user" cols=20 value="пользователю"> <p>
                 Заголовок письма: <br>
                  <input type="text" name="header" cols=20> <p>
                 Текст письма: <br>
                 <textarea name="text_mess" cols=20 rows=15> </textarea> <p>
                 <input type="submit" value=" Отправить ">
               </form>
     </div>'
; 
//тут выводится автор и текс письма
    echo '<div class="blok_rightx2"> 
                <h3 class="text1">'
.$string[mess_from].' написал вам сообщение:</h3><br>';
    echo '<table class="table_center"> <tr> <td class="fon_td5"> <h3 class="text1">';
    echo $string[mess_text].'</h3> </td> </tr> </table> <p>';
    echo '<a href="pochta.php"> << Назад </a>';



Спустя 45 минут, 29 секунд (31.08.2009 - 12:50) ElfSam написал(а):
Вот вывод текста письма
user posted image

Спустя 5 минут, 13 секунд (31.08.2009 - 12:55) ElfSam написал(а):
У меня не работает отображение прочитанного письма в списке. Когда открывается письмо, то в скипте show_mess.php первым делом оно помечается прочитанным и данные об этом заносятся в БД. Но когда, при отображении списка писем в скрипте pochta.php, должна напротив прочитанного письма поменяться картинка, то этого не происходит. Почему-то значение в $string[3] остается значение "no".
Может кто-нибудь знает в чем тут дело?

Спустя 1 день, 18 часов, 6 минут, 26 секунд (3.09.2009 - 07:01) ElfSam написал(а):
Подскажите, как сообщения удалять. К примеру, я написал сообщение другому юзеру. У меня это сообщение отображается, как переданное, а у него - как принятое. Но юзер прочитал письмо и захотел его удалить из списка. Тогда получится, что и у меня оно из списка удалится?

Спустя 2 часа, 39 минут, 52 секунды (3.09.2009 - 09:41) Kuliev написал(а):
ElfSam
Сделай еще одно поле, и когда юзер удаляет у себя сообщение ставь 1, и он его видеть не будет, хотя оно будет храниться в базе!

Спустя 51 минута, 48 секунд (3.09.2009 - 10:33) glock18 написал(а):
Вариант 1.
Советую посмотреть, как это делается здесь.

Вариант 2.
Как и сказал Кулиев, только нужно будет два поля - одно статус письма у отправителя, другое - получателя.

Спустя 1 день, 9 часов, 36 минут, 13 секунд (4.09.2009 - 20:09) ElfSam написал(а):
второй вариант подходит

Спустя 3 дня, 21 час, 25 минут, 48 секунд (8.09.2009 - 17:35) valaster написал(а):
Помогите чайнику разобраться в разовом вопросе, ПОЖАЛУЙСТА.
Есть задача установить на сайте форму обратной связи. Оговорюсь, что я никогда дела не имел с PHP unsure.gif .
Саму форму я написал, а вот с обработчиком возникла проблемка. С других серверов я пробовал отправлять сообщения - прекрасно отправляются, а с фирменного нет.
Хостер сказал, что надо вставить в код следующий фрагмент:
mail($email,"from site",$message,$headers,"-ftest@vostok.net");
это он для примера прислал.

Вопрос, куда его надо вставить ???

Код обработчика привожу:
PHP
<?php
if 
(isset ($_POST['name']))
{
$name = substr($_POST['name'],0,100); //Не может быть более 100 символов
if (empty($_POST['name']))
{
echo "<center><b>Не указано имя !!!<p>";
echo "<a href=index-10.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else 
{
$name = "не указано";
}
if (isset ($_POST['phon']))
{
$phon = substr($_POST['phon'],0,100); //Не может быть более 50 символов
if (empty($_POST['phon']))
{
echo "<center><b>Не указан номер телефона !!!<p>";
echo "<a href=index-10.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else 
{
$phon = "не указано";
}
if (isset ($_POST['email']))
{
$email = substr($_POST['email'],0,100); //Не может быть более 100 символов
if (empty($_POST['email']))
{
echo "<center><b>Не указан e-mail !!!<p>";
echo "<a href=index-10.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else 
{
$email = "не указано";
}
if (isset ($_POST['mess']))
{
$mess = substr($_POST['mess'],0,10000); //Не может быть более 10000 символов
if (empty($_POST['mess']))
{
echo "<center><b>Сообщение не написано !!!<p>";
echo "<a href=index-10.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else 
{
$mess = "не указано";
}
$i = "не указано";
if ($name == $i AND $phon == $i AND $email == $i AND $mess == $i)
{
echo "Ошибка ! Скрипту не были переданы параметры !";
exit;
}
$to = "perenosov@mail.ru";  /*СВОЙ АДРЕСС!*/
$subject = "Massage for MNC";
$message .= "Name:$name\n";
$message .= "Phone:$phon\n";
$message .= "E-mail:$email\n";
$message .= "Message:$mess\n";
mail ($to,$subject,$message) or print "Не могу отправить письмо !!!";
echo "<center><b>Спасибо за отправку вашего сообщения>";
exit;

Спустя 6 часов, 37 минут, 56 секунд (9.09.2009 - 00:13) Nikitian написал(а):
Поменять
PHP
mail ($to,$subject,$message) or print "Не могу отправить письмо !!!";

на
PHP
mail($to,$subject,$message,'',"-ftest@vostok.net") or print "Не могу отправить письмо !!!";

Спустя 2 часа, 16 минут, 11 секунд (9.09.2009 - 02:29) twin написал(а):
Не успел еще дописать, ну да ладно, изучай.

Спустя 7 часов, 3 минуты, 40 секунд (9.09.2009 - 09:33) valaster написал(а):
Спасибо огромное, Nikitian!
То, что надо!
При получении сообщения на почтовый ящик в The Bat с кодировкой что-то:
Name:Валерий
Phone:80ХХХХХХХХХ
E-mail:ххххххх@mail.ru
Message:тестовое сообщение

Но, если вручную указать кодировку utf-8, то нормально читается. smile.gif
А что-то можно сделать, чтобы кодировка всегда нормально отображалась

Спустя 10 минут, 50 секунд (9.09.2009 - 09:43) gooder отдыхающий написал(а):
указать в заголовках
и кодировать с помощью base64_encode

Спустя 36 минут, 23 секунды (9.09.2009 - 10:20) Nikitian написал(а):
Вот вам функция отправки почты без использования функции mail(). Так на будущее.
PHP
function mail_get_data($smtp_conn)
{
$data="";
while(
$str fgets($smtp_conn,515))
    {
    
$data .= $str;
    if(
substr($str,3,1) == " ") { break; }
    }
return 
$data;
}
function 
mail_sender($toname,$toemail,$subject,$message,$fromname,$fromemail)
{
$fromserver="smtp-сервер вашего ящика";
$fromemail='Ваше мыло';
$frompassword='пароль к вашему ящику';
$header="Date: ".date("D, j M Y G:i:s")." +0300\r\n";
$header.='From: =?windows-1251?B?'.base64_encode($fromname).'?= <'.$fromemail.">\r\n";
$header.="X-Mailer: The Bat! (v3.99.3) Professional\r\n";
$header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode($fromname)))."?= <".$fromemail.">\r\n";
$header.="X-Priority: 3 (Normal)\r\n";
$header.="Message-ID: <172562218.".date("YmjHis")."@".$fromserver.">\r\n";
$header.="To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode($toname)))."?= <".$toemail.">\r\n";
$header.="Subject: =?windows-1251?B?".base64_encode($subject)."?=\r\n";
$header.="MIME-Version: 1.0\r\n";
$header.="Content-Type: text/html; charset=windows-1251\r\n";
$header.="Content-Transfer-Encoding: 8bit\r\n";

$text=$message;

$smtp_conn fsockopen("smtp.".$fromserver25,$errno$errstr10);
if(!
$smtp_conn) {return "соединение с серверов не прошло"."smtp.".$fromserverfclose($smtp_conn);}
$data mail_get_data($smtp_conn);
fputs($smtp_conn,"EHLO ".$fromserver."\r\n");
$code substr(mail_get_data($smtp_conn),0,3);
if(
$code != 250) {return "ошибка приветсвия EHLO"fclose($smtp_conn);}

fputs($smtp_conn,"AUTH LOGIN\r\n");
$code substr(mail_get_data($smtp_conn),0,3);
if(
$code != 334) {return "сервер не разрешил начать авторизацию"fclose($smtp_conn);}

fputs($smtp_conn,base64_encode($fromemail)."\r\n");
$code substr(mail_get_data($smtp_conn),0,3);
if(
$code != 334) {return "ошибка доступа к такому юзеру ".$fromemailfclose($smtp_conn);}


fputs($smtp_conn,base64_encode($frompassword)."\r\n");
$code substr(mail_get_data($smtp_conn),0,3);
if(
$code != 235) {return "не правильный пароль"fclose($smtp_conn);}

fputs($smtp_conn,"MAIL FROM:".$fromemail."\r\n");
$code substr(mail_get_data($smtp_conn),0,3);
if(
$code != 250) {return "сервер отказал в команде MAIL FROM"fclose($smtp_conn);}

fputs($smtp_conn,"RCPT TO:".$toemail."\r\n");
$code substr(mail_get_data($smtp_conn),0,3);
if(
$code != 250 AND $code != 251) {return "Сервер не принял команду RCPT TO"fclose($smtp_conn);}

fputs($smtp_conn,"DATA\r\n");
$code substr(mail_get_data($smtp_conn),0,3);
if(
$code != 354) {return "сервер не принял DATA"fclose($smtp_conn);}

fputs($smtp_conn,$header."\r\n".$text."\r\n.\r\n");
$code substr(mail_get_data($smtp_conn),0,3);
if(
$code != 250) {return "ошибка отправки письма"fclose($smtp_conn);}

fputs($smtp_conn,"QUIT\r\n");
fclose($smtp_conn);

return 
true;
}


Отправка напрямую. РАботает при заблокированной функции mail() и даже при отсутствии sendmail или любого MTA на сервере.

Спустя 2 часа, 25 минут, 33 секунды (9.09.2009 - 12:45) valaster написал(а):
ок!
спасибки smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.