• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

PHP Mail mit Anhang

Loerbs

Mitglied
Guten Abend liebe Community :)

Ich habe folgendes Problem...
Ich habe bislang leider nicht viel Erfahrung im bezug auf PHP. Versuche mir aber Zeit für Zeit mehr anzueignen.
Ich habe folgende Frage:
Im nachfolgenden geht es um ein ganz normales Kontakt Script welches ebenfalls für ein weiteren Bereich genutzt werden soll. Ein Bewerbungssystem. Hierbei soll das Mail Scipt genutzt werden, es sollen aber ebenfalls Datei Anhänge mit verschickt werden.
Die Domain lautet:
www.loerbs.com/bewerbungssystem.html

Benutzer:
Loerbs

Passwort:
123456

Könne mir jemand sage welche Ergänzungen ich tätigen muss damit die Dateianhänge mit versendet werden?
Ich würde mich über jede Rückmeldung freuen! Anbei die Scipt ausschnitte

Vielen Dank und einen schönen Sonntagabend!
Alex


HTML:
<div class="col-md-8 col-sm-7">
                    <p><h2>Bewerbungssystem</h2></p>
                 
                           <form method="post" id="contactform" name="contactform" class="contact-form clearfix" action="mail/bewerbung_mail.php">
                            <div class="row">
                                <div class="col-md-6">
                                    <div class="form-group">
                                        <input type="text" id="fname" name="First Name"  class="form-control input-lg" placeholder="Nachname*">
                                    </div>
                                </div>
                                <div class="col-md-6">
                                    <div class="form-group">
                                        <input type="text" id="lname" name="Last Name"  class="form-control input-lg" placeholder="Vorname*">
                                    </div>
                                  </div>
                               </div>
                            <div class="row">
                                <div class="col-md-6">
                                    <div class="form-group">
                                        <input type="email" id="email" name="email"  class="form-control input-lg" placeholder="E-Mail*">
                                    </div>
                                </div>
                                <div class="col-md-6">
                                    <div class="form-group">
                                        <input type="text" id="phone" name="phone" class="form-control input-lg" placeholder="Telefon*">
                                    </div>
                                </div>
                              </div>
                            <div class="row">
                                <div class="col-md-12">
                                    <div class="form-group">
                                        <textarea cols="6" rows="7" id="comments" name="comments" class="form-control input-lg" placeholder="Weitere Informationen"></textarea>
                                    </div>
                                </div>
                              </div>
                            <p>Anschreiben*
                            <br>
                            <input id="comments" name="Datei" type="file" size="50" accept="text/*"> </p>
                            <p>Lebenslauf*
                            <br>
                            <input name="Datei" type="file" size="50" accept="text/*"> </p>
                            <p>Zeugnis*
                            <br>
                            <input name="Datei" type="file" size="50" accept="text/*"> </p>
                            <div class="row">
                                <div class="col-md-12">
                                    <input id="submit" name="submit" type="submit" class="btn btn-primary btn-lg btn-block" value="Bewerbung absenden">
                                </div>
                              </div>
                        </form>
                        <div class="clearfix"></div>
                        <div id="message"></div>
                    </div>
PHP:
<?php

if(!$_POST) exit;

function isEmail($email) {
    return(preg_match("/^[-_.[:alnum:]]+@((([[:alnum:]]|[[:alnum:]][[:alnum:]-]*[[:alnum:]])\.)+(ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)$|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.){3}([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$/i",$email));
}

if (!defined("PHP_EOL")) define("PHP_EOL", "\r\n");

$fname     = $_POST['fname'];
$lname     = $_POST['lname'];
$email    = $_POST['email'];
$subject     = $_POST['subject'];
$comments = $_POST['comments'];

if(trim($fname) == '') {
    echo '<div class="alert alert-error">Bitte geben Sie Ihren Vornamen an.</div>';
    exit();
} else if(trim($email) == '') {
    echo '<div class="alert alert-error">Sie müssen eine E-Mail-Adresse angeben.</div>';
    exit();
} else if(!isEmail($email)) {
    echo '<div class="alert alert-error">Sie müssen eine gültige Email-Adresse angeben.</div>';
    exit();
}

if(get_magic_quotes_gpc()) {
    $comments = stripslashes($comments);
}

$address = "[email protected]";

$e_subject = 'Nachricht-Kontaktformular Schau-Hinaus.de';


