Как отправить электронное письмо с прикрепленным резюме,
Я беру сниппет с этого места.
На этом сайте фрагмент отлично работает,
Даже я получил почту, но вложение не работает, я получаю оценку как noname с 0kb
файл размера, Что такое проблема в этом фрагменте,
function mail_attachment($to, $subject, $message, $from, $file) { // $file should include path and filename $filename = basename($file); $file_size = filesize($file); $content = chunk_split(base64_encode(file_get_contents($file))); $uid = md5(uniqid(time())); $from = str_replace(array("\r", "\n"), '', $from); // to prevent email injection $header = "From: ".$from."\r\n" ."MIME-Version: 1.0\r\n" ."Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n" ."This is a multi-part message in MIME format.\r\n" ."--".$uid."\r\n" ."Content-type:text/plain; charset=iso-8859-1\r\n" ."Content-Transfer-Encoding: 7bit\r\n\r\n" .$message."\r\n\r\n" ."--".$uid."\r\n" ."Content-Type: application/octet-stream; name=\"".$filename."\"\r\n" ."Content-Transfer-Encoding: base64\r\n" ."Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n" .$content."\r\n\r\n" ."--".$uid."--"; return mail($to, $subject, "", $header); }
Если вы НЕ пытаетесь научиться делать это вручную, и просто хотите отправить электронное письмо с вложением, тогда вам лучше использовать какую-то библиотеку для этого. Я рекомендую SwiftMailer , я пробовал много библиотек, и это работает лучше всего. Проверьте, как легко добавлять вложение с помощью SwiftMailer здесь: http://swiftmailer.org/docs/attaching-files
Лучше всего использовать библиотеку Mime Mail PEAR для обработки вложений. Это намного проще и чище, и вы будете менее склонны к ошибкам.
PEAR Mime Mail
Вы можете прикреплять файлы к электронной почте просто так:
$headers['From'] = 'from@domain.com'; $headers['To'] = 'to@domain.com'; $headers['Subject'] = 'Email Subject'; $mime = new Mail_mime("\r\n"); $mime->setTXTBody('Email text'); $mime->addAttachment($filedata, 'application/octet-stream', 'filename', true, 'base64'); //Prepare the message to be sent $body = $mime->get(); $headers = $mime->headers($headers); //Send the message via SMTP $mail_obj =& Mail::factory('smtp', array('host' => 'mail.domain.com', 'port' => 25)); $mail_obj->send($to, $headers, $body);
Если вы просто хотите отправить простую форму с одним вложением, этот код, вероятно, самый лучший и самый простой способ использовать следующий код, он работает хорошо.
function submitSupportTicket () {
if(isset($_POST['submit'])) { $company = $_POST['company']; $url = $_POST['url']; $issue = $_POST['issue']; $screenshot = basename($_FILES['screenshot']['name']); $fileType = substr($screenshot, strrpos($screenshot, '.') + 1); $fileSize = $_FILES['screenshot']['size']/1024; $allowedFileTypes = array("jpg", "jpeg", "gif", "bmp", 'png'); $allowedExt = false; for($i=0; $i<sizeof($allowedFileTypes); $i++) { if(strcasecmp($allowedFileTypes[$i],$fileType) == 0) { $allowedExt = true; } } if(!$allowedExt) { setMessage('The uploaded file is not supported file type. Only the following file types are supported: '.implode(',',$allowed_extensions), 0); header('Location: '.currentURL()); exit; } $filePath = 'mediaLibrary/attachments'.$screenshot; $tmpPath = $_FILES['screenshot']['tmp_name']; if(is_uploaded_file($tmpPath)) { if(!copy($tmpPath, $filePath)) { echo 'There was an error attaching the file.'; exit; } } $attachment = chunk_split(base64_encode(file_get_contents($_FILES['screenshot']['tmp_name']))); $fileName = $_FILES['screenshot']['name']; $boundary = md5(date('r', time())); $headers = "From: noreply@minttwist.com\r\nReply-To: justin@minttwist.com"; $headers .= "\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"_1_$boundary\""; $message = "This is a multi-part message in MIME format. --_1_$boundary Content-Type: multipart/alternative; boundary=\"_2_$boundary\" --_2_$boundary Content-Type: text/plain; charset=\"iso-8859-1\" Content-Transfer-Encoding: 7bit Company: $company URL: $url Issue: $issue Submitted from minttwist.com --_2_$boundary-- --_1_$boundary Content-Type: application/octet-stream; name=\"$filename\" Content-Transfer-Encoding: base64 Content-Disposition: attachment $attachment --_1_$boundary--"; $to = 'your@email.com'; $subject = 'Support Request - '.$company; mail($to, $subject, $message, $headers); echo 'We have received your support request.'; header('Location: '.currentURL()); } }
Я не видел ответа на ваш вопрос где-то выше, поэтому я попытаюсь предоставить немного больше информации, которая могла бы помочь.
У меня была такая же точная проблема только сегодня. Я построил ряд PDF-файлов, которые затем были преобразованы в один файл tar.gz и этот пакет файлов, который я хотел отправить электронному агенту по обработке данных, который будет реагировать на эти документы в натуральной форме. Однако, когда я использовал различные сценарии для создания правильного формата сообщений MIME, я в итоге отправил вложение, размер которого составлял 0 kB, с именем «noname» .
С таким количеством людей, которые дали один и тот же ответ, я подумал, что ответы должны быть правильными и что проблема должна быть где-то в другом месте. Ответ на проблему заключается не в форматировании содержимого сообщения , а в заголовках. Все там правильно. Проблема заключается в почтовых приложениях, которые существуют между вашим приложением и адресом электронной почты получателя.
Я переместил свой код на производственный сервер, и сообщение отправлено без каких-либо проблем, и тот же файл, который ранее был отправлен как «noname 0kb», теперь был отправлен как «MikeyPoochigian_2013_05_10__16_28_27.tar.gz 241kb».
Я еще не знаю, что вызывает этот конкретный сбой, но я думаю, что это аналогичный ответ тому, который я узнал в начале этого года, когда мое почтовое приложение отправляло в gmail, но не отправляло на другие почтовые серверы. В этом конкретном случае почтовые приложения фильтровали контент для СПАМ между моим ноутбуком разработки (который имел внутренний домен DevelopmentLaptop.local) и конечным адресом электронной почты. Поскольку мой исходный сервер отправлен из домена «DovelopmentLaptop.local», и поскольку этот домен не был зарегистрирован ни в одном DNS, как в известном адресе, эти почтовые серверы интерпретировали мои тестовые сообщения как спам. Я подозреваю, что одна и та же проблема мешает теперь отправляемым сообщениям.
Длинный ответ теперь короткий (если это возможно), попробуйте портировать свой код на производственный сервер с зарегистрированным общедоступным доменом и посмотреть, работает ли он. Если это так, то это не ваш код, который необходимо исправлять. Вероятно, ваш код будет в порядке.