PHP скрипт массовой почты показывает дополнительный файл в Outlook - PullRequest
0 голосов
/ 19 августа 2011

Я использую PHP-скрипт для отправки электронной почты с несколькими вложениями, он отлично работает для gmail, но в Microsoft Outlook я также вижу пустой файл ATT00010.txt (случайные числа.) В качестве вложения.И когда я отправляю электронную почту из outlook с несколькими вложениями, она не показывает никакого файла, подобного этому.

Я выводил вывод из сценария электронной почты, и такого кода в коде нет.Может кто-нибудь сказать мне, как удалить этот файл из Outlook?

Сценарий электронной почты ниже.

// array with filenames to be sent as attachment
$files = array("file_1.ext","file_2.ext","file_3.ext",......);

// email fields: to, from, subject, and so on
$to = "mail@mail.com";
$from = "mail@mail.com"; 
$subject ="My subject"; 
$message = "My message";
$headers = "From: $from";

// boundary 
$semi_rand = md5(time()); 
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 

// headers for attachment 
$headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; 

// multipart boundary 
$message = "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; 
$message .= "--{$mime_boundary}\n";

// preparing attachments
for($x=0;$x<count($files);$x++){
    $file = fopen($files[$x],"rb");
    $data = fread($file,filesize($files[$x]));
    fclose($file);
    $data = chunk_split(base64_encode($data));
    $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$files[$x]\"\n" . 
    "Content-Disposition: attachment;\n" . " filename=\"$files[$x]\"\n" . 
    "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
    $message .= "--{$mime_boundary}\n";
}

// send

$ok = @mail($to, $subject, $message, $headers); 
if ($ok) { 
    echo "<p>mail sent to $to!</p>"; 
} else { 
    echo "<p>mail could not be sent!</p>"; 
} 

Ответы [ 3 ]

0 голосов
/ 19 августа 2011

Если вы хотите использовать что-то более легкое и отправлять вложения, попробуйте Swift Mailer.(swiftmailer.org) Я использовал его в своих проектах, и он отлично работает.

Вот пример:

$message = Swift_Message::newInstance()
  ->setSubject('Webinar Registration')
  ->setFrom(array('replyto@example.org' => 'From Name'))
  ->setTo(array('destination@example.org'))
  ->setBody($MESSAGE_TEXT)
  ;

$message->attach(Swift_Attachment::fromPath('SOME_FILE_PATH'));
$transport = Swift_SmtpTransport::newInstance('127.0.0.1', 25);
$mailer = Swift_Mailer::newInstance($transport);
$result = $mailer->send($message);

Только мои два цента.

В противном случаеЯ собирался упомянуть, что кто-то другой уже избил меня - проверь границы.

0 голосов
/ 19 августа 2011

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

Решение простое, просто замените последнюю часть на

    if ($x == count($files)-1) 
        $message .= "--{$mime_boundary}--\r\n";
    else
        $message .= "--{$mime_boundary}\n";

не нужно

если вы просто положите - он будет использовать его много раз внутри цикла, если IF проверяет, является ли это последним циклом.

0 голосов
/ 19 августа 2011

Граница последняя в сообщении multipart/* должна содержать -- с добавлением в конце , в дополнение к тому, что имеют все остальные границы. Потребитель может использовать это для распознавания конца сообщения.

Очевидно, что Outlook рассматривает отсутствие правильного окончания как указание на то, что сообщение было усечено, а затем делает все возможное, чтобы отобразить все, что оно получило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...