$e_body = "Anfrage von: $fname $lname, die Zusatzmeldung lautet wie folgt:" . PHP_EOL . PHP_EOL;
$e_content = "\"$comments\"" . PHP_EOL . PHP_EOL;
$e_reply = "Kontakt über $fname $lname per email oder telefonisch $phone, $email";

$msg = wordwrap( $e_body . $e_content . $e_reply, 70 );

$headers = "From: $email" . PHP_EOL;
$headers .= "Reply-To: $email" . PHP_EOL;
$headers .= "MIME-Version: 1.0" . PHP_EOL;
$headers .= "Content-type: text/plain; charset=utf-8" . PHP_EOL;
$headers .= "Content-Transfer-Encoding: quoted-printable" . PHP_EOL;

if(mail($address, $e_subject, $msg, $headers)) {


    echo "<div class='alert alert-success'>";
    echo "<h3>Email Erfolgreich gesendet!</h3><br>";
    echo "<p>Vielen Dank <strong>$name</strong>, Ihre Nachricht wurde an Schau Hinaus übermittelt.</p>";
    echo "</div>";

} else {

    echo 'ERROR!';

}
 
Zuletzt bearbeitet:
Werbung:
Ich würde dir eine Mailerklasse empfehlen, wie z.b. den PHPMailer. V.a. wenns um Anhänge u.ä. geht.
 
Hmmm...
gibt es keine "einfache" Möglichkeit eine Variante zu ergänzen/zu difinieren im vorhandenen Script?
 
Werbung:
Rein zur Information.
Der genereller Aufbau eines Mails mit Anhang sieht ca so aus:

Code:
MIME-Version: 1.0
From: {von}
Reply-To: {von}
X-Mailer: PHP {phpversion}
Content-Type: multipart/mixed;  boundary="{boundary}"
--{boundary}
Content-type: {content_type_s}; charset="{encoding}"
Content-Transfer-Encoding: quoted-printable

{mail_content}
{--boundary}
Content-type: {anhang_content_type}; name="{dateiname}"
Content-Transfer-Encoding: {encoding}
Content-Description: {dateiname}
Content-Disposition: attachment; filename="{dateiname}"

{datei_content}
--{boundary}--

Dieser Aufbau entspricht im Wesentlichen den gängigen Standards und ich hatte noch nie ein Problem damit. Die Aufbereitung der Inhalte (z.B. welche HTML-Tags sind erlaubt, wie muss das Subject angegeben werden, Spamschutz und Schutz vor Hijacking etc) kann aber schnell einiges an Arbeit machen.

Attachments werden an den eigentlichen Mailtext angehängt. Du müsstest in deinem Script also $msg entsprechend erweitern. Die meisten gängigen Mailprogramme verlangen dir dann das boundary zwingend ab (das lässt sich aber recht leicht z.B. so erzeugen):
PHP:
$boundary = "ein_string".strtoupper(md5(uniqid(time())));

Ich löse das also so:
eine mailfunction.php
PHP:
function make_mail_header($von, $boundary, $content_type_s, $codierung='utf-8')
{
    $header = file_get_contents("templates/mail/mail_header.var");
    $header = str_replace('{von}', $von, $header);
    $header = str_replace('{phpversion}', phpversion(), $header);
    $header = str_replace('{boundary}', $boundary, $header);
    $header = str_replace('{content_type_s}', $content_type_s, $header);
    $header = str_replace('{utfencoding}', $codierung, $header);

    return $header;
}

function make_mail_attachment($anhang_content_type, $dateiname, $encoding, $datei_content, $boundary)
{
    $attach = file_get_contents("templates/mail/mail_attach.var");
    $attach = str_replace('{anhang_content_type}', $anhang_content_type, $attach);
    $attach = str_replace('{dateiname}', $dateiname, $attach);
    $attach = str_replace('{encoding}', $encoding, $attach);
    $attach = str_replace('{dateiname}', $dateiname, $attach);
    $attach = str_replace('{datei_content}', $datei_content, $attach);
    $attach = str_replace('{boundary}', $boundary, $attach);

    return $attach;
}

// entfernt mehrfach Umbrüche (aus dem Mailheader)
function clean_mail($text)
{
    $text = str_replace("\n\r","\n",$text);
    $text = str_replace("\n\n","\n",$text);
    $text = str_replace("\r\n","\n",$text);
    $text = str_replace("\r\r","\n",$text);
    return $text;
}

