i am using a class i found online for sending a mail attachment. the attachment is just a text file. it works fantastic, IF, i use the entire path to the file as the filename.
for example:

if i use:

$filename="../path/file.txt";
$fd=fopen($filename, "r");

this works fine, but it names the file .._path_file.txt.

what i want to do is this:

$filename="file.txt";
$fd=fopen("../path/".$filename,"r");

this will send the file as file.txt, but it will be a totally empty file.

i have also tried using absolute paths.

is there a solution to this?

thanks.

    $filename="../path/file.txt";
    $fd=fopen($filename, "r");
    
    // [...]
    
    $filename="file.txt";
    $fd=fopen("../path/".$filename,"r");
    

    Unless I missed something obvious, these two snippets of code are functionally equivalent. Perhaps you could post the relevant section of code from the class, or a url to this class?

    I guess as a workaround you could chdir to the directory where the file is, and just include it with the name and no path.

      yes, they seem equivalent, but like i said, if i use $filename as only the $filename and not the entire path, it merely attaches a blank file.

      $filename="../leads/$weekago-$today.csv";
      $fp=fopen($filename,"w");

      		$content="APPLICATION ID,LOAN TYPE,DATE,LAST NAME,FIRST NAME,ESTIMATED VALUE OF HOME,LOAN AMOUNT DESIRED,CURRENT MONTHLY PAYMENT,CREDIT HISTORY,EMAIL,HOME PHONE,WORK PHONE,ADDRESS,CITY,STATE,ZIP\n";
      		for ($i=0;$i<count($applicationid);$i++){
      			$content.= "$applicationid[$i],$loanpurpose[$i],$date[$i],$lname[$i],$fname[$i],$estimatedvalue[$i],$desiredamount[$i],$monthlypayment[$i],$credithistory[$i],$email[$i],$homephone[$i],$workphone[$i],$address[$i],$city[$i],$state[$i],$zip[$i]\n";
      		}
      
      		fwrite($fp,$content);
      		fclose($fp);

      //attach file in email and send
      $content_type = "plain/text";
      @$fd = fopen($filename, "r");

      @$data = fread($fd, filesize($filename));
      
      @fclose($fd);

      this works, but i'd rathe have the filename named without the path. thanks.

        So from the code you've posted you're writing a file, then reading it, then ... nothing. I think I know why you're email doesn't include an attachment. You're not sending one.

        The two methods of reading the file you posted earlier are the same. If there is a problem it's not in anything you've posted so far, nor is there any clue as to what it might be in any description you've given.

        Since you've not told us what class you're using I'll just ignore that bit and give you a pointer to a class which does work for this. I've recently used PHP Mailer to do exactly what you're asking here. Send csv files as attachments to an email. Worked great, and even gives you the option of specifying the file name to use in the email.

          i did not include the entire class, only the part concerning the filename. it does work when the filename includes the entire path. here is the whole class. this works, but the attached file is named .._leads_nameoffile.csv.

          i have found a work around, but am still curious as to why two seemingly equivalent pieces of code are not. this class works great, however.

          $filename="../leads/$weekago-$today.csv";
          $fp=fopen($filename,"w");

          		$content="APPLICATION ID,LOAN TYPE,DATE,LAST NAME,FIRST NAME,ESTIMATED VALUE OF HOME,LOAN AMOUNT DESIRED,CURRENT MONTHLY PAYMENT,CREDIT HISTORY,EMAIL,HOME PHONE,WORK PHONE,ADDRESS,CITY,STATE,ZIP\n";
          		for ($i=0;$i<count($applicationid);$i++){
          			$content.= "$applicationid[$i],$loanpurpose[$i],$date[$i],$lname[$i],$fname[$i],$estimatedvalue[$i],$desiredamount[$i],$monthlypayment[$i],$credithistory[$i],$email[$i],$homephone[$i],$workphone[$i],$address[$i],$city[$i],$state[$i],$zip[$i]\n";
          		}
          
          		fwrite($fp,$content);
          		fclose($fp);

          //pause to give system time to write file
          sleep(15);

          //attach file in email and send
          $content_type = "plain/text";
          @$fd = fopen($filename, "r");

          @$data = fread($fd, filesize($filename));
          
          @fclose($fd);
          
          
          
          $mail = new MailAttach;

          $mail->from = "e-loan-finder.com";
          $mail->to = "emailgoeshere";
          $mail->subject = "Weekly Leads";
          $mail->body = "This is the body of the email.";
          $mail->headers = "Reply-To: replyaddress";

          $mail->add_attachment($data, $filename, $content_type);

          $enviado = $mail->send();

          class MailAttach
          {

          var $parts;

          var $to;

          var $from;

          var $headers;

          var $subject;

          var $body;

          function MailAttach() {

            $this->parts = array();
          
            $this->to =  "";
          
            $this->from =  "";
          
            $this->subject =  "";
          
            $this->body =  "";
          
            $this->headers =  "";

          }

          function add_attachment($message, $name = "", $ctype = "application/octet-stream") {

            $this->parts[] = array (
          
                  "ctype" => $ctype,
          
                  "message" => $message,
          
                  "encode" => $encode,
          
                  "name" => $name
          
                                 );

          }

          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";

          }

          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";

          }

          function get_mail($complete = true) {

            $mime =  "";
          
            if (!empty($this->from))
          
               $mime .=  "From: ".$this->from. "\n";
          
            if (!empty($this->headers))
          
               $mime .= $this->headers. "\n";
          
          
          
            if ($complete) {
          
               if (!empty($this->to)) {
          
                  $mime .= "To: $this->to\n";
          
               }
          
               if (!empty($this->subject)) {
          
                  $mime .= "Subject: $this->subject\n";
          
               }
          
            }
          
          
          
            if (!empty($this->body))
          
               $this->add_attachment($this->body,  "",  "text/plain");
          
            $mime .=  "MIME-Version: 1.0\n".$this->build_multipart();
          
          
          
            return $mime;

          }

          function send() {

            $mime = $this->get_mail(false);
          
            if (mail($this->to, $this->subject,  "", $mime)) {
          
          	return true;
          
          }else{
          
          	return false;
          
          }

          }

          };

            Now you just have to learn you to surround your code with [ PHP ] tags, and you'll be a nice respectable member of the community. 🙂

            I still can't tell you why the two code snippets worked differently, mainly because you posted the working code and not the non-working code. If the file came through empty, then it would be due to a problem either in your writing the file or reading it, either of which doesn't touch the class. When you changed your filename to exclude the path, you would have had to add the path to every file operation you did which used the filename. That's two fopens, and one fread. Had I to guess I'd say you forgot to change your fread line.

            From the code you posted, there's no need to write a file at all. You just need the data in a string, and the file name passed to add_attachment is arbitrary. This would've worked:

            $content="APPLICATION ID,LOAN TYPE,DATE,LAST NAME,FIRST NAME,ESTIMATED 
            VALUE OF HOME,LOAN AMOUNT DESIRED,CURRENT MONTHLY PAYMENT,CREDIT 
            HISTORY,EMAIL,HOME PHONE,WORK PHONE,ADDRESS,CITY,STATE,ZIP\n";
            
            for ($i=0;$i<count($applicationid);$i++){
                $content.= "$applicationid[$i], $loanpurpose[$i], $date[$i], $lname[$i], 
            $fname[$i], $estimatedvalue[$i], $desiredamount[$i], $monthlypayment[$i], 
            $credithistory[$i], $email[$i], $homephone[$i], $workphone[$i], $address[$i], 
            $city[$i], $state[$i], $zip[$i]\n";
            } 
            
            $mail = new MailAttach;
            $mail->from = "e-loan-finder.com";
            $mail->to = "emailgoeshere";
            $mail->subject = "Weekly Leads";
            $mail->body = "This is the body of the email.";
            $mail->headers = "Reply-To: replyaddress";
            
            $mail->add_attachment($content, "$weekago-$today.csv", "plain/text");
            
            $enviado = $mail->send(); 
            
              Write a Reply...