mail attachments

9 отговора 392 прегледа
#1

mail attachments

Здравейте,
преди време имах проблеми с изпращането на mail & additional headers. С общи усилия проблема беше разрешен. Сега обаче ми се налага към писмото да прикача файл (*.doc). Не можах да открия подходящ tutorial и се пробвах да сглобя нещо от примерите в php.net - доста хора са писали по темата.

Това е кода който използвам:

$from = "me@domain.com";
$type = "application/unknown";
$file = $_FILES[NewPaper][name];

$content = fread(fopen($file,"r"),filesize($file));
$content = chunk_split(base64_encode($content));
$uid = strtoupper(md5(uniqid(time())));
$name = basename($file);

$header = "From: $from\nReply-To: $from\n";
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: multipart/mixed; boundary=$uid\n";

$header .= "--$uid\n";
$header .= "Content-Type: text/plain\n";
$header .= "Content-Transfer-Encoding: 8bit\n\n";
$header .= "$text\n";

$header .= "--$uid\n";
$header .= "Content-Type: $type; name=\"$name\"\n";

$header .= "Content-Transfer-Encoding: base64\n";
$header .= "Content-Disposition: attachment; filename=\"$file\"\n\n";
$header .= "$content\n";

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

$subject = "test message";
$message = "check the attachment";

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

в различните варианти които съм пробвал получавам два вида грешка:
1. писмо без прикачен файл
2. не може да чете в този ред или пък не открива файла
$content = fread(fopen($file,"r"),filesize($file));

пробвах и със $_FILES[NewPaper][tmp_name] - не става


ще помогнете ли пак?

Отговор
в отговор на $burov #2

Re: mail attachments

Uh na mama deteto be!
vij na [линк] ima komponent i source na C#.
Ako mojesh da go chetesh sha proumeesh za kvo stava duma.
Tutoriali... php?!?

Отговор
в отговор на $burov #3

Re: mail attachments

Hmm....

<?
class mime_mail
{
var $parts;
var $to;
var $from;
var $headers;
var $subject;
var $body;

/*
* void mime_mail()
* class constructor
*/
function mime_mail()
{
$this->parts = array();
$this->to = "";
$this->from = "";
$this->subject = "";
$this->body = "";
$this->headers = "";
}

/*
* void add_attachment(string message, [string name], [string ctype])
* Add an attachment to the mail object
*/
function add_attachment($message, $name = "", $ctype = "application/octet-stream")
{
$this->parts[] = array (
"ctype" => $ctype,
"message" => $message,
"encode" => $encode,
"name" => $name
);
}

/*
* void build_message(array part=
* Build message parts of an multipart mail
*/
function build_message($part)
{
$message = $part[ "message"];
$message = chunk_split(base64_encode($message));
$encoding = "base64";
return "Content-Type: ".$part[ "ctype"].
($part[ "name"]? "; name = \"".$part[ "name"]. "\"" : "").
"\nContent-Transfer-Encoding: $encoding\n\n$message\n";
}

/*
* void build_multipart()
* Build a multipart mail
*/
function build_multipart()
{
$boundary = "b".md5(uniqid(time()));
$multipart = "Content-Type: multipart/mixed; boundary = $boundary\n\nThis is a MIME
encoded
message.\n\n--$boundary";

for($i = sizeof($this->parts)-1; $i >= 0; $i--)
{
$multipart .= "\n".$this->build_message($this->parts[$i]). "--$boundary";
}
return $multipart.= "--\n";
}

/*
* void send()
* Send the mail (last class-function to be called)
*/
function send()
{
$mime = "";
if (!empty($this->from))
$mime .= "From: ".$this->from. "\n";
if (!empty($this->headers))
$mime .= $this->headers. "\n";

if (!empty($this->body))
$this->add_attachment($this->body, "", "text/plain");
$mime .= "MIME-Version: 1.0\n".$this->build_multipart();
mail($this->to, $this->subject, "", $mime);
}
};


$attachment = fread(fopen("gnome.gif", "rb"), filesize("gnome.gif"));

$mail = new mime_mail();
$mail->from = "$burov";
$mail->to = "$burov";
$mail->subject = "$burovvvvvvv";
$mail->body = "<font color=blue>$burovzzzzzzzzzzzzzzzz</font>";


$mail->add_attachment("$attachment", "gnome.gif", "image/gif");
$mail->send();

?>

$burovvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvfffffffffffffffffffffffffffffffff

Отговор
в отговор на TPECHAT #4

Re: mail attachments

Струва ми се че това изказване беше малко out of topic.

Отговор
в отговор на TPECHAT #5

Re: mail attachments

Е това вече е нещо друго! Само и да не беше ОО, но ще се опитам да го разбера. Благодаря.

Отговор
в отговор на $burov #6

Re: mail attachments

