Php отправить электронное письмо со вложением

Как отправить электронное письмо с прикреплением резюме,

Я беру фрагмент из этого места Нажмите здесь

На этом сайте фрагмент отлично работает,

Даже я получил почту, но приложение не работает, я получаю подтверждение как noname с 0kb

файл размера, Что является проблемой в этом фрагменте,

Ответ 1

 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);
 }

Ответ 2

Если вы НЕ пытаетесь научиться делать это вручную, и просто хотите отправить электронное письмо с вложением, тогда вам лучше использовать какую-то библиотеку для этого. Я рекомендую SwiftMailer, я пробовал много библиотек, и этот работает лучше всего. Проверьте, как легко добавлять вложение с помощью SwiftMailer здесь: http://swiftmailer.org/docs/attaching-files

Ответ 3

Лучше всего использовать библиотеку MIME Mail PEAR для обработки вложений. Это намного проще и чище, и вы будете менее склонны к ошибкам.

PEAR Mime Mail

Вы можете прикреплять файлы к электронной почте просто так:

$headers['From'] = '[email protected]';
$headers['To'] = '[email protected]';
$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);

Ответ 4

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

функция 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: [email protected]\r\nReply-To: [email protected]";
        $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 = '[email protected]';

    $subject = 'Support Request - '.$company;

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

    echo 'We have received your support request.';

    header('Location: '.currentURL());

}

}

Ответ 5

Я не видел ответа на ваш вопрос где-то выше, поэтому я попытаюсь предоставить немного больше информации, которая могла бы помочь.

У меня была такая же точная проблема только сегодня. Я построил ряд 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, как в известном адресе, эти почтовые серверы интерпретировали мои тестовые сообщения как спам. Я подозреваю, что одна и та же проблема мешает теперь отправляемым сообщениям.

Длинный ответ теперь короткий (если это возможно), попробуйте портировать свой код на производственный сервер с зарегистрированным общедоступным доменом и посмотреть, работает ли он. Если это так, то вам не нужно исправлять не ваш код. Ваш код, вероятно, будет в порядке.