尝试发送带附件的邮件

时间:2013-02-26 12:35:16

标签: php image email attachment

我制作了一个将图片上传到上传文件夹的表单。但现在我需要将图像邮寄到附件中。我试过这个

$Body .= "http://myurl.nl/upload/" . $filename . "";

实际上,只要图像可以直接从我的服务器下载,图像是否在附件中并不重要。所以现在我正在使用文件的路径

$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 10000000)
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

if (file_exists("upload/" . $_FILES["file"]["name"]))
  {
  echo $_FILES["file"]["name"] . " already exists. ";
  }
else
  {
  $filename = str_replace(' ', '', $_FILES["file"]["tmp_name"]);
  move_uploaded_file($_FILES["file"]["tmp_name"],
  "upload/" . $filename);
  echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
  }
  }
 }
else
 {
 echo "Invalid file";
 }

4 个答案:

答案 0 :(得分:2)

我使用Swiftmailer并使用以下方法: http://swiftmailer.org/docs/messages.html#attaching-files

<?php

require_once 'lib/swift_required.php';

// Create the message
$message = Swift_Message::newInstance()

  // Give the message a subject
  ->setSubject('Your subject')

  // Set the From address with an associative array
  ->setFrom(array('john@doe.com' => 'John Doe'))

  // Set the To addresses with an associative array
  ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))

  // Give it a body
  ->setBody('Here is the message itself', 'text/html')

  // You can attach files from a URL if allow_url_fopen is on in php.ini
  ->attach(Swift_Attachment::fromPath('my-document.pdf'));

// If you have SMPT, use the SMTP transport(http://swiftmailer.org/docs/sending.html#using-the-smtp-transport)
// Create the Transport
$transport = Swift_MailTransport::newInstance();

// Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);

// Send the message
$numSent = $mailer->send($message);

printf("Sent %d messages\n", $numSent);

/* Note that often that only the boolean equivalent of the
   return value is of concern (zero indicates FALSE)

if ($mailer->send($message))
{
  echo "Sent\n";
}
else
{
  echo "Failed\n";
}

*/

答案 1 :(得分:0)

php send email with attachment

中的dqhendricks中获取答案
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);
     }

答案 2 :(得分:0)

为了善良,请不要尝试使用PHP的内置mail()功能来发送附件 - 这对于基本邮件来说已经够糟了,但对于真正需要的附件使用一个体面的图书馆。

您可以使用多个库。

我建议phpMailer。它非常易于使用,并且使添加附件变得非常简单 - 请参阅this examples page以了解它是多么容易。

是的,这意味着你必须扔掉你现有的代码。这是一件好事。没有违反你的代码,但它肯定不是一个像样的邮件库。 phpMailer已经开发了,并处理了当时出现的所有错误和怪癖。如果您准备花费相同的时间来修复自己代码中的错误,那么请确保自己动手。如果没有,你真的应该使用一个图书馆,其他人已经为你完成了所有艰苦的工作。

答案 3 :(得分:0)

我也会使用Swiftmailer(我在使用symfony 1.4进行开发时仍然使用它。)

但只是为了完成这个答案,Swiftmailer在附加远程文件(特别是PDF文件)时会遇到某种问题。这仍然是一个悬而未决的问题(https://github.com/swiftmailer/swiftmailer/issues/207)。但在本期末,您可以找到一种解决方法,即:

$attachment = Swift_Attachment::newInstance(file_get_contents($url_file));

我会通过重命名文件名来补充它,或者它会附加一个nonane文件:

$attachment = Swift_Attachment::newInstance(file_get_contents($url_file))->setFilename('arquivo.pdf');

就是这样:))