Avatar billede monarq Praktikant
03. april 2005 - 22:43 Der er 12 kommentarer

Kan ikke vedhæfte filer i php-mail-script

Jeg har et mailscript til at køre, men kan ikke vedhæfte filer.

Det virker fint når jeg tester det på webserveren på min lokale maskine, både med og uden vedhæftninger, men ikke fra en anden maskine. Det må være stien til filen, der er relativ i forhold til php-scriptet.

Se demo'en her og hent kildekode samme sted:
http://www.nygaards.dk/tilmelding/tilmelding.php

Hvordan løser jeg problemet - eller hvor finder jeg en mailklasse, der virker?
Avatar billede bromer Nybegynder
03. april 2005 - 22:47 #1
Jeg ser lidt på din kode, men Mail-Mime klassen fra Pear er ganske udemærket
Avatar billede bromer Nybegynder
03. april 2005 - 22:55 #2
Nu poster jeg lige din kode så andre folk kan være med

-- libmail.php --
<?php

/*


    this class encapsulates the PHP mail() function.
    implements CC, Bcc, Priority headers


@version    1.3

- added ReplyTo( $address ) method
- added Receipt() method - to add a mail receipt
- added optionnal charset parameter to Body() method. this should fix charset problem on some mail clients
       
@example

    include "libmail.php";
   
    $m= new Mail; // create the mail
    $m->From( "leo@isp.com" );
    $m->To( "destination@somewhere.fr" );
    $m->Subject( "the subject of the mail" );   

    $message= "Hello world!\nthis is a test of the Mail class\nplease ignore\nThanks.";
    $m->Body( $message);    // set the body
    $m->Cc( "someone@somewhere.fr");
    $m->Bcc( "someoneelse@somewhere.fr");
    $m->Priority(4) ;    // set the priority to Low
    $m->Attach( "/home/leo/toto.gif", "image/gif" ) ;    // attach a file of type image/gif
    $m->Send();    // send the mail
    echo "the mail below has been sent:<br><pre>", $m->Get(), "</pre>";

   
LASTMOD
    Fri Oct  6 15:46:12 UTC 2000

@author    Leo West - lwest@free.fr

*/