function make_mail_subject($subject,$codierung='utf-8')
{
    if($codierung == 'utf-8')
    {
        return "=?utf-8?B?".base64_encode($subject)."?=";
    }
    else
    {
        return $subject;
    }
}

mail_header.var: (als reine Textdatei)
Code:
MIME-Version: 1.0
From: {von}
Reply-To: {von}
X-Mailer: PHP {phpversion}
Content-Type: multipart/mixed;  boundary="{boundary}"
--{boundary}
Content-type: {content_type_s}; charset="{utfencoding}"
Content-Transfer-Encoding: quoted-printable

mail_attach.var: (als reine Textdatei)
Code:
Content-type: {anhang_content_type}; name="{dateiname}"
Content-Transfer-Encoding: {encoding}
Content-Description: {dateiname}
Content-Disposition: attachment; filename="{dateiname}"

{datei_content}
--{boundary}--
Man achte auf die beiden Leerzeilen am Ende der Datei!

mail.php (ACHTUNG, hier gekürzt, ohne Prüfung und Aufbereitung der einzelnen Variablen!!)
PHP:
/*
// kommt vom Formular...
$an = ??
$von = ??
$subject = ??
$mail_content =???
$anhang = ??
*/

         $attach = '';
         $boundary = "sysopscript".strtoupper(md5(uniqid(time())));

         $header = make_mail_header($von, $boundary, $content_type_s);
         $header = clean_mail($header);

         // Den Mailtext für funktion mail() bauen
         $mailtext = $mail_content."\n--".$boundary;

         // Anhang prüfen und wenn ein Anhang da ist, dann Zusatz erstellen
         if($anhang != '')
         {
            $attach = make_mail_attachment($anhang_content_type, $dateiname, $encoding, $datei_content, $boundary);
         }
          // Den fertigen Anhang nun an den Mailtext hängen
         $mailtext .= $attach;
         // SENDEN
         mail($an,make_mail_subject($subject),$mailtext,$header)
Wie gesagt, das ist alles stark gekürzt, sollte aber funktionieren. Ich weise nochmal darauf hin, Insbesondere SPAM-Prüfung und Schutz vor hijacking des Scripts ist aber nicht enthalten.
 
Zuletzt bearbeitet:
...und den ganzen Aufwand nur, um keine Mailer-Klasse verwenden zu wollen?! o_O

Na dann: Happy coding...
 
Werbung:
Mailerklassen habe auch ihr Für und wider, ich mag aber keine Grundsatzdebatte auslösen.

Zumindest die Frage sollte man beantworten. Der Fragesteller hat ja nicht nach einer Alternative gefragt und seinen Code wollte er auch nicht bewertet haben, daher...

Ich nutze übrigens auch lieber mail() als eine Klasse und das aus gutem Grund.
 
Zumindest die Frage sollte man beantworten. Der Fragesteller hat ja nicht nach einer Alternative gefragt und seinen Code wollte er auch nicht bewertet haben, daher...
Es ist also sinnvoller, dem TE eine seinen Kenntnissen offensichtlich übersteigende halbfertige mail()-Anleitung ans Herz zu legen?! Dann man los...

Ich nutze übrigens auch lieber mail() als eine Klasse und das aus gutem Grund.
Wenn man sich auskennt, sehe ich auch kein Problem dabei, aber die meisten Fragesteller haben das KnowHow einfach nicht. Dennoch würde mich auch interessieren, was genau die Gründe für Dich sind, mail() zu bevorzugen?

Gruß Arne
 
Werbung:
Hallo

Zu oberst finde ich, dass man sich mit Mail, sofern man Mail verwenden möchte, schlicht auseinanderzusetzen hat!
Fehlende Qualifikation ist für mich da nur eine Ausrede. Man ist verantwortlich für das, was man tut. Fragen zum Thema sehe ich allerdings nicht als ausreichenden Grund nicht zur mail Funktion zu antworten, ich setzte entsprechendes Wissen voraus.
Ich habe es mir schon lange abgewöhnt jemanden "missionieren" zu wollen. Im speziellen Fall hier, wurde klar auf eine Klasse hingewiesen, der Hinweis wurde "ignoriert" und es wurde nachgefragt, wie man einen Anhang im aktuellen Script verwirklichen könnte. Erst dann kam mein kurzer Codeschnipsel. Ich hinterfrage das nicht, der Themenersteller wird schon wissen, was er möchte und kann.

Warum setze ich lieber mail() ein? Das hat mehrere Gründe.

Zunächst häufen sich auf meinen Servern die gezielten Angriffe auf bestimmte Mailerklassen, das ist schon einmal einer der Gründe. Ohne es nun selbst kontrolliert zu haben, behaupte ich, dass ein Bug in einer der gängigen Klassen, sich schnell herum spricht und entsprechend ausgenutzt wird. Anders Formuliert, ist das blinde Vertrauen in eine fremde Klasse für mich "security by obscurity". Man verlässt sich darauf, dass die "Anderen" es besser können und (was viel wichtiger ist) auch besser machen, was nach meiner Erfahrung oft schlicht in die Hose geht.

Ich denke, dass ich mit mail umgehen kann, durch die Verwendung von mail also Herr meiner Scripte (und somit natürlich auch meiner Fehler) bin und bleibe. Die Verantwortung trage ich ohnedies, dann doch lieber für Fehler, die ich auch gemacht habe.

Ich nutze Debian auf allen meinen Servern, die Mailklassen die aus den Repositories geliefert werden sind (entsprechend der Stable-Freeze-Philosophie) teilweise auf einem alten Stand. Nun wartet das Debian Projekt zwar php (so also auch die mail() Funktion), bringt aber nach meiner Auffassung nicht die Mailklassen auf den neuesten Stand. Ein Fremdscript (also nicht aus den Repositories) ist hier aber generell strikt verboten. Ich kann also quasi nicht Problemlos updaten, es sei denn, Debian fixed und liefert aus. Updates habe ich aber z.B. für den Swift-Mailer noch nie erhalten. Ich verliere so eigentlich die Kontrolle über meinen Server bzw die eingesetzte Mailklasse. Das finde ich nicht gerade prickelnd.

ein Upgrade von PHP auf eine neuere Version verursacht (zwar sehr selten, aber doch) eine Fehlfunktion der Mailklasse, die auch auf den entsprechend neuen Stand gebracht werden müsste, was aber aus oben genannten Gründen nicht ohne Weiteres geht.

Last but not least, müsste ich recht viele Scripte, die hier im Einsatz sind umarbeiten, der Aufwand ist mir schlicht zu viel.

Rein aus dem Bauch...
Ich halte ohnedies schon für viel zu viel den Rüssel hin, da muss es nicht auch noch Spam sein, den ich nicht selbst verursacht habe.:confused:

Und einiges kleines mehr, was mir derzeit nicht einfällt.

Mannomann, jetzt habe ich doch eine Grundsatzdebatte gestartet.
 
Hallo,

Mannomann, jetzt habe ich doch eine Grundsatzdebatte gestartet.
Finde ich nicht schlimm, kann man doch drüber diskutieren. Generell empfinde ich Deine Einstellung ja auch gut.

Das Problem ist nur, dass der TE garantiert nicht Deinen Wissenstand hat.
Natürlich hat auch eine Verwendung von Mailerklassen Nachteile und gewisse Tücken.
Aber für Einsteiger imho weiterhin die bessere Lösung.

Mich würde mal ein Script interessieren, in dem Du mail() Deiner Meinung nach "sicher" verwendest.
Ich schätze Dich jetzt nicht so ein, aber die meisten, die mit der Aussage "mail() reicht" kommen, machen so viele kleine Fehler an allen Ecken und Kanten in der Verwendung. Und wenn man sie darauf hinweist, kommt meistens als Antwort: "Na und, funktioniert doch, ich hatte noch nie Probleme...".

Ich denke Du verstehst, was ich meine.
Das ist der Grund, warum ich es für besser halöte, auf die Mailerklassen hinzuweisen.

Im speziellen Fall hier, wurde klar auf eine Klasse hingewiesen, der Hinweis wurde "ignoriert" und es wurde nachgefragt, wie man einen Anhang im aktuellen Script verwirklichen könnte.
Auch da bin ich bei Dir. nur die Abneigung gegen die Mailerklassen rührt daher, dass man nicht in der Lage ist, die einzubinden.
Jetzt mal ehrlich, wer das nicht hinbekommt, sollte auch mail() nicht roh verwenden...

Gruß Arne
 
Zurück
Oben