Вложение электронной почты php отправляет пустой файл

Я пытаюсь отправить вложение по электронной почте, но, несмотря на то, что нужный файл сохранен на сервере, тот, который прикреплен к письму, пуст (0 кб).

Я использую Gmail для отправки писем.

Вот соответствующая часть моего кода:

if (empty($error)) {
//boundary
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x$semi_randx";
//tell the headers about the boundary
$header .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"$mime_boundary\"";
//define the first part of the email, which is the text part
$message = "\r\n" . "--$mime_boundary\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\r\n" ;
//build the body of the 1st part of the email
$content_body = "Email del formulario de contacto en  ".home_url().": <br />

//whatever

";
$message .= $content_body . "\r\n";
$message .= "--$mime_boundary\n";
//define the second part of the email, which is the atachments
//if a file has been uploaded
if (!empty($_FILES['cv']['name'])){

// Open the file for a binary read
$file = fopen($temp_name,'rb');
// Read the file content into a variable
$data = fread($file,filesize($temp_name));
// close the file
fclose($file);
// Now we need to encode it and split it into acceptable length lines
$data = chunk_split(base64_encode($data));

// Actually build the second part of the email$message .= "Content-Type: \"application/octet-stream\";\r\n name=\"" . $file_name . "\"\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "Content-Disposition: attachment;\r\n filename=\"" . $file . "\"\r\n\r\n";
$message .= $data; //The base64 encoded message
$message .= "\n";
$message .= "--$mime_boundary--\n";

}//send th email
mail( $receive_email, "Email del formulario de contacto en web", $message, $header);
$msg  = $succesful_text;
}

Я предполагаю, что я делаю что-то не так здесь:

 $message .= "Content-Type: \"application/octet-stream\";\r\n name=\"" . $file_name . "\"\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "Content-Disposition: attachment;\r\n filename=\"" . $file . "\"\r\n\r\n";
$message .= $data; //The base64 encoded message
$message .= "\n";
$message .= "--$mime_boundary--\n";

Но я понятия не имею, что это может быть.

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

Любая помощь будет высоко оценена.

Соня

0

Решение

Спасибо Черри и miken32 за ваши ответы.
Наконец я понял это.

Это то, что произошло, если это может помочь кому-то еще в будущем.

Поскольку в текстовом сообщении не было данных в кодировке base64, я подумал, что проблема может заключаться не в тексте $ message, а в фактической обработке файла.

// Open the file for a binary read
$file = fopen($temp_name,'rb');
// Read the file content into a variable
$data = fread($file,filesize($temp_name));
// close the file
fclose($file);
// Now we need to encode it and split it into acceptable length lines
$data = chunk_split(base64_encode($data));

Я понял, что временный файл не открывается. Я не мог понять, почему, но я решил это, обработав файл непосредственно из папки загрузки.
Вот фиксированный код:

// Open the file for a binary read
$file = fopen($server_file,'rb');
// Read the file content into a variable
$flsz=filesize($server_file);
$data = fread($file,$flsz);
// close the file
fclose($file);
// Now we need to encode it and split it into acceptable length lines
$data = chunk_split(base64_encode($data));

Мне также пришлось изменить имя файла в тексте $ message, используя $ file_name вместо $ file потому что $ file.

$message .= "Content-Disposition: attachment;\r\n filename=\"" . $file_name . "\"\r\n\r\n";
0

Другие решения

Других решений пока нет …