php发送带附件的电子邮件

时间:2011-01-03 17:09:37

标签: php

如何发送包含简历附件的电子邮件

我从这个地方获取片段Click here

在此网站中,代码段工作正常,

即使我收到了邮件,但附件无法正常工作,正在以0kb的身份获得赞美

尺寸文件,该代码段中的问题是什么

5 个答案:

答案 0 :(得分:39)

 function mail_attachment($to, $subject, $message, $from, $file) {
  // $file should include path and filename
  $filename = basename($file);
  $file_size = filesize($file);
  $content = chunk_split(base64_encode(file_get_contents($file))); 
  $uid = md5(uniqid(time()));
  $from = str_replace(array("\r", "\n"), '', $from); // to prevent email injection
  $header = "From: ".$from."\r\n"
      ."MIME-Version: 1.0\r\n"
      ."Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n"
      ."This is a multi-part message in MIME format.\r\n" 
      ."--".$uid."\r\n"
      ."Content-type:text/plain; charset=iso-8859-1\r\n"
      ."Content-Transfer-Encoding: 7bit\r\n\r\n"
      .$message."\r\n\r\n"
      ."--".$uid."\r\n"
      ."Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"
      ."Content-Transfer-Encoding: base64\r\n"
      ."Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n"
      .$content."\r\n\r\n"
      ."--".$uid."--"; 
  return mail($to, $subject, "", $header);
 }

答案 1 :(得分:4)

如果您不想手动学习如何操作,并且只想发送带附件的电子邮件,那么您最好使用某种类型的库。我推荐SwiftMailer,我尝试了很多库,这个最好用。检查使用SwiftMailer添加附件是多么容易:http://swiftmailer.org/docs/attaching-files

答案 2 :(得分:3)

您最好的选择是使用Mime Mail PEAR库来处理附件。它更容易,更清洁,你也不会容易出错。

PEAR Mime Mail

您可以将文件附加到电子邮件中,如下所示:

$headers['From'] = 'from@domain.com';
$headers['To'] = 'to@domain.com';
$headers['Subject'] = 'Email Subject';

$mime = new Mail_mime("\r\n");
$mime->setTXTBody('Email text');
$mime->addAttachment($filedata, 'application/octet-stream', 'filename', true, 'base64');

//Prepare the message to be sent
$body = $mime->get();
$headers = $mime->headers($headers);

//Send the message via SMTP
$mail_obj =& Mail::factory('smtp', array('host' => 'mail.domain.com', 'port' => 25));
$mail_obj->send($to, $headers, $body);

答案 3 :(得分:0)

如果您只想发送一个包含单个附件的简单表单,则此代码可能是最好和最简单的方法,它可以使用以下代码。

function submitSupportTicket() {

if(isset($_POST['submit']))
{

    $company = $_POST['company'];
    $url = $_POST['url'];
    $issue = $_POST['issue'];

    $screenshot = basename($_FILES['screenshot']['name']);

    $fileType = substr($screenshot, strrpos($screenshot, '.') + 1);

    $fileSize = $_FILES['screenshot']['size']/1024;

    $allowedFileTypes = array("jpg", "jpeg", "gif", "bmp", 'png');

    $allowedExt = false;

    for($i=0; $i<sizeof($allowedFileTypes); $i++)
    {

        if(strcasecmp($allowedFileTypes[$i],$fileType) == 0)
        {

            $allowedExt = true;

        }

    }

    if(!$allowedExt)
    {

        setMessage('The uploaded file is not supported file type. Only the following file types are supported: '.implode(',',$allowed_extensions), 0);
        header('Location: '.currentURL());
        exit;

    }

    $filePath = 'mediaLibrary/attachments'.$screenshot;

    $tmpPath = $_FILES['screenshot']['tmp_name'];

    if(is_uploaded_file($tmpPath))
    {

        if(!copy($tmpPath, $filePath))
        {

            echo 'There was an error attaching the file.';
            exit;

        }

    }

    $attachment = chunk_split(base64_encode(file_get_contents($_FILES['screenshot']['tmp_name'])));

    $fileName = $_FILES['screenshot']['name'];

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



    $headers = "From: noreply@minttwist.com\r\nReply-To: justin@minttwist.com";
        $headers .= "\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"_1_$boundary\"";

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

--_1_$boundary
Content-Type: multipart/alternative; boundary=\"_2_$boundary\"

--_2_$boundary
Content-Type: text/plain; charset=\"iso-8859-1\"
Content-Transfer-Encoding: 7bit

Company: $company
URL: $url
Issue: $issue

Submitted from minttwist.com

--_2_$boundary--
--_1_$boundary
Content-Type: application/octet-stream; name=\"$filename\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

$attachment
--_1_$boundary--";

    $to = 'your@email.com';

    $subject = 'Support Request - '.$company;

    mail($to, $subject, $message, $headers);

    echo 'We have received your support request.';

    header('Location: '.currentURL());

}

}

答案 4 :(得分:-1)

我在上面的任何地方都没有看到你问题的答案,所以我会尝试提供一些可能有用的信息。

我今天遇到了同样的问题。我构建了一系列PDF文件,然后将其转换为单个tar.gz文件,我希望通过电子邮件将此文件包发送给人工处理代理,后者将以实物形式回复这些文档。但是,当我使用各种脚本生成正确的MIME邮件格式时,我最终发送了一个总数 0 kB的附件,名称为“noname”

有这么多人提供相同的答案,我心里想,答案一定是正确的,问题必须在其他地方。问题的答案不是邮件内容的格式,也不在标题中。那里的一切都是正确的。问题在于应用程序和收件人电子邮件地址之间存在的邮件应用程序。

我将代码移动到生产服务器并且发送的消息没有任何问题,之前作为“noname 0kb”发送的文件现在被发送为“MikeyPoochigian_2013_05_10__16_28_27.tar.gz 241kb”。

我还不知道是什么导致了这个特定的失败,但我想这是我今年早些时候在我的邮件应用程序发送到gmail但没有发送到其他邮件服务器时所学到的类似答案。在该特定情况下,邮件应用程序在我的开发笔记本电脑(具有DevelopmentLaptop.local的内部域)和最终电子邮件地址之间过滤SPAM的内容。因为我的原始服务器是从域“DovelopmentLaptop.local”发送的,并且因为该域未在任何DNS中注册为已知地址,所以这些邮件服务器将我的测试邮件解释为垃圾邮件。我怀疑同样的问题正在干扰正在发送的消息。

现在很长的答案(如果可能的话),尝试将代码移植到具有注册公共域的生产服务器,看看它是否有效。如果是,那么不是您的代码需要修复。您的代码可能没问题。