2016-03-23 41 views
0

pdfファイルを送信する簡単な機能に問題があります - 電子メールは送信されますが、開こうとすると添付ファイルが壊れてしまいますので、何か問題でも。PHP破損することなくpdf添付ファイルを送信する方法

ご協力いただければ幸いです。

function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) { 

$file = $path.$filename; 

$file_size = filesize($file); 

$handle = fopen($file, "r"); 

$content = fread($handle, $file_size); 

fclose($handle); 

$content = chunk_split(base64_encode($content)); 

$uid = md5(uniqid(time())); 

$header = "From: ".$from_name." <".$from_mail.">\r\n"; 

$header .= "Reply-To: ".$replyto."\r\n"; 

$header .= "MIME-Version: 1.0\r\n"; 

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

$header .= "--".$uid."\r\n"; 

$header .= "Content-Type: application/octet-stream; name=\"attachment.pdf\"\r\n"; 

$header .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; 

$header .= $message."\r\n\r\n"; 

$header .= "--".$uid."\r\n"; 

$header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; 

$header .= "Content-Transfer-Encoding: base64\r\n"; 

$header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n"; 

$header .= $content."\r\n\r\n"; 

$header .= "--".$uid."--"; 






wp_mail($mailto, $subject, $message, $header); 


} 
+0

はありませんあなた自身のMIMEメールを作成してください。 phpmailerやswiftmailerのような適切なメールパッケージを使用してください。そのコードのほとんど全てを単一の '$ mail-> AddAttachment(...)'型呼び出しに還元します。 phpmailerでこの質問にタグを付けたので、なぜあなたはそれを使っていないのですか? –

答えて

1

電子メールヘッダーがかなりオフになっています。適切なマルチパートメッセージは次のようになります。

Content-Transfer-Encoding: binary 
Content-Type: multipart/mixed; boundary="_----------=_1458761739257530" 
MIME-Version: 1.0 
Date: xxxxx 
From: xxxxx 
To: xxxxx 
Reply-To: xxxx 
Subject: xxxx 

This is a multi-part message in MIME format. 

--_----------=_1458761739257530 
Content-Disposition: inline 
Content-Transfer-Encoding: 8bit 
Content-Type: text/plain 

This is the plain-text part of my message 
That's all. 

--_----------=_1458761739257530 
Content-Disposition: attachment; filename="myfile.pdf" 
Content-Transfer-Encoding: base64 
Content-Type: application/octet-stream; name="myfile.pdf" 

<base64 content here> 

--_----------=_1458761739257530-- 

をしかし、実際に、あなたはあなた自身のそのようなヘッダを生成してはならない - 混乱それをする方法はたくさんあります。代わりに、MIMEヘッダーを生成し、エンコーディングを行い、あなた宛てのメールを処理する既存のPHPライブラリをいくつでも使用してください。

たとえば、お使いのディストリビューションは、非常に高いPEARモジュール「メール」や「Mail_Mime」を含む、または他のあなたはpear install Mail Mail_Mime

で簡単にインストールすることができその後のようなものです:

function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) { 

    require_once('Mail.php'); 
    require_once('Mail/mime.php'); 

    $file = $path.$filename; 

    $headers = array (
     'From'  => $from_mail, 
     'To'  => $mailto, 
     'Reply-To' => $replyto, 
     'Subject' => $subject, 
    ); 

    $mime = new Mail_mime(array('eol' => "\n")); 

    $mime->SetTXTBody($message); 
    $mime->addAttachment($file, 'application/octet-stream'); 

    $mime_body = $mime->get(); 
    $mime_headers = $mime->headers($headers); 

    $mail =& Mail::factory('mail'); 
    $mail->send($mailto, $mime_headers, $mime_body); 

    if (PEAR::isError($mail)) { 
     echo("<p>ERROR:" . $mail->getMessage() . "</p>\n"); 
    } else { 
     echo("<p>Message successfully sent!</p>\n"); 
    } 
} 
関連する問題