Jump to content
  • 0

Отправка письма с вложениями.


lapwing
 Share

Question

Здравствуйте! Прошу помочь разобраться. Есть скрипт отправки почты с вложением нескольких файлов - только картинки или фотографии плюс проверка на размер файла ( до 64 Кб). Вот кусок скрипта:

<?php
session_start();
$admin = 'pochta@mail.ru';

if ( isset( $_POST['sendMail'] ) ) {
$name = substr( $_POST['name'], 0, 64 );
$tel = substr( $_POST['tel'], 0, 64 );
$email = substr( $_POST['email'], 0, 64 );
$subject = substr( $_POST['subject'], 0, 64 );
$message = substr( $_POST['message'], 0, 250 );

$error = '';
if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>';
if ( empty( $tel ) ) $error = $error.'<li>Не заполнено поле "Телефон"</li>';
if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>';
if ( empty( $subject ) ) $error = $error.'<li>Не заполнено поле "Тема"</li>';
if ( empty( $message ) ) $error = $error.'<li>Не заполнено поле "Сообщение"</li>';
if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
$error = $error.'<li>поле "E-mail" должно соответствовать формату somebody@somewhere.ru</li>';
if ( !empty( $error ) ) {
$_SESSION['sendMailForm']['error'] = '<p>При заполнении формы были допущены ошибки:</p><ul>'.$error.'</ul>';
$_SESSION['sendMailForm']['name'] = $name;
$_SESSION['sendMailForm']['tel'] = $tel;
$_SESSION['sendMailForm']['email'] = $email;
$_SESSION['sendMailForm']['subject'] = $subject;
$_SESSION['sendMailForm']['message'] = $message;
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}

$filepath = array();
$filename = array();
for( $i = 0; $i < count($_FILES['file']); $i++) {
if ( !empty( $_FILES['file']['tmp_name'][$i] ) and $_FILES['file']['error'][$i] == 0 ) {

$filepath[] = $_FILES['file']['tmp_name'][$i];
$filename[] = $_FILES['file']['name'][$i];

// проверка загружаемого файла

ini_set('memory_limit', '32M');
$maxsize = 64 * 1024;
$extentions = array( "gif","jpg","jpeg","png","psd");
$size = filesize ($_FILES['file']['tmp_name'][$i]);
$type = strtolower(substr($_FILES['file']['name'][$i], 1+strrpos($_FILES['file']['name'][$i],".")));
$new_name = 'file-'.time().'.'.$type;
if($size > $maxsize)
{

echo "Файл больше 64 Кб. Уменьшите размер вашего файла или загрузите другой. <br><a href='' onClick=window.close();>Закрыть окно</a>";

}
elseif(!in_array($type,$extentions))
{
echo ' <b>Файл имеет недопустимое расширение</b><br>';
}

//конец проверки
}
}

$body = "АВТОР:\r\n".$name."\r\n\r\n";
$body .= "ТЕЛЕФОН:\r\n".$tel."\r\n\r\n";
$body .= "E-MAIL:\r\n".$email."\r\n\r\n";
$body .= "ТЕМА:\r\n".$subject."\r\n\r\n";
$body .= "СООБЩЕНИЕ:\r\n".$message;

if ( send_mail($admin, $body, $email, $filepath, $filename) )
$_SESSION['success'] = true;
else
$_SESSION['success'] = false;
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}

При запуске ругается, говорит, что заголовки уже были посланы. Смысл ошибки я понял - перед header не должно быть echo. Как тогда сообщить о том, что файл большой или имеет недопустимое расширение?

Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Я вот как раз этого и не улавливаю. Если будет ошибка, то нужно об этой ошибке сообщить и вывести это сообщение(и тогда переадресация не нужна), а если ошибок не будет, то пользователя переадресовываем. Т.е. получается, надо или проверку вставлять куда-то в другое место - а, куда ее еще вставишь-только в цикл, надо же проверять каждый из файлов или , если форма заполнена без ошибок и файлы прикреплены нормальные, перенаправлять пользователя куда-либо, может не на эту страницу, на другую? Может это можно каким то другим способом сделать?

Link to comment
Share on other sites

  • 0

Я делаю в таких случаях примерно так:

try {
sendmail();
}
catch(Exception $ex)
{
$error=$ex->getMessage();
}

if (!$error) {header("Location: /success"); die();}
else {showerror($error);}

где sendmail() следует заменить на ваш метод отсылки почты с throw в случае ошибки, а showerror() - вывод ошибки, у меня в этом случае идёт присвоение переменной для шаблонизатора. В итоге кратко и удобно.

Link to comment
Share on other sites

  • 0
Я делаю в таких случаях примерно так:

try {
sendmail();
}
catch(Exception $ex)
{
$error=$ex->getMessage();
}

if (!$error) {header("Location: /success"); die();}
else {showerror($error);}

где sendmail() следует заменить на ваш метод отсылки почты с throw в случае ошибки, а showerror() - вывод ошибки, у меня в этом случае идёт присвоение переменной для шаблонизатора. В итоге кратко и удобно.

чувствуется сишный стиль ;) с чего начинали прогать ?

Link to comment
Share on other sites

  • 0

Возможно ли делать так:

  ini_set('memory_limit', '32M');
$maxsize = 65536;
$extentions = array( "gif","txt","jpg","jpeg","png","psd");
$type = strtolower(substr($_FILES['file']['name'][$i], 1+strrpos($_FILES['file']['name'][$i],".")));
$new_name = 'file-'.time().'.'.$type;
if($_FILES['file']['size'][$i] > $maxsize)
{
$err = '<li>Произошла ошибка: размер фото больше 64Кб</li>';
}
elseif(!in_array($type,$extentions))
{
$err = $err.'<li>Произошла ошибка: файл имеет недопустимое расширение</li>';
}
if (!empty($err)) {
echo "$err";
exit("<br /><input name='back' type='button' value='Вернуться назад' onclick='java script:self.back();'>");
}
else
{
if (copy($file, "uploads/".$new_name))
И дальше делаем с файлами то , что нам нужно;
}
.....................................
header( 'Location: '.$_SERVER['PHP_SELF'];

Можно, видимо и наоборот:

if (!$err) {
copy($file, "uploads/".$new_name);
и дальше работаем с файлами.....
header( 'Location: '.$_SERVER['PHP_SELF'];
}
else
{
echo "$err";
exit;
}

Второй вариант похоже предпочтительней?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy