mail() und Anhang?

stega

Erfahrenes Mitglied
hi,
ich habe jetzt sowohl die Foren-Suche durchgefilzt, als auch :google: , aber ich weiß nicht, wie ich die gefundenen Scripte in mein bestehendes einbauen sollte.

Das Problem: Mein Script sieht so aus (auszugsweise)
PHP:
$_REQUEST["text"] = $text;
$_REQUEST["head"] = $header;
$text = $text. "<br><br><hr><font size=2>Diese Mail ist automatisch generiert. Bitte nicht beantworten!<br>
                 
    ### Datenbank Verbindung herstellen
    $connectionid = mysql_connect ($host, $user, $password);
    if (!mysql_select_db ($db, $connectionid))
    {
     die ("Keine Verbindung zur Datenbank");
    }

## Mailadressen auswählen
$query = "SELECT * FROM newsletter";
$result = mysql_query($query);
     while ($data = mysql_fetch_array ($result))
        {

### Mails verschicken 

mail($data["mail"],$header,$text, "From:".$fromname."<".$frommail.">\nContent-Type: text/html","-f".$frommail);

print "<font size=2 face=\"".$face_text."\">Mail an ".$data["mail"]." erfolgreich versendet!</font><hr>";
        }

So, folgende Erweiterung soll jetzt da rein (wenn möglich):
eine auf den Server geladene (das muss man ja anscheinend, soviel ich in den bisher gefundenen Scripten gesehen hab) Datei (pdf-Datei) soll als Anhang an jede Mail drangehängt werden. Ein Uplaodscript hätte ich zur Verfügung, das sieht so aus:
PHP:
<?php
function make_filename($filename, $pfad)
{
//nicht die non-plus ultra funktion.. funktioniert nur mit 3 zeichen
$end = substr($filename, -3);
$start = substr($filename, 0, -3);
$i=1;
while(is_file($start.$i.'.'.$end))
{
$i++;
}
return $start.$i.'.'.$end;
} 
   ##### KONFIGURATION 
   // Absoluter Pfad zum Ordner in den die Datei hochgeladen werden soll.
   $pfad = "newssystem/anhang/";

   // Check if file al exist, yes? make filename 'higher'.
   $i = "$i + 1";
?>
<table align="center">
 <form action="<?php $PHP_SELF; ?>" method="post" enctype="multipart/form-data">
<BR>
<b>Bitte Datei auswählen:</b>
<BR>
<input style="background-color:#E3FF99; font-family:sans-serif; font-size:12px; font-weight:bold; border: double thin" type="file" size="30" name="file">
<BR><br>
<input style="background-color:#E3FF99; font-family:sans-serif; font-size:12px; font-weight:bold; border: double thin" type="Submit" name="senden" value="Hochladen">
</form>
</table>
<?
   $fehler = FALSE;
   if ($senden) {
      if ($file_name == "") {
         echo "<BR><font color=black><b>Es wurde keine Datei ausgewählt!<BR></b></font>";
         $fehler = TRUE;
      }
 
if (!$fehler)
if (file_exists("$pfad/$file_name")) {
echo "<BR><font color=black><b>Dateiname schon vorhanden!<BR></b></font>";
$file_name = make_filename($file_name,$pfad);
echo "<BR><font color=black><b>Neuer Dateiname: ".$file_name."<BR></b></font>";
}   
      if (!$fehler) {
        if (copy($file, $pfad.$file_name)) {
           echo "<BR><font color=black><b>Datei hochgeladen</b></font><BR>";
           echo "Ein <u>externes Verlinken</u> der Datei auf einer anderen Homepage ist nicht möglich!<br>";
       
           $fehler = FALSE;
        }
        
        else {
           echo "<br><font color=black><b>Datei nicht hochgeladen<BR></b></font>";
           $fehler = TRUE;
        }
 
      }
   }
 
   if ($fehler || !$senden) {
 
}
 echo "<BR><hr width=100>";
 echo "<font size=1></font>";
?>
 
</font>
</div>

so, nach diesem Upload müsste ja die Datei auf dem Server liegen... wie kann ich die jetzt an die Mail anbinden?

Oder geht es auch ganz anders, dass ich im Prinzip das Formualr für die Mail habe und dann dort direkt den Uplaod mache und direkt an die Mails dranhänge? d.h. ich bräuchte nicht 2 Scripte, wo ich erst Upload machen muss und dann Die Mails versende?

danke für Hilfe
 
naja, mit phpmailer müsst ich ja alles neu umbasteln...
außerdem sthet in der Readme, dass ich was an der php_ini verändern müsste, was ich aber nicht kann, weil ich keine Berechtigung dazu habe...

gibts da keine Möglichkeit einfach einen Codeschnipsel einzubauen? :)
 
Zuletzt bearbeitet:
Phpmailer ist ein Codeschnipsel.
Alles umbauen musst du auch nicht.
Testen darfst du auch.

Einfacher als ein Objekt erzeugen und ein paar Methoden aufzurufen kans wohl nicht gehen?
 
ne, sorry, aber ich blick da gar nicht durch. Ich habe keine Ahnung, was ich da wo einbauen soll oder was ich davon überhaupt benötige.... der Code ist tlw. über 500 Zeilen lang, da blick ich nicht durch.

Kann mir keiner sagen, wie ich grad ne Mail mache, die einen Anhang hat? Das Hochladen klappt ja auch so, nur halt das Erstellen des Anhangs mit dieser Datei bräucht ich noch.

Kommt schon, bitte bitte! :rolleyes: :)
 
Also "Kommt schon" ist hier schonmal garnicht gern gesehen.

Ich haette zu Deinem Problem die folgende Klasse anzubieten. Die hat auch keine 500 Zeilen Code, sondern nur 134. ;)

Darin findet sich alles darueber wie man einer Mail einen Anhang verpasst.
Diesen Code haettest Du uebrigens auch ueber die Suchfunktion finden koennen, denn das Thema eMail-Anhaenge gab es schon das eine oder andere Mal, und auch diesen Code poste ich nicht zum ersten Mal. ;)
PHP:
<?php
class email
{
	public $id;
	public $to;
	public $subject;
	public $body;
	public $from;
	public $cc;
	public $bcc;
	public $attachedfiles;

	public function __construct($to,$subject,$body,$from="",$cc="",$bcc="")
	{
		$this->id=md5(uniqid());
		$this->to=$to;
		$this->subject=$subject;
		$this->body=$body;
		$this->from=$from;
		$this->cc=$cc;
		$this->bcc=$bcc;
		$this->attachedfiles=array();
	}

	public function destroy()
	{
		if (file_exists("mailtemp/".$this->id))
			{
				for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
					{
						unlink("mailtemp/".$this->id."/".$this->attachedfiles[$attachment]);
					}
				rmdir("mailtemp/".$this->id);
			}
	}

	public function attachfile($tempfile,$filename)
	{
		if (!file_exists("mailtemp/".$this->id))
			{
				mkdir("mailtemp/".$this->id);
			}
		move_uploaded_file($tempfile,"mailtemp/".$this->id."/".$filename);
		$this->attachedfiles[]=$filename;
	}

	public function removeattachment($filename)
	{
		unlink("mailtemp/".$this->id."/".$filename);
		$newattachedfiles=array();
		for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
			{
				if ($this->attachedfiles[$attachment]!=$filename)
					{
						$newattachedfiles[]=$this->attachedfiles[$attachment];
					}
			}
		$this->attachedfiles=$newattachedfiles;
		unset($newattachedfiles);
	}

	public function send()
	{
		$body=imap_8bit($this->body);
		$body.="\n\n";
		/*for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
			{
				$body.="\t".imap_8bit("<<".$this->attachedfiles[$attachment].">>");
			}*/
		$boundary="----".$this->id;
		$email="";
		$email.="Content-class: urn:content-classes:message";
		$email.="\nUser-Agent: Free WebMail";
		$email.="\nMIME-Version: 1.0";
		if (!empty($this->attachedfiles))
			{
				$email.="\nContent-Type: multipart/mixed;\n\tboundary=\"".$boundary."\"";
			}
		if (!empty($this->from))
			{
				$email.="\nFrom: ".$this->from;
			}
		if (!empty($this->cc))
			{
				$email.="\nCc: ".$this->cc;
			}
		if (!empty($this->bcc))
			{
				$email.="\nBcc: ".$this->bcc;
			}
		$email.="\nX-Priority: 3 (Normal)";
		$email.="\nImportance: Normal";
		if (!empty($this->attachedfiles))
			{
				$email.="\n\n--".$boundary;
			}
		$email.="\nContent-Type: text/plain;\n\tcharset=\"iso-8859-1\"";
		$email.="\nContent-Transfer-Encoding: quoted-printable";
		$email.="\nContent-Disposition: inline";
		$email.="\n\n".$body;
		if (!empty($this->attachedfiles))
			{
				$email.="\n\n--".$boundary;
			}
		for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
			{
				$file=fopen("mailtemp/".$this->id."/".$this->attachedfiles[$attachment],"r");
				$content=fread($file,filesize("mailtemp/".$this->id."/".$this->attachedfiles[$attachment]));
				fclose($file);
				$encodedfile=chunk_split(base64_encode($content));
				$email.="\nContent-Type: application/octet-stream;\n\tname=\"".$this->attachedfiles[$attachment]."\"";
				$email.="\nContent-Transfer-Encoding: base64";
				$email.="\nContent-Description: ".$this->attachedfiles[$attachment];
				$email.="\nContent-Disposition: attachment;\n\tfilename=\"".$this->attachedfiles[$attachment]."\"";
				$email.="\n\n".$encodedfile."\n\n--".$boundary;
			}
		if (!empty($this->attachedfiles))
			{
				$email.="--";
			}
		imap_mail($this->to,$this->subject,"",$email);
	}
}

function mailstring($mailobject)
{
	return rawurlencode(serialize($mailobject));
}

function mailobject($mailstring)
{
	return unserialize(stripslashes(rawurldecode($mailstring)));
}
?>
 
ok, sorry wg dem "Kommt schon". ICh probier jetzt mal deinen Code irgendwie einzubauen, auch wenn er mir wieder irgendwie schwierig reinzubekommen aussieht :)
 
ich habe jetzt mal deinen Code abkopiert und in mein Script mit include eingebunden.
Zudem hab ich ihn bissle abgeändert, sodass er jetzt so aussieht:
PHP:
<?
class email
{
    public $id;
    public $to;
    public $subject;
    public $body;
    public $from;
    public $attachedfiles;
    
    public function __construct($to,$subject,$body,$from="",$cc="",$bcc="")
    {
        $this->id=md5(uniqid());
        $this->to=$data["mail"];  //das wird in meinem Script definiert
        $this->subject=$header; //das hier auch
        $this->body=$text;        // der text wird vom benutzer eingegeben
        $this->from=$fromname; //das ist vordefiniert
        $this->attachedfiles=array();
    }

    public function destroy()
    {
        if (file_exists($temp_ordner.$this->id))  //temp_ordner ist der ordner, in den die Dateien hochgeladen wurden
            {
                for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
                    {
                        unlink($temp_ordner.$this->id."/".$this->attachedfiles[$attachment]);
                    }
                rmdir($temp_ordner.$this->id);
            }
    }

    public function attachfile($tempfile,$filename)
    {
        if (!file_exists($temp_ordner.$this->id))
            {
                mkdir($temp_ordner.$this->id);
            }
        move_uploaded_file($tempfile,$temp_ordner.$this->id."/".$filename);
        $this->attachedfiles[]=$filename;
    }

    public function removeattachment($filename)
    {
        unlink($temp_ordner.$this->id."/".$filename);
        $newattachedfiles=array();
        for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
            {
                if ($this->attachedfiles[$attachment]!=$filename)
                    {
                        $newattachedfiles[]=$this->attachedfiles[$attachment];
                    }
            }
        $this->attachedfiles=$newattachedfiles;
        unset($newattachedfiles);
    }

    public function send()
    {
        $body=imap_8bit($this->body);
        $body.="\n\n";
        /*for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
            {
                $body.="\t".imap_8bit("<<".$this->attachedfiles[$attachment].">>");
            }*/
        $boundary="----".$this->id;
        $email="";
        $email.="Content-class: urn:content-classes:message";
        $email.="\nUser-Agent: WebMail";
        $email.="\nMIME-Version: 1.0";
        if (!empty($this->attachedfiles))
            {
                $email.="\nContent-Type: multipart/mixed;\n\tboundary=\"".$boundary."\"";
            }
        if (!empty($this->from))
            {
                $email.="\nFrom: ".$this->from;
            }
        $email.="\nX-Priority: 3 (Normal)";
        $email.="\nImportance: Normal";
        if (!empty($this->attachedfiles))
            {
                $email.="\n\n--".$boundary;
            }
        $email.="\nContent-Type: text/html;\n\tcharset=\"iso-8859-1\"";
        $email.="\nContent-Transfer-Encoding: quoted-printable";
        $email.="\nContent-Disposition: inline";
        $email.="\n\n".$body;
        if (!empty($this->attachedfiles))
            {
                $email.="\n\n--".$boundary;
            }
        for ($attachment=0;$attachment<count($this->attachedfiles);$attachment++)
            {
                $file=fopen($temp_ordner.$this->id."/".$this->attachedfiles[$attachment],"r");
                $content=fread($file,filesize($temp_ordner.$this->id."/".$this->attachedfiles[$attachment]));
                fclose($file);
                $encodedfile=chunk_split(base64_encode($content));
                $email.="\nContent-Type: application/octet-stream;\n\tname=\"".$this->attachedfiles[$attachment]."\"";
                $email.="\nContent-Transfer-Encoding: base64";
                $email.="\nContent-Description: ".$this->attachedfiles[$attachment];
                $email.="\nContent-Disposition: attachment;\n\tfilename=\"".$this->attachedfiles[$attachment]."\"";
                $email.="\n\n".$encodedfile."\n\n--".$boundary;
            }
        if (!empty($this->attachedfiles))
            {
                $email.="--";
            }
        imap_mail($this->to,$this->subject,"",$email);
    }
}

function mailstring($mailobject)
{
    return rawurlencode(serialize($mailobject));
}

function mailobject($mailstring)
{
    return unserialize(stripslashes(rawurldecode($mailstring)));
}
?>

so, vwürde das Script jetzt eine Mail verschicken?
Bisher kommt nämlich nur folgender Fehler:
Code:
Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /usr/export/www/vhosts/funnetwork/hosting/stega/newssystem/mail_class.php on line 4

was ist da falsch? Was bedeutet das public am Anfang überhaupt? Danke für Hilfe!
 
Das public kennzeichnet, dass die Funktion oeffentlich ist, also von ausserhalb der Klasse aufgerufen werden kann.
Diese Kennzeichnung wird aber von PHP4, welches Du offensichtlich nutzt, noch nicht unterstuetzt.
Dieses Tutorial koennte Dir behilflich sein die Klasse fuer PHP4 fit zu machen.
 
Zurück