Этот вопрос закрыт для ответов, так как повторяет вопрос Как правильно прикрепить вложенный файл?
@tectolog

Использую PHP mail(). Почему прикрепленный файл в письме приходит в виде абракадабры, а не приклепленным файлом?

Всем привет.

Ситуация: использую mail() php для отправки с сайта писем с прикрепляемыми файлами (jpg, png и т.д.). На почту приходит письмо со всеми заголовками и содержанием - здесь все нормально, а прикрепляемый файл вместо прикрепленного файла выводится как абракадабра. Уже все перепробовал - ничего не помогает. Код привожу, может, я уже каких-то очевидных вещей не замечаю. Данные на сервер передаются через связку jQuery + ajax - здесь тоже все работает, затык где-то в заголовках:
...
                $type   = $_POST[ 'selectTypeCalc' ];
		$size1   = $_POST[ 'inputSize1Calc' ];
		$size2   = $_POST[ 'inputSize2Calc' ];
		
		$name   = $_POST[ 'inputNameCalc' ];
		$tel    = $_POST[ 'inputTelCalc' ];
		$email  = $_POST[ 'inputEmailCalc' ];
		$message= $_POST[ 'inputMessageCalc' ];
		
		$path = '/home/site/site.ru/docs/upload/tmp/';
		$to = 'info@site.ru';
		$from_mail = 'info@site.ru';
		
		$subject = "=?UTF-8?B?".base64_encode( "Запрос на онлайн-расчет стоимости кухни" )."?=";
		$boundary = md5( uniqid( time() ) );
		$message_body = '
			<h4>Запрос на онлайн-расчет стоимости кухни со следующими данными:</h4>
			<table cellspacing="0" style="width: 300px; height: 200px;">
				<tr>
					<th>Имя:</th><td>'.$name.'</td>
				</tr>
				<tr>
					<th>Тел:</th><td>'.$tel.'</td>
				</tr>
				<tr style="background-color: #e0e0e0;">
					<th>Email:</th><td>'.$email.'</td>
				</tr>
				<tr>
					<th>Описание проекта:</th><td>'.$message.'</td>
				</tr>
				<tr>
					<th>Тип кухни:</th><td>'.$type.'</td>
				</tr>
				<tr>
					<th>Длина стороны А, см:</th><td>'.$size1.'</td>
				</tr>
				<tr>
					<th>Длина стороны B, см:</th><td>'.$size2.'</td>
				</tr>
			</table>';
		
		$headers = "MIME-Version: 1.0" . "\r\n";
		$headers .= "Content-Type: text/html; charset=UTF-8" . "\r\n";
		$headers .= "From: КОМПАНИЯ МЕБЕЛЬГУД <" . $from_mail . ">" . "\r\n";
		$headers .= "Content-Transfer-Encoding: base64" . "\r\n"  . "\r\n"; 

		$message = chunk_split( base64_encode( $message_body ) );
		
		if( !empty( $_FILES[ 'inputFileCalc' ][ 'tmp_name' ] ) )
		{
			$filetype = $_FILES[ 'inputFileCalc' ][ 'type' ];
			$filename = $_FILES[ 'inputFileCalc' ][ 'name' ];
			
			if( move_uploaded_file( $_FILES[ 'inputFileCalc' ][ 'tmp_name' ], $path.$filename ) )
			{
				$file = $path.$filename;
				$handle = fopen( $file, "r" );
				if( !$handle ) { $status = 'err'; } 
				
				$content = fread( $handle, filesize( $file ) );
				fclose( $handle );

				$message .= "--" . $boundary . "--";
				$message .= "Content-Type: application/octet-stream; name='" . $filename . "'\r\n";
				$message .= "Content-Disposition: attachment; filename='" . $filename . "'\r\n";
				$message .= "\r\n"; 
				$message .= chunk_split( base64_encode( $content ) ); 
				$message .= "--" . $boundary . "--";
			}else{ die; }
		}

		mail( $to, $subject, $message, $headers );
...


Спасибо!
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
@galaxy
Если прямо так сильно хочется самому изобретать велосипед кодировать письмо в MIME, то стоит разобраться, как это правильно делать.

Заголовок Content-type - неверный. Body - тоже один из чанков, обрамляется в "--" . $boundary . "--";.

Вот прям совсем простой пример
Ответ написан
Ответы на вопрос 1
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы