【问题标题】:Send multiple attachments with php用php发送多个附件
【发布时间】:2015-10-01 12:46:39
【问题描述】:

我有一个表单可以通过 php 成功将上传的图片作为附件发送,但我无法让它发送多个附件。

html:

<input id="file-3" type="file" name="image" multiple="true" required>

附加单个文件的php:

if (isset($email) && isset($name)) {
$to = "email@email.com"; /* <= Change this Email ID to yours */
$subject = "$name sent you a message"; /* <= Change the Subject If you want */
$random_hash = md5(date('r', time())); 

$headers = "From: $email\r\nReply-To: $email"; 
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";

$attachment = null;
if ( isset($_FILES["photo"]) ) {
     $attachment = chunk_split(base64_encode(file_get_contents($_FILES["photo"]["tmp_name"])));
} 

$message = "--PHP-mixed-" . $random_hash . "\r\n";
$message .= "Content-Type: multipart/alternative; boundary=\"PHP-alt-" . $random_hash . "\"\r\n\r\n";
$message .= "--PHP-alt-" . $random_hash . "\r\n";
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\nContent-Transfer-Encoding: 7bit\r\n\r\n";
$message .= "Name: " . $name . "\r\nEmail: " . $email . "Message: " . $textarea . "\r\n\r\n";
$message .= "--PHP-alt-" . $random_hash . "\r\n";
$message .= "Content-Type: text/html; charset=\"iso-8859-1\"\t\nContent-Transfer-Encoding: 7bit\r\n\r\n";
$message .= "";
if ( $attachment != null ) {
    $message .= "--PHP-mixed-" . $random_hash . "\r\n";
    $message .= "Content-Type: " . $_FILES["photo"]["type"] . "; name=\"" . $_FILES["photo"]["name"] . "\"\r\n";
    $message .= "Content-Transfer-Encoding: base64\r\n";
    $message .= "Content-Disposition: attachment\r\n\r\n";
    $message .= $attachment;
    $message .= "\r\n\r\n--PHP-mixed-" . $random_hash . "\r\n";

}

我有一个使用 ajax 提交表单的 JS 文件,但我认为它与此问题无关。

感谢您的帮助!我是 php 新手。

【问题讨论】:

  • 您是否考虑过使用像SwiftMailer 这样的第三方库?
  • @sandeepsure 这一切都取决于 OP 通过“使用 ajax 提交”的含义。 JS 绝对可以提交带有文件输入的表单。看看 JS 代码以确保那里没有任何奇怪的东西会很方便。

标签: javascript php ajax forms email-attachments


【解决方案1】:

参考这个http://www.codexworld.com/send-html-email-multiple-attachments-php/

function multi_attach_mail($to, $subject, $message, $senderMail, $senderName, $files){

    $from = $senderName." <".$senderMail.">"; 
    $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 = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" .
    "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; 

    // preparing attachments
    if(count($files) > 0){
        for($i=0;$i<count($files);$i++){
            if(is_file($files[$i])){
                $message .= "--{$mime_boundary}\n";
                $fp =    @fopen($files[$i],"rb");
                $data =  @fread($fp,filesize($files[$i]));

                @fclose($fp);
                $data = chunk_split(base64_encode($data));
                $message .= "Content-Type: application/octet-stream; name=\"".basename($files[$i])."\"\n" . 
                "Content-Description: ".basename($files[$i])."\n" .
                "Content-Disposition: attachment;\n" . " filename=\"".basename($files[$i])."\"; size=".filesize($files[$i]).";\n" . 
                "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
            }
        }
    }

    $message .= "--{$mime_boundary}--";
    $returnpath = "-f" . $senderMail;

    //send email
    $mail = @mail($to, $subject, $message, $headers, $returnpath); 

    //function return true, if email sent, otherwise return fasle
    if($mail){ return TRUE; } else { return FALSE; }

}

//email variables
$to = 'receiver email id';
$from = 'info@codexworld.com';
$from_name = 'CodexWorld';

//attachment files path array
$files = array('screencapture-www-codexworld-com.png','Send_Email_with_pdf_attachment_in_PHP.docx');
$subject = 'PHP Email with multiple attachments by CodexWorld'; 
$html_content = '<h1>PHP Email with multiple attachments by CodexWorld</h1>
            <p><b>Total Attachments : </b>'.count($files).' attachments</p>';

//call multi_attach_mail() function and pass the required arguments
$send_email = multi_attach_mail($to,$subject,$html_content,$from,$from_name,$files);

//print message after email sent
echo $send_email?"<h1> Mail Sent</h1>":"<h1> Mail not SEND</h1>";

【讨论】:

  • 您确定此代码适用于 ajax 表单提交吗?
  • 抱歉混淆了... Ajax 没有提交表单。
  • @Ninju 你知道我会在 $files 数组中放什么吗?
  • 只需将 $_FILES["photo"]["tmp_name"] 传递给 $files 数组即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 2011-03-24
  • 2017-08-08
相关资源
最近更新 更多