class Mail
{
    /*
    list of To addresses
    @var    array
    */
    var $sendto = array();
    /*
    @var    array
    */
    var $acc = array();
    /*
    @var    array
    */
    var $abcc = array();
    /*
    paths of attached files
    @var array
    */
    var $aattach = array();
    /*
    list of message headers
    @var array
    */
    var $xheaders = array();
    /*
    message priorities referential
    @var array
    */
    var $priorities = array( '1 (Highest)', '2 (High)', '3 (Normal)', '4 (Low)', '5 (Lowest)' );
    /*
    character set of message
    @var string
    */
//    var $charset = "us-ascii";
    var $charset = "iso-8859-1";
    var $ctencoding = "7bit";
    var $receipt = 0;
   

/*

    Mail contructor
   
*/

function Mail()
{
    $this->autoCheck( true );
    $this->boundary= "--" . md5( uniqid("myboundary") );
}


/*       

activate or desactivate the email addresses validator
ex: autoCheck( true ) turn the validator on
by default autoCheck feature is on

@param boolean    $bool set to true to turn on the auto validation
@access public
*/
function autoCheck( $bool )
{
    if( $bool )
        $this->checkAddress = true;
    else
        $this->checkAddress = false;
}


/*

Define the subject line of the email
@param string $subject any monoline string

*/
function Subject( $subject )
{
    $this->xheaders['Subject'] = strtr( $subject, "\r\n" , "  " );
}


/*

set the sender of the mail
@param string $from should be an email address

*/

function From( $from )
{

    if( ! is_string($from) ) {
        echo "Class Mail: error, From is not a string";
        exit;
    }
    $this->xheaders['From'] = $from;
}

/*
set the Reply-to header
@param string $email should be an email address

*/
function ReplyTo( $address )
{

    if( ! is_string($address) )
        return false;
   
    $this->xheaders["Reply-To"] = $address;
       
}


/*
add a receipt to the mail ie.  a confirmation is returned to the "From" address (or "ReplyTo" if defined)
when the receiver opens the message.

@warning this functionality is *not* a standard, thus only some mail clients are compliants.

*/

function Receipt()
{
    $this->receipt = 1;
}


/*
set the mail recipient
@param string $to email address, accept both a single address or an array of addresses

*/

function To( $to )
{

    // TODO : test validité sur to
    if( is_array( $to ) )
        $this->sendto= $to;
    else
        $this->sendto[] = $to;

    if( $this->checkAddress == true )
        $this->CheckAdresses( $this->sendto );

}


/*        Cc()
*        set the CC headers ( carbon copy )
*        $cc : email address(es), accept both array and string
*/

function Cc( $cc )
{
    if( is_array($cc) )
        $this->acc= $cc;
    else
        $this->acc[]= $cc;
       
    if( $this->checkAddress == true )
        $this->CheckAdresses( $this->acc );
   
}



/*        Bcc()
*        set the Bcc headers ( blank carbon copy ).
*        $bcc : email address(es), accept both array and string
*/

function Bcc( $bcc )
{
    if( is_array($bcc) ) {
        $this->abcc = $bcc;
    } else {
        $this->abcc[]= $bcc;
    }

    if( $this->checkAddress == true )
        $this->CheckAdresses( $this->abcc );
}


/*        Body( text [, charset] )
*        set the body (message) of the mail
*        define the charset if the message contains extended characters (accents)
*        default to us-ascii
*        $mail->Body( "mél en français avec des accents", "iso-8859-1" );
*/
function Body( $body, $charset="" )
{
    $this->body = $body;
   
    if( $charset != "" ) {
        $this->charset = strtolower($charset);
        if( $this->charset != "us-ascii" )
            $this->ctencoding = "8bit";
    }
}


/*        Organization( $org )
*        set the Organization header
*/

function Organization( $org )
{
    if( trim( $org != "" )  )
        $this->xheaders['Organization'] = $org;
}


/*        Priority( $priority )
*        set the mail priority
*        $priority : integer taken between 1 (highest) and 5 ( lowest )
*        ex: $mail->Priority(1) ; => Highest
*/

function Priority( $priority )
{
    if( ! intval( $priority ) )
        return false;
       
    if( ! isset( $this->priorities[$priority-1]) )
        return false;

    $this->xheaders["X-Priority"] = $this->priorities[$priority-1];
   
    return true;
   
}


/*   
Attach a file to the mail

@param string $filename : path of the file to attach
@param string $filetype : MIME-type of the file. default to 'application/x-unknown-content-type'
@param string $disposition : instruct the Mailclient to display the file if possible ("inline") or always as a link ("attachment") possible values are "inline", "attachment"
*/

function Attach( $filename, $filetype = "", $disposition = "inline" )
{
    // TODO : si filetype="", alors chercher dans un tablo de MT connus / extension du fichier
    if( $filetype == "" )
        $filetype = "application/x-unknown-content-type";
       
    $this->aattach[] = $filename;
    $this->actype[] = $filetype;
    $this->adispo[] = $disposition;
}

/*

Build the email message

@access protected

*/
function BuildMail()
{

    // build the headers
    $this->headers = "";
//    $this->xheaders['To'] = implode( ", ", $this->sendto );
   
    if( count($this->acc) > 0 )
        $this->xheaders['CC'] = implode( ", ", $this->acc );
   
    if( count($this->abcc) > 0 )
        $this->xheaders['BCC'] = implode( ", ", $this->abcc );
   

    if( $this->receipt ) {
        if( isset($this->xheaders["Reply-To"] ) )
            $this->xheaders["Disposition-Notification-To"] = $this->xheaders["Reply-To"];
        else
            $this->xheaders["Disposition-Notification-To"] = $this->xheaders['From'];
    }
   
    if( $this->charset != "" ) {
        $this->xheaders["Mime-Version"] = "1.0";
        $this->xheaders["Content-Type"] = "text/plain; charset=$this->charset";
        $this->xheaders["Content-Transfer-Encoding"] = $this->ctencoding;
    }

    $this->xheaders["X-Mailer"] = "Php/libMailv1.3";
   
    // include attached files
    if( count( $this->aattach ) > 0 ) {
        $this->_build_attachement();
    } else {
        $this->fullBody = $this->body;
    }

    reset($this->xheaders);
    while( list( $hdr,$value ) = each( $this->xheaders )  ) {
        if( $hdr != "Subject" )
            $this->headers .= "$hdr: $value\n";
    }
   

}

/*       
    fornat and send the mail
    @access public
   
*/
function Send()
{
    $this->BuildMail();
   
    $this->strTo = implode( ", ", $this->sendto );
   
    // envoie du mail
    $res = @mail( $this->strTo, $this->xheaders['Subject'], $this->fullBody, $this->headers );

}



/*
*        return the whole e-mail , headers + message
*        can be used for displaying the message in plain text or logging it
*/

function Get()
{
    $this->BuildMail();
    $mail = "To: " . $this->strTo . "\n";
    $mail .= $this->headers . "\n";
    $mail .= $this->fullBody;
    return $mail;
}


/*
    check an email address validity
    @access public
    @param string $address : email address to check
    @return true if email adress is ok
*/

function ValidEmail($address)
{
    if( ereg( ".*<(.+)>", $address, $regs ) ) {
        $address = $regs[1];
    }
    if(ereg( "^[^@  ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)\$",$address) )
        return true;
    else
        return false;
}


/*

    check validity of email addresses
    @param    array $aad -
    @return if unvalid, output an error message and exit, this may -should- be customized

*/

function CheckAdresses( $aad )
{
    for($i=0;$i< count( $aad); $i++ ) {
        if( ! $this->ValidEmail( $aad[$i]) ) {
            echo "Class Mail, method Mail : invalid address $aad[$i]";   
            exit;
        }
    }
}


/*
check and encode attach file(s) . internal use only
@access private
*/

function _build_attachement()
{

    $this->xheaders["Content-Type"] = "multipart/mixed;\n boundary=\"$this->boundary\"";

    $this->fullBody = "This is a multi-part message in MIME format.\n--$this->boundary\n";
    $this->fullBody .= "Content-Type: text/plain; charset=$this->charset\nContent-Transfer-Encoding: $this->ctencoding\n\n" . $this->body ."\n";
   
    $sep= chr(13) . chr(10);
   
    $ata= array();
    $k=0;
   
    // for each attached file, do...
    for( $i=0; $i < count( $this->aattach); $i++ ) {
       
        $filename = $this->aattach[$i];
        $basename = basename($filename);
        $ctype = $this->actype[$i];    // content-type
        $disposition = $this->adispo[$i];
       
        if( ! file_exists( $filename) ) {
            echo "Class Mail, method attach : file $filename can't be found"; exit;
        }
        $subhdr= "--$this->boundary\nContent-type: $ctype;\n name=\"$basename\"\nContent-Transfer-Encoding: base64\nContent-Disposition: $disposition;\n  filename=\"$basename\"\n";
        $ata[$k++] = $subhdr;
        // non encoded line length
        $linesz= filesize( $filename)+1;
        $fp= fopen( $filename, 'r' );
        $ata[$k++] = chunk_split(base64_encode(fread( $fp, $linesz)));
        fclose($fp);
    }
    $this->fullBody .= implode($sep, $ata);
}


} // class Mail


