2009-09-17 4 views
1

Я борется с попыткой отправить электронное письмо с вложением с помощью PHP. Он работал, но тело сообщения было скремблировано. Теперь у меня есть тело сообщения, но вложение развращает. Я использовал кодировку base64 для тела сообщения, но теперь использую 7 бит. Может ли кто-нибудь сказать мне, что я делаю неправильно?Вложение PHP mail() повреждено

PS Пожалуйста, не говорите мне, что я должен использовать готовый класс для этого. Я попробовал несколько, и все они не работали. Если я не преодолю эти проблемы, я никогда не узнаю, как это сделать правильно. Благодаря

//define the receiver of the email 
$to = '[email protected]'; 
//define the subject of the email 
$subject = 'Your Disneyland Paris entry'; 
//create a boundary string. It must be unique 
//so we use the MD5 algorithm to generate a random hash 
$random_hash = md5(date('r', time())); 
//define the headers we want passed. Note that they are separated with \n 
$mime_boundary = "<<<--==+X[".md5(time())."]"; 

$path = $_SERVER['DOCUMENT_ROOT'].'/two/php/'; 
$fileContent = chunk_split(base64_encode(file_get_contents($path.'CTF_brochure.pdf'))); 


$headers .= "From: [email protected] <[email protected]>"."\n"; 

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

$message = "This is a multi-part message in MIME format.\n"; 

$message .= "\n"; 
$message .= "--".$mime_boundary."\n"; 

$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n"; 
$message .= "Content-Transfer-Encoding: 7bit\n"; 
$message .= "\n"; 
$message .= "messagebody \n"; 
$message .= "--".$mime_boundary."" . "\n"; 

$message .= "Content-Type: application/octet-stream;\n"; 
$message .= " name=\"CTF-brochure.pdf\"" . "\n"; 
$message .= "Content-Transfer-Encoding: 7bit \n"; 
$message .= "Content-Disposition: attachment;\n"; 
$message .= " filename=\"CTF_brochure.pdf\"\n"; 
$message .= "\n"; 
$message .= $fileContent; 
$message .= "\n"; 
$message .= "--".$mime_boundary."--\n"; 

//send the email 
$mail_sent = mail($to, $subject, $message, $headers); 
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" 
echo $mail_sent ? "Mail sent" : "Mail failed"; 
+3

Понятно, что вы хотите сделать это самостоятельно, но вы не будете многому научиться, кроме как просто понять, как правильно закодировать почту ... :) Если бы я чему-то научился, я бы переехал на интересные части моего проекта, не изобретая колесо ... – Palantir

+0

спасибо за совет. это единственный бит проекта, который нужно разобраться. :) – Drew

ответ

1

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

7

Я мог бы быть неправильно, но я полагаю, вам придется кодировать PDF каким-то образом, 7bit не будет работать как файл PDF будет иметь содержание вне диапазона. Почему бы не использовать base64 для PDF?

+0

спасибо. Я только что дал ему ход и никаких изменений. – Drew

+0

Какой код конкретно вы изменили? Вы пробовали кодировку base64 всего сообщения или просто вложения? Как выглядели заголовки MIME после внесения изменений? – Josh

+0

Я только что внес изменения в приложение. Если i base64 все сообщение, я получаю странные символы как тело сообщения – Drew

1

Я знаю, что вы говорили о заранее подготовленных классах, но есть причина, по которой люди это делают - зачем изобретать колесо? Я использую SwiftMailer для проектов - это не может быть проще. См. this SwiftMailer example для 13 строк (включая некоторые пустые) о том, как создать сообщение, добавить вложение и отправить.

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

+0

Я попробовал swiftmailer для этого, но он отказался работать. сервер, на котором он настроен, очень дергается – Drew