substr режит текст в результате на почту приходит текст с ромбиками (((

Julia1991

Новичок
substr режит текст в результате на почту приходит текст с ромбиками http://joxi.ru/DmBydWnfwQ5qgr
Вот код формы

PHP:
if ( isset( $_POST['sendMail'] ) ) {
    $name    = substr( $_POST['name'], 0, 64 );
    $tel = substr( $_POST['tel'], 0, 64 );
    $email     = substr( $_POST['email'], 0, 64 );
    $select1    = substr( $_POST['select1'], 0, 64 );
    $number = substr( $_POST['number'], 0, 64 );   
    $message = substr( $_POST['message'], 0, 100000 );

if($_FILES)
{
    $filepath = array();
    $filename = array();
    $file2 = array();
    $i = 0;
        foreach ($_FILES["file"]["error"] as $key => $error) {
            if ($error == UPLOAD_ERR_OK) {
                $filename[$i][0] = $_FILES["file"]["tmp_name"][$key];
                $filename[$i][1] = $_FILES["file"]["name"][$key];
                $i++;
            }
        }
    }

    
    $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".$select1."\r\n\r\n";
    $body .= "Номер квартиры:\r\n".$number."\r\n\r\n";
    $body .= "Текст предложения\r\n".$message;
    send_mail($to, $body, $email, $filename);
}

function send_mail($to, $body, $email, $filename, $select1, $message)
{
    $subject = ' ';
    $boundary = "--".md5(uniqid(time())); // генерируем разделитель
    $headers = "From: ".$email."\r\n";     
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .="Content-Type: multipart/mixed; boundary=\"".$boundary."\"\r\n";
    $multipart = "--".$boundary."\r\n";
    $multipart .= "Content-type: text/plain; charset=\"UTF-8\"\r\n";
    $multipart .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";

    $body = $body."\r\n\r\n";
 
    $multipart .= $body;
    foreach ($filename as $key => $value) {
        $fp = fopen($value[0], "r");
        $content = fread($fp, filesize($value[0]));
        fclose($fp);
        $file .= "--".$boundary."\r\n";
        $file .= "Content-Type: application/octet-stream\r\n";
        $file .= "Content-Transfer-Encoding: base64\r\n";
        $file .= "Content-Disposition: attachment; filename=\"".$value[1]."\"\r\n\r\n";
        $file .= chunk_split(base64_encode($content))."\r\n";
    }
    $multipart .= $file."--".$boundary."--\r\n";
    mail($to, $subject, $multipart, $headers);
}
 

ksnk

прохожий
mb_substr поможет, если указывать кодировку. Хотя в этом случае substr испортил бы последний символ, или пару символов. Если весь текст приходит в ромбиках - значит текст изначально в другой кодировке.
Смотри на кодировки документа, отсылаемого текста...
 

Julia1991

Новичок
Документ в формате utf-8. Не весь текст в ромбиках, а только последний символ.
mb_substr добавляла и кодировку тоже вот так
$message = mb_substr( $_POST['message'], 0, 100000, 'UTF-8' ); для $message
но этот вариант не срабатывает
 

Andkorol

Новичок
но этот вариант не срабатывает
В смысле – на почту сообщение приходит в таком же виде, как и после substr?
А если не отправлять на почту – а просто сразу же вывести сообщение после mb_substr в браузер?
А если отправлять на почту сообщение – но без обрезки?
В таком виде на почту приходит любой текст, любой длины?
Для ввода текста сообщения используется обычная текстовая область (<textarea>) – или WYSIWYG-редактор?
 

Julia1991

Новичок
Вот форма

PHP:
<form action="#" method="post" id="sendform">
        <h3>Форма</h3>
            <input name="name" value="" size="40" type="text" placeholder="Имя"/><br/>
            <input name="tel" value="" size="40" class="required" type="tel" placeholder="Телефон*"/><br/>
             <input name="email" value="[email protected]" size="40" class="required" type="email" placeholder="E-mail"/><br/>
            <textarea name="message" cols="40" rows="10" placeholder="Сообщение"/> </textarea><br/>
       <select  name="select">
       <option disabled selected>Выберите город</option>
       <option value="Харьков">Харьков</option>
       <option value="Киев">Киев</option>
       <option value="Одесса">Одесса</option>
       </select><br/>
       <input value="Отправить" name="sendMail" type="submit" />
</form>
 

Andkorol

Новичок
Вы остальные вопросы игнорируете – или просто не понимаете?
 

Julia1991

Новичок
В смысле – на почту сообщение приходит в таком же виде, как и после substr? - Да
А если не отправлять на почту – а просто сразу же вывести сообщение после mb_substr в браузер? - Не смотрела
А если отправлять на почту сообщение – но без обрезки? -Тоже самое
В таком виде на почту приходит любой текст, любой длины? - Если большой текст
Для ввода текста сообщения используется обычная текстовая область (<textarea>) – или WYSIWYG-редактор? - <textarea> использую
 

Andkorol

Новичок
... Не смотрела
... Тоже самое
Это стоит проверить.
... Если большой текст
Тут проблема в том, что тексты на ваших скринах и близко не достигают лимита в 100К, указанного для substr|mb_substr.
Так что вполне возможно, что никакой обрезки и нет вовсе – и «искать ноги» нужно совсем в другом месте.
 

Тугай

Новичок
Скорей всего substr тут не причем, а вставляемый текст не utf-8.
как вариант:
Код:
$message = substr( iconv('utf-8', 'utf-8', $_POST['message']), 0, 100000 );
Это почистит строку от не utf-8 символов.
 

Julia1991

Новичок
Это код
PHP:
<?php

$to = '[email protected]';

if ( isset( $_POST['sendMail'] ) ) {
$name = substr( $_POST['name'], 0, 64 );
$tel = substr( $_POST['tel'], 0, 64 );
$email = substr( $_POST['email'], 0, 64 );
$select = substr( $_POST['select'], 0, 64 );
$message = substr( iconv('utf-8', 'utf-8', $_POST['message']), 0, 100000 );

$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".$select."\r\n\r\n";
$body .= "Сообщение:\r\n".$message;

send_mail($to, $body, $email);

}

function send_mail($to, $body, $email, $filepath, $filename)
{
$subject = 'Форма';
$boundary = "--".md5(uniqid(time())); // генерируем разделитель
$headers = "From: ".$email."\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .="Content-Type: multipart/mixed; boundary=\"".$boundary."\"\r\n";
$multipart = "--".$boundary."\r\n";
$multipart .= "Content-type: text/plain; charset=\"utf-8\"\r\n";
$multipart .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";

$body = $body."\r\n\r\n";

$multipart .= $body;

$file = '';
if ( !empty( $filepath ) ) {
$fp = fopen($filepath, "r");
if ( $fp ) {
$content = fread($fp, filesize($filepath));
fclose($fp);
$file .= "--".$boundary."\r\n";
$file .= "Content-Type: application/octet-stream\r\n";
$file .= "Content-Transfer-Encoding: base64\r\n";
$file .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
$file .= chunk_split(base64_encode($content))."\r\n";
}
}
$multipart .= $file."--".$boundary."--\r\n";
mail($to, $subject, $multipart, $headers);
}
?>
 

Тугай

Новичок
Content-Transfer-Encoding: quoted-printable
стоит такой заголовок, но само сообщение не кодируется php функцией quoted_printable_encode().

$body = quoted_printable_encode($body)."\r\n\r\n";
 

Julia1991

Новичок
Если я добавила это
PHP:
$body = quoted_printable_encode($body)."\r\n\r\n";
то это убрать можно
PHP:
$body = $body."\r\n\r\n";
?
 
Сверху