?>











-- tilmelding.php --
<html>
  <head>
      <title>
        Online tilmelding
      </title>
  </head>
  <body>

<?

if($send)
{    include "libmail.php";
    $m= new Mail; // create the mail
    $m->From( $mail );
    $m->To( $mail );
    $m->Subject( "Tilmelding" );
    $m->Body( "Tilmeldings testmail..." );
    $m->Priority(3) ;    // set the priority to Normal
   
    if($fil) $m->Attach( $fil, "", "attachment" ) ;
    $m->Send();    // send the mail
    echo "<b>Tak for Tilmelding.</b>";
}
else
{
?>

<form action="tilmelding.php" method="post">

<table>
    <tr>
        <td>Navn:</td>
        <td><input type="text" name="navn" size="44" maxlength="100" ></td>
    </tr>
    <tr>
        <td>E-mail:</td>
        <td><input type="text" name="mail" size="44" maxlength="100" ></td>
    </tr>
    <tr>
        <td>Evt. fil:</td>
        <td><input type="file" name="fil" size="30" maxlength="200"></td>
    </tr>
</table>

<br>

<input type="submit" name="send" value="Send"></td>

</form>

<?
}
?>

  </body>
</html>
Avatar billede bromer Nybegynder
03. april 2005 - 22:58 #3
får du egentlig mailen (bare uden noget vedhæftet) når du sender?
Avatar billede monarq Praktikant
03. april 2005 - 23:03 #4
Hvis jeg ikke vedhæfter noget virker det fint. Den skriver tak for tilmeldingen og jeg får mailen.

