php 使用php发送带附件的电子邮件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8431327/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-26 04:41:12  来源:igfitidea点击:

send email with attachment using php

phpemailattachment

提问by sahar

I used this code to send email with attachment using php, but there is something error in the attachment since I receive an email and the attachment appears in the content. before I use the same code and it worked successfully. why???

我使用此代码使用 php 发送带有附件的电子邮件,但是由于我收到一封电子邮件并且附件出现在内容中,因此附件中有一些错误。在我使用相同的代码并成功运行之前。为什么???

<?php
// sending email with attachments

    function sendEmail($to,$from,$file,$ext){

      $to = "[email protected]";
     $from = "[email protected]";
      $subject = "Translation Request";

  $random_hash = md5(date('r', time()));

  $headers = "From: [email protected]\r\nReply-To: [email protected]";

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

  $attachment = chunk_split(base64_encode(file_get_contents("Test.doc")));

  $output = "
        --PHP-mixed-$random_hash;
        Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash'
        --PHP-alt-$random_hash
        Content-Type: text/plain; charset='iso-8859-1'
        Content-Transfer-Encoding: 7bit

        Hello World!
        This is the simple text version of the email message.

        --PHP-alt-$random_hash
        Content-Type: text/html; charset='iso-8859-1'
        Content-Transfer-Encoding: 7bit

        <h2>Hello World!</h2>
        <p>This is the <b>HTML</b> version of the email message.</p>

        --PHP-alt-$random_hash--

        --PHP-mixed-$random_hash
        Content-Type: application/doc; name=Test.doc
        Content-Transfer-Encoding: base64
        Content-Disposition: attachment

        $attachment
        --PHP-mixed-$random_hash--";
      $send =  @mail($to, $subject, $output, $headers);
  return $send;
  }
?>

please help.

请帮忙。

回答by wiitohzjeh

for what reason no use phpmailer? example for an attachment:

什么原因不使用phpmailer?附件示例:

function mandaMail ($nombredest, $maildest, $asunto, $cuerpo) {
require_once("mailer/class.phpmailer.php");
$mail = new PHPMailer(true);
$mail->IsSMTP();

try {
    $mail->Host = "xxxx"; $mail->Port = 25; // smtp server
    $mail->SMTPAuth = true;
    $mail->Username = "xxxx"; // smtp username
    $mail->Password = "xxxx"; // smtp pass
    $mail->AddReplyTo("xxxx", "xxxx"); // email & name
    $mail->SetFrom("xxxx", "xxxx"); // similar to up value

    $mail->AddAddress($maildest, $nombredest);
    $mail->Subject = $asunto;
    $mail->MsgHTML(file_get_contents($cuerpo));

    $mail->AddAttachment("xxxx", "xxxx"); // attachments directory, attachment name (ie: dir/blah.jpg, blah.jpg)
    $mail->Send();

} catch (phpmailerException $e) { echo $e->errorMessage();
} catch (Exception $e) { echo $e->getMessage(); }

回答by Bojangles

You can either do it the way thistutorial describes, or you can use one of the PEARmodules to send an email with an attachment the way thistutorial describes.

您可以按照教程所述的方式进行操作,也可以使用PEAR模块之一按照教程所述的方式发送带有附件的电子邮件。

Using PEAR is probably a better option as it's easier to do. The only caveat is that PEAR isn't available on all hosts.

使用 PEAR 可能是更好的选择,因为它更容易做到。唯一的警告是 PEAR 并非在所有主机上都可用。

回答by Mohit Bumb

I'm using this :

我正在使用这个:

function attachfile($file, $type = "application/octetstream")  {
    if(!($fd = fopen($file, "r"))) {
      $this->errstr = "Error opening $file for reading.";
      return 0;
    }
    $_buf = fread($fd, filesize($file));
    fclose($fd);

    $fname = $file;
    for($x = strlen($file); $x > 0; $x--)
      if($file[$x] == "/")
        $fname = substr($file, $x, strlen($file) - $x);

    // Convert to base64 becuase mail attachments are not binary safe.
    $_buf = chunk_split(base64_encode($_buf));

    $this->attachments[$file] = "\n--" . $this->boundary . "\n";
    $this->attachments[$file] .= "Content-Type: $type; name=\"$fname\"\n";
    $this->attachments[$file] .= "Content-Transfer-Encoding: base64\n";
    $this->attachments[$file] .= "Content-Disposition: attachment; " .
                                     "filename=\"$fname\"\n\n";
    $this->attachments[$file] .= $_buf;

    return 1;
  }

回答by Mohammad Ardika Rifqi

Your code wont be work, because email doesnt support whitespaces.

您的代码将无法使用,因为电子邮件不支持空格

  $output = "
       --PHP-mixed-$random_hash;
       Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash'
       --PHP-alt-$random_hash
       Content-Type: text/plain; charset='iso-8859-1'
       Content-Transfer-Encoding: 7bit
  $output = "
       --PHP-mixed-$random_hash;
       Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash'
       --PHP-alt-$random_hash
       Content-Type: text/plain; charset='iso-8859-1'
       Content-Transfer-Encoding: 7bit

You must use without whitespaces

您必须使用没有空格

 $output = "
 --PHP-mixed-$random_hash;
 Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash'
 --PHP-alt-$random_hash
 Content-Type: text/plain; charset='iso-8859-1'
 Content-Transfer-Encoding: 7bit
 $output = "
 --PHP-mixed-$random_hash;
 Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash'
 --PHP-alt-$random_hash
 Content-Type: text/plain; charset='iso-8859-1'
 Content-Transfer-Encoding: 7bit

回答by Manoj Balakonda

I am using this and ( with out using PHPMailer), Hope this is helpful to you.

我正在使用这个和(不使用PHPMailer),希望这对你有帮助。

<form enctype="multipart/form-data" method="POST" action="">
    <label>Your Name <input type="text" name="sender_name" /> </label> <br>
    <label>Your Email <input type="email" name="sender_email" /> </label> <br>
    <label>Subject <input type="text" name="subject" /> </label> <br>
    <label>Message <textarea name="message"></textarea> </label> <br>
    <label>Attachment <input type="file" name="my_file" /></label><br>
    <label><input type="submit" name="button" value="Submit" /></label>
</form>

<?php 
echo "<pre>";print_r($_REQUEST);echo "</pre>"; //comment this line
echo "<pre>";print_r($_FILES);echo "</pre>"; //comment this line
if($_POST && isset($_FILES['my_file']))
{

    $from_email         = 'noreply@your_domain.com'; //from mail, it is mandatory with some hosts
    $recipient_email    = '[email protected]'; //recipient email (most cases it is your personal email)

    //Capture POST data from HTML form and Sanitize them, 
    $sender_name    = filter_var($_POST["sender_name"], FILTER_SANITIZE_STRING); //sender name
    $reply_to_email = filter_var($_POST["sender_email"], FILTER_SANITIZE_STRING); //sender email used in "reply-to" header
    $subject        = filter_var($_POST["subject"], FILTER_SANITIZE_STRING); //get subject from HTML form
    //$message        = filter_var($_POST["message"], FILTER_SANITIZE_STRING); //message
    $message        = "Name : ".$sender_name."\nMessage : ".$_POST["message"]; //message

    //Get uploaded file data
    $file_tmp_name    = $_FILES['my_file']['tmp_name'];
    $file_name        = $_FILES['my_file']['name'];
    $file_size        = $_FILES['my_file']['size'];
    $file_type        = $_FILES['my_file']['type'];
    $file_error       = $_FILES['my_file']['error'];

    if($file_error > 0)
    {
        die('Upload error or No files uploaded');
    }
    //read from the uploaded file & base64_encode content for the mail
    $handle = fopen($file_tmp_name, "r");
    $content = fread($handle, $file_size);
    fclose($handle);
    $encoded_content = chunk_split(base64_encode($content));

        $boundary = md5("sanwebe");
        //headers
        $headers = "MIME-Version: 1.0\r\n"; 
        $headers .= "From:".$from_email."\r\n"; 
        $headers .= "Reply-To: ".$reply_to_email."" . "\r\n";
        $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; 

        //body plain text 
        $body = "--$boundary\r\n";
        $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
        $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
        $body .= chunk_split(base64_encode($message)); 

        //attachment file
        $body .= "--$boundary\r\n";
        $body .="Content-Type: $file_type; name=".$file_name."\r\n";
        $body .="Content-Disposition: attachment; filename=".$file_name."\r\n";
        $body .="Content-Transfer-Encoding: base64\r\n";
        $body .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n"; 
        $body .= $encoded_content; 
    $sentMail = @mail($recipient_email, $subject, $body, $headers);
    if($sentMail) //output success or failure messages
    {       
        die('Thank you for your email');
    }else{
        die('Could not send mail!');  
    }
}
?>