OO s PHP e nai-.... kak da go kaja,,, aide :>>
po4vai C#!

Отговор
в отговор на TPECHAT #7

Re: mail attachments

[линк]


TPECHAT spri da mi pokazvash kolko si bezdaren, k?

Отговор
в отговор на foo1 #8

Re: mail attachments

Знам го това, обаче и то е ОО, а пък и примерите които са дадени в zip файла изкарват разни грешки.

Отговор
в отговор на $burov #9

Re: mail attachments

neznam kakvo protiv OO imash, no eto ti non-OO varianta :


<?php


$sent = $_POST['submit'];
if (!isset($sent)) {

echo "
<html><table align=center cellspacing=1 border=0 cellpadding=3>
<form method=\"post\" name=fileupload action=\"$PHP_SELF\" enctype=\"multipart/form-data\">
<tr><td>To:</td><td align=\"right\"><input type=\"text\" name=\"to\" size=\"60\"></td></tr>
<tr><td>From:</td><td align=\"right\"><input type=\"text\" name=\"from\" size=\"60\"></td></tr>
<tr><td>Subject:</td><td align=\"right\"><input type=\"text\" name=\"subject\" size=\"60\"></td></tr>
<tr><td>Attach file:</td><td align=\"right\"><input type=\"file\" name=\"userfile\"></td></tr>
<tr><td valign=\"top\">Message </td><td align=\"right\"> <textarea name=\"message\"
cols=\"40\" rows=\"10\"></textarea></td></tr><tr><td></td><td align=\"right\"><input type=\"submit\"
name=\"submit\" value=\"submit\"></td></tr></form></table></html>
";

} else {


$to = $_POST['to'];
$from = $_POST['from'];
$subject = $_POST['subject'];
$message = $_POST['message'];

$userfile = $_FILES['userfile']['tmp_name'];
$userfile_type = $_FILES['userfile']['type'];
$userfile_name = $_FILES['userfile']['name'];

$headers = "From: $from";

if (is_uploaded_file($userfile)) {

$file = fopen($userfile,'r');
$data = fread($file,filesize($userfile));
fclose($file);

$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

$headers .= "\nMIME-Version: 1.0\n" .
"Content-Type: multipart/mixed;\n" .
" boundary=\"{$mime_boundary}\"";

$message = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$message . "\n\n";

$data = chunk_split(base64_encode($data));

$message .= "--{$mime_boundary}\n" .
"Content-Type: {$userfile_type};\n" .
" name=\"{$userfile_name}\"\n" .
"Content-Disposition: attachment;\n" .
" filename=\"{$userfile_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n" .
"--{$mime_boundary}--\n";
}


if (preg_match('/^[A-z0-9_\-]+[@][A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z]{2,4}$/', $to)) {

mail($to, $subject, $message, $headers);
echo "Your mail '<b>$subject</b>' was delivered to $to.";

} else {

echo "Incorrect recipient address.";

}

}

?>

Отговор
в отговор на foo1 #10

Re: mail attachments

Благодаря за предложения вариат и времето което си отделил. В моя случай аз първо трябва да запиша файла във една директория на сървъра и едва след това, ако въобще има нужда, същия този файл да се изпрати на клиента. За целта използвам това:

// Example for reading the file that you attach:
$file_url = "../PAPERS/".$ud1."/".$_POST[ProjectID].".doc";
$fp = fopen($file_url,"r");
$str = fread($fp, filesize($file_url));
$str = chunk_split(base64_encode($str));

$headers = "From: $awe[Name] <$awe[WriterEmail]>\n";
$headers .= "Reply-To: $awe[Name] <$awe[WriterEmail]>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"MIME_BOUNDRY\"\n";
$headers .= "X-Sender: $from_k <$email>\n";
$headers .= "X-Mailer: PHP4\n";
$headers .= "X-Priority: 3\n";
$headers .= "Return-Path: <$email>\n";
$headers .= "This is a multi-part message in MIME format.\n";

$me = $_POST[ProjectID].".doc";

$message = "--MIME_BOUNDRY\n";
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n";
$message .= "\n";
// your text goes here
$message .= "Hello,\nthis file needs to be edited before send it to the client.\n\n$awe[Name]\n$awe[WriterEmail]";
$message .= "\n";
$message .= "--MIME_BOUNDRY\n";
$message .= "Content-Type: application/unknown; name=$me\n";
$message .= "Content-disposition: attachment\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "\n";
$message .= "$str\n";
$message .= "\n";
//message ends
$message .= "--MIME_BOUNDRY--\n";


// send the message :-)
$subject = "Edit this file";
mail("Me@domain.com", $subject, $message, $headers);





Проблемът беше че аз първо се опитвах да изпратя файла и после го записвах на сървъра, но когато смених реда на операциите, всичко си е ок. Благодаря на всички.

Отговор