Hvis jeg vedhæfter noget skriver den "Class Mail, method attach : file $filename can't be found"
Avatar billede alister_crowley Nybegynder
03. april 2005 - 23:04 #5
Det er fordi du mangler enctype i din form.
din form skal se sådan her ud:

<form enctype="multipart/form-data" action="" method="post">
Avatar billede alister_crowley Nybegynder
03. april 2005 - 23:07 #6
Rettelse

<form enctype="multipart/form-data" action="tilmelding.php" method="post">

Du bør forresten lære http://www.eksperten.dk/artikler/57 , da din kode kun vil virke på meget få servere i verden :]
Avatar billede monarq Praktikant
03. april 2005 - 23:18 #7
Nu virker det, men den vedhæftede fil kommer uanset navn til at at hedde: php0CvK4l.dat. Er der nogen løsning på det?
Avatar billede alister_crowley Nybegynder
03. april 2005 - 23:21 #8
prøv at ændre denne linje (UTESTET !!)

$subhdr= "--$this->boundary\nContent-type: $ctype;\n name=\"$basename\"\nContent-Transfer-Encoding: base64\nContent-Disposition: $disposition;\n  filename=\"$basename\"\n";

til

$subhdr= "--$this->boundary\nContent-type: $ctype;\n name=\"$basename\"\nContent-Transfer-Encoding: base64\nContent-Disposition: $disposition;\n  filename=\"$filename\"\n";
Avatar billede monarq Praktikant
04. april 2005 - 08:35 #9
Det gav ingen ændring at ændre $filename til $basename. Det virker staig, men den vedhæftede fil hedder altid phpxxxxx.dat (hvor xxxxx er tilfældige tal/bogstaver) uanset hvad original-filen hedder.
Avatar billede monarq Praktikant
04. april 2005 - 08:36 #10
Rettelse: ...$basename til $filename...
Avatar billede alister_crowley Nybegynder
04. april 2005 - 08:41 #11
hmm, så det det fordi din mail class bruger tmp_name, istedet for filens oprindelige navn.

prøv med $_FILES['userfile']['name'] istedet for $basename (eller $filename som den vel er nu ;] )

Faktisk temmlig skod mail sender, vil klart anbefale http://pear.php.net/mail_mine , eneste problem er at PEAR kan være svært (meget svært) at sætte op for nybegyndere.
Avatar billede monarq Praktikant
04. april 2005 - 08:53 #12
Det kunne den slet ikke li':
parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING

Jeg prøver at kaste mig ud i Pear-klassen.

Til alister_crowley - smid et svar så får du pointene for at henvise mig til Pear klasse.

Hvis den også driller vender jeg tilbage med et nye spørgsmål.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester