Anhänge mit PHP Mail senden ()?

224

Ich muss ein PDF mit Mail senden, ist das möglich?

$to = "xxx";
$subject = "Subject" ;
$message = 'Example message with <b>html</b>';
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: xxx <xxx>' . "\r\n";
mail($to,$subject,$message,$headers);

Was vermisse ich?


quelle
16
Das Senden eines Anhangs mit mail()Funktion ist viel schwieriger als erwartet. Versuchen Sie aus Zeitgründen
Mihai Iorga
1
Oder könnten Sie einfach darauf verlinken?
@mihai lorga Benötigt das keine serverseitige Installation? Wenn es ohne Erweiterungen oder Plugins möglich ist, muss ich wissen wie.
2
@ChristianNikkanen Es ist nur ein gut gesetztes Skript. Es hat auch viele Funktionen, die schwer zu erreichen sind. Warum das Rad neu erfinden? Es werden keine zusätzlichen Plugins verwendet.
Mihai Iorga

Antworten:

309

Ich stimme @MihaiIorga in den Kommentaren zu - benutze das PHPMailer-Skript. Sie scheinen es abzulehnen, weil Sie die einfachere Option wünschen. Vertrauen Sie mir, PHPMailer ist bei weitem die einfachere Option als der Versuch, es selbst mit der integrierten mail()Funktion von PHP zu tun . Die mail()Funktion von PHP ist wirklich nicht sehr gut.

So verwenden Sie PHPMailer:

  • Laden Sie das PHPMailer-Skript hier herunter: http://github.com/PHPMailer/PHPMailer
  • Extrahieren Sie das Archiv und kopieren Sie den Ordner des Skripts an einen geeigneten Ort in Ihrem Projekt.
  • Fügen Sie die Hauptskriptdatei hinzu - require_once('path/to/file/class.phpmailer.php');

Das Versenden von E-Mails mit Anhängen wird von wahnsinnig schwierig zu unglaublich einfach:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

$email = new PHPMailer();
$email->SetFrom('[email protected]', 'Your Name'); //Name is optional
$email->Subject   = 'Message Subject';
$email->Body      = $bodytext;
$email->AddAddress( '[email protected]' );

$file_to_attach = 'PATH_OF_YOUR_FILE_HERE';

$email->AddAttachment( $file_to_attach , 'NameOfFile.pdf' );

return $email->Send();

Es ist nur diese eine Zeile $email->AddAttachment();- einfacher geht es nicht.

Wenn Sie dies mit der PHP- mail()Funktion tun , werden Sie Stapel von Code schreiben, und Sie werden wahrscheinlich viele wirklich schwer zu findende Fehler haben.

DEZA
quelle
1
Ja so einfach. Der springende Punkt bei phpMailer ist, dass es die komplexen Dinge erledigt, so dass Sie es nicht müssen. Deshalb ist das Lesen komplex. Selbst für das Versenden von Nur-Text-E-Mails bevorzuge ich phpMailer mail(), aber für die Arbeit mit Anhängen ist dies ein Kinderspiel.
DEZA
4
Ich war das gleiche - wollte mail () verwenden, nur weil ich es bereits in meinem Code hatte. PHPMAILER hat weniger als 5 Minuten gebraucht, um Anhänge zu senden!
James Wilson
108
Ich fand diese Frage auf der Suche nach einer Antwort, wie man die mail()Funktion zum Hinzufügen von Anhängen verwendet. Diese Antwort hilft mir nicht dabei.
Cypher
19
Dies ist nicht die Antwort auf die Frage. Wie man einen Anhang mit PHPMailer sendet, ist nicht, wie man einen Anhang mit PHPs mail () sendet, was gefragt wird.
Toby
4
Diese Antwort ignoriert auch die vom Projekt verwendete Lizenz. Wenn Sie PHPMailer verwenden, müssen Sie sicherstellen, dass Sie das Paket von Ihrer Quelle ausschließen, um Probleme mit der LGPL-Lizenz zu vermeiden.
Achse
190

Sie können versuchen, den folgenden Code zu verwenden:

    $filename = 'myfile';
    $path = 'your path goes here';
    $file = $path . "/" . $filename;

    $mailto = '[email protected]';
    $subject = 'Subject';
    $message = 'My message';

    $content = file_get_contents($file);
    $content = chunk_split(base64_encode($content));

    // a random hash will be necessary to send mixed content
    $separator = md5(time());

    // carriage return type (RFC)
    $eol = "\r\n";

    // main header (multipart mandatory)
    $headers = "From: name <[email protected]>" . $eol;
    $headers .= "MIME-Version: 1.0" . $eol;
    $headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol;
    $headers .= "Content-Transfer-Encoding: 7bit" . $eol;
    $headers .= "This is a MIME encoded message." . $eol;

    // message
    $body = "--" . $separator . $eol;
    $body .= "Content-Type: text/plain; charset=\"iso-8859-1\"" . $eol;
    $body .= "Content-Transfer-Encoding: 8bit" . $eol;
    $body .= $message . $eol;

    // attachment
    $body .= "--" . $separator . $eol;
    $body .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"" . $eol;
    $body .= "Content-Transfer-Encoding: base64" . $eol;
    $body .= "Content-Disposition: attachment" . $eol;
    $body .= $content . $eol;
    $body .= "--" . $separator . "--";

    //SEND Mail
    if (mail($mailto, $subject, $body, $headers)) {
        echo "mail send ... OK"; // or use booleans here
    } else {
        echo "mail send ... ERROR!";
        print_r( error_get_last() );
    }

Bearbeiten Sie den 14. Juni 2018

Für mehr Lesbarkeit bei einigen E-Mail-Anbietern

$body .= $eol . $message . $eol . $eol; und $body .= $eol . $content . $eol . $eol;

Pragnesh Chauhan
quelle
$ uid scheint unbenutzt zu sein.
Edd
Jemand wies in einer Antwort darauf hin, dass es sich um einen Kommentar handeln sollte, der laut dem OP-Code eher 'Example message with <b>html</b>'Content-Type als sein sollte . Ich poste den Kommentar in seinem Namen, da er nicht genügend Repräsentanten hat, um Kommentare zu posten, und ich die Antwort zum Löschen markiert habe. text/htmltext/plain
Adi Inbar
Müssen Sie in diesem Code $ path und $ filename definieren? Und wäre es so etwas wie $ filename = $ _FILES ['userfile'] ['tmp_name']; ?
Malfy
Warum deklarieren Sie, $filenachdem Sie darauf verwiesen haben $filename?
Kolob Canyon
2
Aus den Dokumenten von PHPMailer ... "Das korrekte Formatieren von E-Mails ist überraschend schwierig. Es gibt unzählige überlappende RFCs, die die strikte Einhaltung schrecklich komplizierter Formatierungs- und Codierungsregeln erfordern - die überwiegende Mehrheit des Codes, den Sie online finden und der die Funktion mail () direkt verwendet ist einfach falsch! " ...es ist wahr! Ich habe so etwas wie diese Antwort verwendet, um E-Mails mit Anhängen zu senden, und es hat funktioniert! Nur um ein paar Tage später festzustellen, dass in Google Mail die Anhänge einwandfrei angezeigt werden, zeigen andere Anbieter den base64-Inhalt direkt in der E-Mail an.
Aaron Cicali
134

Für PHP 5.5.27 Sicherheitsupdate

$file = $path.$filename;
$content = file_get_contents( $file);
$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($file);

// header
$header = "From: ".$from_name." <".$from_mail.">\r\n";
$header .= "Reply-To: ".$replyto."\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";

// message & attachment
$nmessage = "--".$uid."\r\n";
$nmessage .= "Content-type:text/plain; charset=iso-8859-1\r\n";
$nmessage .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$nmessage .= $message."\r\n\r\n";
$nmessage .= "--".$uid."\r\n";
$nmessage .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n";
$nmessage .= "Content-Transfer-Encoding: base64\r\n";
$nmessage .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
$nmessage .= $content."\r\n\r\n";
$nmessage .= "--".$uid."--";

if (mail($mailto, $subject, $nmessage, $header)) {
    return true; // Or do something here
} else {
  return false;
}
Simon Mokhele
quelle
Sie haben $ filename nicht definiert. Was soll es sein? Der Dateipfad?
Jon
3
@ Jon. $ filename ist der tatsächliche Name Ihrer Datei und $ path ist der tatsächliche Dateipfad ohne den Dateinamen. Ich dachte, die Variablen wären beschreibend genug, um sie zu deklarieren und zu institutionieren
Simon Mokhele
Es soll in einer Funktion sein, wenn Sie sie nicht definieren möchten. Funktion mail_attachment ($ Dateiname, $ Pfad, $ mailto, $ from_mail, $ from_name, $ replyto, $ subject, $ message)
Jon
3
Hinweis für Benutzer, die mehrere Anhänge senden - separate MIME-Teile mit $nmessage .= "--".$uid."\r\n";und nach dem letzten MIME-Teil verwenden $nmessage .= "--".$uid."--";(wie oben gezeigt).
Rinogo
2
Dies funktionierte schließlich nach Kopfschmerzen, als ich versuchte, das blöde Phpmailer-Ding zum Laufen zu bringen.
E.Arrowood
22

Swiftmailer ist ein weiteres benutzerfreundliches Skript, das automatisch vor E-Mail-Injection schützt und Anhänge zum Kinderspiel macht. Ich rate auch dringend davon ab, die integrierte mail()Funktion von PHP zu verwenden.

Benutzen:

  • Laden Sie Swiftmailer herunter und platzieren Sie den libOrdner in Ihrem Projekt
  • Fügen Sie die Hauptdatei mit ein require_once 'lib/swift_required.php';

Fügen Sie nun den Code hinzu, wenn Sie eine E-Mail senden müssen:

// Create the message
$message = Swift_Message::newInstance()
    ->setSubject('Your subject')
    ->setFrom(array('[email protected]' => 'Web Master'))
    ->setTo(array('[email protected]'))
    ->setBody('Here is the message itself')
    ->attach(Swift_Attachment::fromPath('myPDF.pdf'));

//send the message          
$mailer->send($message);

Weitere Informationen und Optionen finden Sie in den Swiftmailer-Dokumenten .

Matthew Johnson
quelle
6
Weil Sie anbieten, eine Drittanbieter-Bibliothek
herunterzuladen
Ist PHPMailer kein Drittanbieter? oder meine @MatthewJohnson gemacht oder ist ein Teil der Betreuer von swiftmailer? So oder so, solange die Lösung gut und effektiv ist, wäre eine Abwertung unangemessen ...
Xsmael
1
@Xsmael, PHPMailer ist definitiv ein Drittanbieter :) Ich bin mit den Abstimmungen nicht einverstanden, da (zumindest zu der Zeit) die Lösung funktioniert. Die Menschen können jedoch wählen, wie sie wollen, und die positiven Stimmen negieren mehr als die negativen.
Matthew Johnson
17

Um eine E-Mail mit Anhang zu senden, müssen Sie den mehrteiligen / gemischten MIME-Typ verwenden, der angibt, dass gemischte Typen in die E-Mail aufgenommen werden. Darüber hinaus möchten wir den mehrteiligen / alternativen MIME-Typ verwenden, um sowohl Klartext- als auch HTML-Version der E-Mail zu senden. Schauen Sie sich das Beispiel an:

<?php 
//define the receiver of the email 
$to = '[email protected]'; 
//define the subject of the email 
$subject = 'Test email with attachment'; 
//create a boundary string. It must be unique 
//so we use the MD5 algorithm to generate a random hash 
$random_hash = md5(date('r', time())); 
//define the headers we want passed. Note that they are separated with \r\n 
$headers = "From: [email protected]\r\nReply-To: [email protected]"; 
//add boundary string and mime type specification 
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\""; 
//read the atachment file contents into a string,
//encode it with MIME base64,
//and split it into smaller chunks
$attachment = chunk_split(base64_encode(file_get_contents('attachment.zip'))); 
//define the body of the message. 
ob_start(); //Turn on output buffering 
?> 
--PHP-mixed-<?php echo $random_hash; ?>  
Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>" 

--PHP-alt-<?php echo $random_hash; ?>  
Content-Type: text/plain; charset="iso-8859-1" 
Content-Transfer-Encoding: 7bit

Hello World!!! 
This is simple text email message. 

--PHP-alt-<?php echo $random_hash; ?>  
Content-Type: text/html; charset="iso-8859-1" 
Content-Transfer-Encoding: 7bit

<h2>Hello World!</h2> 
<p>This is something with <b>HTML</b> formatting.</p> 

--PHP-alt-<?php echo $random_hash; ?>-- 

--PHP-mixed-<?php echo $random_hash; ?>  
Content-Type: application/zip; name="attachment.zip"  
Content-Transfer-Encoding: base64  
Content-Disposition: attachment  

<?php echo $attachment; ?> 
--PHP-mixed-<?php echo $random_hash; ?>-- 

<?php 
//copy current buffer contents into $message variable and delete current output buffer 
$message = ob_get_clean(); 
//send the email 
$mail_sent = @mail( $to, $subject, $message, $headers ); 
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" 
echo $mail_sent ? "Mail sent" : "Mail failed"; 
?>

Wie Sie sehen können, ist das Senden einer E-Mail mit Anhang einfach durchzuführen. Im vorhergehenden Beispiel haben wir einen mehrteiligen / gemischten MIME-Typ und darin einen mehrteiligen / alternativen MIME-Typ, der zwei Versionen der E-Mail angibt. Um einen Anhang zu unserer Nachricht hinzuzufügen, lesen wir die Daten aus der angegebenen Datei in eine Zeichenfolge, codieren sie mit base64, teilen sie in kleinere Teile auf, um sicherzustellen, dass sie den MIME-Spezifikationen entsprechen, und fügen sie dann als Anhang hinzu.

Von hier genommen .

Basith
quelle
15
Kopieren / Einfügen des Inhalts in den Link, den ich in OP-Kommentaren hinzugefügt habe
Mark
Gutes Snippet, obwohl ich nach der Begrenzungszeichenfolge eine zusätzliche Zeile einfügen musste, damit es funktioniert. Ich vermute, es hat etwas mit den Zeilenenden der PHP-Datei zu tun. Mein Editor ist standardmäßig LF, aber ich denke, der Standard erwartet auch einen Wagenrücklauf (CRLF).
Ogier Schelvis
9

Das funktioniert bei mir. Es werden auch mehrere Anhänge angehängt. leicht

<?php

if ($_POST && isset($_FILES['file'])) {
    $recipient_email = "[email protected]"; //recepient
    $from_email = "info@your_domain.com"; //from email using site domain.
    $subject = "Attachment email from your website!"; //email subject line

    $sender_name = filter_var($_POST["s_name"], FILTER_SANITIZE_STRING); //capture sender name
    $sender_email = filter_var($_POST["s_email"], FILTER_SANITIZE_STRING); //capture sender email
    $sender_message = filter_var($_POST["s_message"], FILTER_SANITIZE_STRING); //capture message
    $attachments = $_FILES['file'];

    //php validation
    if (strlen($sender_name) < 4) {
        die('Name is too short or empty');
    }
    if (!filter_var($sender_email, FILTER_VALIDATE_EMAIL)) {
        die('Invalid email');
    }
    if (strlen($sender_message) < 4) {
        die('Too short message! Please enter something');
    }

    $file_count = count($attachments['name']); //count total files attached
    $boundary = md5("specialToken$4332"); // boundary token to be used

    if ($file_count > 0) { //if attachment exists
        //header
        $headers = "MIME-Version: 1.0\r\n";
        $headers .= "From:" . $from_email . "\r\n";
        $headers .= "Reply-To: " . $sender_email . "" . "\r\n";
        $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n";

        //message text
        $body = "--$boundary\r\n";
        $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
        $body .= "Content-Transfer-Encoding: base64\r\n\r\n";
        $body .= chunk_split(base64_encode($sender_message));

        //attachments
        for ($x = 0; $x < $file_count; $x++) {
            if (!empty($attachments['name'][$x])) {

                if ($attachments['error'][$x] > 0) { //exit script and output error if we encounter any
                    $mymsg = array(
                        1 => "The uploaded file exceeds the upload_max_filesize directive in php.ini",
                        2 => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
                        3 => "The uploaded file was only partially uploaded",
                        4 => "No file was uploaded",
                        6 => "Missing a temporary folder");
                    die($mymsg[$attachments['error'][$x]]);
                }

                //get file info
                $file_name = $attachments['name'][$x];
                $file_size = $attachments['size'][$x];
                $file_type = $attachments['type'][$x];

                //read file 
                $handle = fopen($attachments['tmp_name'][$x], "r");
                $content = fread($handle, $file_size);
                fclose($handle);
                $encoded_content = chunk_split(base64_encode($content)); //split into smaller chunks (RFC 2045)

                $body .= "--$boundary\r\n";
                $body .= "Content-Type: $file_type; name=" . $file_name . "\r\n";
                $body .= "Content-Disposition: attachment; filename=" . $file_name . "\r\n";
                $body .= "Content-Transfer-Encoding: base64\r\n";
                $body .= "X-Attachment-Id: " . rand(1000, 99999) . "\r\n\r\n";
                $body .= $encoded_content;
            }
        }
    } else { //send plain email otherwise
        $headers = "From:" . $from_email . "\r\n" .
                "Reply-To: " . $sender_email . "\n" .
                "X-Mailer: PHP/" . phpversion();
        $body = $sender_message;
    }

    $sentMail = @mail($recipient_email, $subject, $body, $headers);
    if ($sentMail) { //output success or failure messages
        die('Thank you for your email');
    } else {
        die('Could not send mail! Please check your PHP mail configuration.');
    }
}
?>
Rotimi
quelle
Dieser Code ist anfällig für Header-Injection-Angriffe, da keine Validierung vorliegt und die Benutzereingaben nicht kontextbezogen entgangen sind.
Synchro
@Synchro .. Dies ist der einzige Code, den ich für mehrere Anhänge finde, der für mich funktioniert hat. Können Sie bitte vorschlagen, wie Sie dies auf sichere Weise verwenden können?
NMathur
7

Nachdem ich eine Weile mit schlecht formatierten Anhängen zu kämpfen hatte, ist dies der Code, den ich verwendet habe:

$email = new PHPMailer();
$email->From      = '[email protected]';
$email->FromName  = 'FromName';
$email->Subject   = 'Subject';
$email->Body      = 'Body';
$email->AddAddress( '[email protected]' );
$email->AddAttachment( "/path/to/filename.ext" , "filename.ext", 'base64', 'application/octet-stream' );
$email->Send();
CONvid19
quelle
6

Arbeitskonzept:

if (isset($_POST['submit'])) {
    $mailto = $_POST["mailTo"];
    $from_mail = $_POST["fromEmail"];
    $replyto = $_POST["fromEmail"];
    $from_name = $_POST["fromName"];
    $message = $_POST["message"];
    $subject = $_POST["subject"];

    $filename = $_FILES["fileAttach"]["name"];
    $content = chunk_split(base64_encode(file_get_contents($_FILES["fileAttach"]["tmp_name"])));

    $uid = md5(uniqid(time()));
    $name = basename($file);
    $header = "From: " . $from_name . " <" . $from_mail . ">\r\n";
    $header .= "Reply-To: " . $replyto . "\r\n";

    $header .= "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\r\n\r\n";
    $header .= "This is a multi-part message in MIME format.\r\n";
    $header .= "--" . $uid . "\r\n";

// You add html "Content-type: text/html; charset=utf-8\n" or for Text "Content-type:text/plain; charset=iso-8859-1\r\n" by I.khan
    $header .= "Content-type:text/html; charset=utf-8\n";
    $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";

// User Message you can add HTML if You Selected HTML content
    $header .= "<div style='color: red'>" . $message . "</div>\r\n\r\n";

    $header .= "--" . $uid . "\r\n";
    $header .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"\r\n"; // use different content types here
    $header .= "Content-Transfer-Encoding: base64\r\n";
    $header .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\r\n\r\n"; // For Attachment
    $header .= $content . "\r\n\r\n";
    $header .= "--" . $uid . "--";
    if (mail($mailto, $subject, "", $header)) {
        echo "<script>alert('Success');</script>"; // or use booleans here
    } else {
        echo "<script>alert('Failed');</script>";
    }
}
Irshad Khan
quelle
6

Keine der oben genannten Antworten hat aufgrund des angegebenen Anhangsformats ( application/octet-stream) für mich funktioniert . Verwenden Sie diese Option, application/pdfum optimale Ergebnisse mit PDF-Dateien zu erzielen.

<?php

// just edit these 
$to          = "[email protected], [email protected]"; // addresses to email pdf to
$from        = "[email protected]"; // address message is sent from
$subject     = "Your PDF email subject"; // email subject
$body        = "<p>The PDF is attached.</p>"; // email body
$pdfLocation = "./your-pdf.pdf"; // file location
$pdfName     = "pdf-file.pdf"; // pdf file name recipient will get
$filetype    = "application/pdf"; // type

// creates headers and mime boundary
$eol = PHP_EOL;
$semi_rand     = md5(time());
$mime_boundary = "==Multipart_Boundary_$semi_rand";
$headers       = "From: $from$eolMIME-Version: 1.0$eol" .
    "Content-Type: multipart/mixed;$eol boundary=\"$mime_boundary\"";

// add html message body
$message = "--$mime_boundary$eol" .
    "Content-Type: text/html; charset=\"iso-8859-1\"$eol" .
    "Content-Transfer-Encoding: 7bit$eol$eol$body$eol";

// fetches pdf
$file = fopen($pdfLocation, 'rb');
$data = fread($file, filesize($pdfLocation));
fclose($file);
$pdf = chunk_split(base64_encode($data));

// attaches pdf to email
$message .= "--$mime_boundary$eol" .
    "Content-Type: $filetype;$eol name=\"$pdfName\"$eol" .
    "Content-Disposition: attachment;$eol filename=\"$pdfName\"$eol" .
    "Content-Transfer-Encoding: base64$eol$eol$pdf$eol--$mime_boundary--";

// Sends the email
if(mail($to, $subject, $message, $headers)) {
    echo "The email was sent.";
}
else {
    echo "There was an error sending the mail.";
}
Omikes
quelle
$ headers = "From: $ from $ eolMIME-Version: 1.0 $ eol" wirft immer wieder einen undefinierten Variablenfehler auf $ eolMIME.
Rückstoß
hmm ... ersetzen "From: $from$eolMIME-Version: 1.0$eol"durch"From: $from" . "$eolMIME-Version: 1.0$eol"
omikes
Vielleicht können Sie in einigen PHP-Versionen nicht zwei solche Variablen hinzufügen. Es hat bei der von mir verwendeten funktioniert. Das tut mir leid. in der Tat gibt es so viele Vorkommen Sie vielleicht alle Instanzen ersetzen $eolmit " . "$eolgetan seiner ganzen Art und Weise auf einen Schlag fiel.
Omikes
2
            $to = "[email protected]";
            $subject = "Subject Of The Mail";
            $message = "Hi there,<br/><br/>This is my message.<br><br>";

            $headers = "From: From-Name<[email protected]>";
// boundary
            $semi_rand = md5(time());
            $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

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

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

                $message .= "--{$mime_boundary}\n";
                $filepath = 'uploads/'.$_FILES['image']['name'];
                move_uploaded_file($_FILES['image']['tmp_name'], $filepath); //upload the file
                $filename = $_FILES['image']['name'];
                $file = fopen($filepath, "rb");
                $data = fread($file, filesize($filepath));
                fclose($file);
                $data = chunk_split(base64_encode($data));
                $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$filename\"\n" .
                        "Content-Disposition: attachment;\n" . " filename=\"$filename\"\n" .
                        "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
                $message .= "--{$mime_boundary}\n";

mail($to, $subject, $message, $headers);
Dhawal Naik
quelle
2

HTML Quelltext:

<form enctype="multipart/form-data" method="POST" action=""> 
    <label>Your Name <input type="text" name="sender_name" /> </label> 
    <label>Your Email <input type="email" name="sender_email" /> </label> 
    <label>Your Contact Number <input type="tel" name="contactnumber" /> </label>
    <label>Subject <input type="text" name="subject" /> </label> 
    <label>Message <textarea name="description"></textarea> </label> 
    <label>Attachment <input type="file" name="attachment" /></label> 
    <label><input type="submit" name="button" value="Submit" /></label> 
</form> 

PHP-Code:

<?php
if($_POST['button']){
{
    //Server Variables
    $server_name = "Your Name";
    $server_mail = "[email protected]";

    //Name Attributes of HTML FORM
    $sender_email = "sender_email";
    $sender_name = "sender_name";
    $contact = "contactnumber";
    $mail_subject = "subject";
    $input_file = "attachment";
    $message = "description";

    //Fetching HTML Values
    $sender_name = $_POST[$sender_name];
    $sender_mail = $_POST[$sender_email];
    $message = $_POST[$message];
    $contact= $_POST[$contact];
    $mail_subject = $_POST[$mail_subject];

    //Checking if File is uploaded
    if(isset($_FILES[$input_file])) 
    { 
        //Main Content
        $main_subject = "Subject seen on server's mail";
        $main_body = "Hello $server_name,<br><br> 
        $sender_name ,contacted you through your website and the details are as below: <br><br> 
        Name : $sender_name <br> 
        Contact Number : $contact <br> 
        Email : $sender_mail <br> 
        Subject : $mail_subject <br> 
        Message : $message.";

        //Reply Content
        $reply_subject = "Subject seen on sender's mail";
        $reply_body = "Hello $sender_name,<br> 
        \t Thank you for filling the contact form. We will revert back to you shortly.<br><br>
        This is an auto generated mail sent from our Mail Server.<br>
        Please do not reply to this mail.<br>
        Regards<br>
        $server_name";

//#############################DO NOT CHANGE ANYTHING BELOW THIS LINE#############################
        $filename= $_FILES[$input_file]['name'];
        $file = chunk_split(base64_encode(file_get_contents($_FILES[$input_file]['tmp_name'])));
        $uid = md5(uniqid(time()));
        //Sending mail to Server
        $retval = mail($server_mail, $main_subject, "--$uid\r\nContent-type:text/html; charset=iso-8859-1\r\nContent-Transfer-Encoding: 7bit\r\n\r\n $main_body \r\n\r\n--$uid\r\nContent-Type: application/octet-stream; name=\"$filename\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\"$filename\"\r\n\r\n$file\r\n\r\n--$uid--", "From: $sender_name <$sender_mail>\r\nReply-To: $sender_mail\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"$uid\"\r\n\r\n");
        //Sending mail to Sender
        $retval = mail($sender_mail, $reply_subject, $reply_body , "From: $server_name<$server_mail>\r\nMIME-Version: 1.0\r\nContent-type: text/html\r\n");
//#############################DO NOT CHANGE ANYTHING ABOVE THIS LINE#############################

        //Output
        if ($retval == true) {
            echo "Message sent successfully...";
            echo "<script>window.location.replace('index.html');</script>";
        } else {
            echo "Error<br>";
            echo "Message could not be sent...Try again later";
            echo "<script>window.location.replace('index.html');</script>";
        }
    }else{
        echo "Error<br>";
        echo "File Not Found";
    }
}else{
    echo "Error<br>";
    echo "Unauthorised Access";
}
Ebenezer Isaac
quelle
1

Am Ende habe ich meine eigene E-Mail-Sende- / Kodierungsfunktion geschrieben. Dies hat für mich beim Senden von PDF-Anhängen gut funktioniert. Ich habe die anderen Funktionen in der Produktion nicht verwendet.

Hinweis: Obwohl die Spezifikation sehr deutlich macht, dass Sie \ r \ n verwenden müssen, um Header zu trennen, hat es nur funktioniert, wenn ich PHP_EOL verwendet habe. Ich habe dies nur unter Linux getestet. YMMV

<?php
# $args must be an associative array
#     required keys: from, to, body
#          body can be a string or a [tree of] associative arrays. See examples below
#     optional keys: subject, reply_to, cc, bcc
# EXAMPLES:
#    # text-only email:
#    email2(array(
#        'from' => '[email protected]',
#        'to' => '[email protected]',
#        'subject' => 'test',
#        # body will be text/plain because we're passing a string that doesn't start with '<'
#        'body' => 'Hi, testing 1 2 3',
#    ));
#
#    # html-only email
#    email2(array(
#        'from' => '[email protected]',
#        'to' => '[email protected]',
#        'subject' => 'test',
#        # body will be text/html because we're passing a string that starts with '<'
#        'body' => '<h1>Hi!</h1>I like <a href="http://cheese.com">cheese</a>',
#    ));
#
#    # text-only email (explicitly, in case first character is dynamic or something)
#    email2(array(
#        'from' => '[email protected]',
#        'to' => '[email protected]',
#        'subject' => 'test',
#        # body will be text/plain because we're passing a string that doesn't start with '<'
#        'body' => array(
#            'type' => 'text',
#            'body' => $message_text,
#        )
#    ));
#
#    # email with text and html alternatives (auto-detected mime types)
#    email2(array(
#        'from' => '[email protected]',
#        'to' => '[email protected]',
#        'subject' => 'test',
#        'body' => array(
#            'type' => 'alternatives',
#            'body' => array(
#                "Hi!\n\nI like cheese",
#                '<h1>Hi!</h1><p>I like <a href="http://cheese.com">cheese</a></p>',
#            )
#        )
#    ));
#
#    # email with text and html alternatives (explicit types)
#    email2(array(
#        'from' => '[email protected]',
#        'to' => '[email protected]',
#        'subject' => 'test',
#        'body' => array(
#            'type' => 'alternatives',
#            'body' => array(
#                array(
#                    'type' => 'text',
#                    'body' => "Hi!\n\nI like cheese",
#                ),
#                array(
#                    'type' => 'html',
#                    'body' => '<h1>Hi!</h1><p>I like cheese</p>',
#                ),
#            )
#        )
#    ));
#
#    # email with an attachment
#    email2(array(
#        'from' => '[email protected]',
#        'to' => '[email protected]',
#        'subject' => 'test',
#        'body' => array(
#            'type' => 'mixed',
#            'body' => array(
#                "Hi!\n\nCheck out this (inline) image",
#                array(
#                    'type' => 'image/png',
#                    'disposition' => 'inline',
#                    'body' => $image_data, # raw file contents
#                ),
#                "Hi!\n\nAnd here's an attachment",
#                array(
#                    'type' => 'application/pdf; name="attachment.pdf"',
#                    'disposition' => 'attachment; filename="attachment.pdf"',
#                    'body' => $pdf_data, # raw file contents
#                ),
#                "Or you can use shorthand:",
#                array(
#                    'type' => 'application/pdf',
#                    'attachment' => 'attachment.pdf', # name for client (not data source)
#                    'body' => $pdf_data, # raw file contents
#                ),
#            )
#        )
#    ))
function email2($args) {
    if (!isset($args['from'])) { return 1; }
    $from = $args['from'];
    if (!isset($args['to'])) { return 2; }
    $to = $args['to'];
    $subject = isset($args['subject']) ? $args['subject'] : '';
    $reply_to = isset($args['reply_to']) ? $args['reply_to'] : '';
    $cc = isset($args['cc']) ? $args['cc'] : '';
    $bcc = isset($args['bcc']) ? $args['bcc'] : '';

    #FIXME should allow many more characters here (and do Q encoding)
    $subject = isset($args['subject']) ? $args['subject'] : '';
    $subject = preg_replace("|[^a-z0-9 _/#'.:&,-]|i", '_', $subject);

    $headers = "From: $from";
    if($reply_to) {
        $headers .= PHP_EOL . "Reply-To: $reply_to";
    }
    if($cc) {
        $headers .= PHP_EOL . "CC: $cc";
    }
    if($bcc) {
        $headers .= PHP_EOL . "BCC: $bcc";
    }

    $r = email2_helper($args['body']);
    $headers .= PHP_EOL . $r[0];
    $body = $r[1];

    if (mail($to, $subject, $body, $headers)) {
        return 0;
    } else {
        return 5;
    }
}

function email2_helper($body, $top = true) {
    if (is_string($body)) {
        if (substr($body, 0, 1) == '<') {
            return email2_helper(array('type' => 'html', 'body' => $body), $top);
        } else {
            return email2_helper(array('type' => 'text', 'body' => $body), $top);
        }
    }
    # now we can assume $body is an associative array
    # defaults:
    $type = 'application/octet-stream';
    $mime = false;
    $boundary = null;
    $disposition = null;
    $charset = false;
    # process 'type' first, because it sets defaults for others
    if (isset($body['type'])) {
        $type = $body['type'];
        if ($type === 'text') {
            $type = 'text/plain';
            $charset = true;
        } elseif ($type === 'html') {
            $type = 'text/html';
            $charset = true;
        } elseif ($type === 'alternative' || $type === 'alternatives') {
            $mime = true;
            $type = 'multipart/alternative';
        } elseif ($type === 'mixed') {
            $mime = true;
            $type = 'multipart/mixed';
        }
    }
    if (isset($body['disposition'])) {
        $disposition = $body['disposition'];
    }
    if (isset($body['attachment'])) {
        if ($disposition == null) {
            $disposition = 'attachment';
        }
        $disposition .= "; filename=\"{$body['attachment']}\"";
        $type .= "; name=\"{$body['attachment']}\"";
    }
    # make headers
    $headers = array();
    if ($top && $mime) {
        $headers[] = 'MIME-Version: 1.0';
    }
    if ($mime) {
        $boundary = md5('5sd^%Ca)~aAfF0=4mIN' . rand() . rand());
        $type .= "; boundary=$boundary";
    }
    if ($charset) {
        $type .= '; charset=' . (isset($body['charset']) ? $body['charset'] : 'UTF-8');
    }
    $headers[] = "Content-Type: $type";
    if ($disposition !== null) {
        $headers[] = "Content-Disposition: {$disposition}";
    }

    $data = '';
    # return array, first el is headers, 2nd is body (php's mail() needs them separate)
    if ($mime) {
        foreach ($body['body'] as $sub_body) {
            $data .= "--$boundary" . PHP_EOL;
            $r = email2_helper($sub_body, false);
            $data .= $r[0] . PHP_EOL . PHP_EOL; # headers
            $data .= $r[1] . PHP_EOL . PHP_EOL; # body
        }
        $data .= "--$boundary--";
    } else {
        if(preg_match('/[^\x09\x0A\x0D\x20-\x7E]/', $body['body'])) {
            $headers[] = "Content-Transfer-Encoding: base64";
            $data .= chunk_split(base64_encode($body['body']));
        } else {
            $data .= $body['body'];
        }
    }
    return array(join(PHP_EOL, $headers), $data);
}
JasonWoof
quelle
Ich habe gerade festgestellt, dass mein Code einige Funktionen aufruft, die ich nicht aufgenommen habe. Sie haben nur sichergestellt, dass die Werte für / von / cc / etc legitim sind. Ich habe sie entfernt, und jetzt funktioniert dieser Code so wie er ist.
JasonWoof
-1

Kopieren des Codes von dieser Seite - funktioniert in mail ()

Er beginnt damit, eine Funktion mail_attachment zu erstellen, die später aufgerufen werden kann. Was er später mit seinem Anhangscode macht.

<?php
function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {
    $file = $path.$filename;
    $file_size = filesize($file);
    $handle = fopen($file, "r");
    $content = fread($handle, $file_size);
    fclose($handle);
    $content = chunk_split(base64_encode($content));
    $uid = md5(uniqid(time()));
    $header = "From: ".$from_name." <".$from_mail.">\r\n";
    $header .= "Reply-To: ".$replyto."\r\n";
    $header .= "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
    $header .= "This is a multi-part message in MIME format.\r\n";
    $header .= "--".$uid."\r\n";
    $header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
    $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    $header .= $message."\r\n\r\n";
    $header .= "--".$uid."\r\n";
    $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; // use different content types here
    $header .= "Content-Transfer-Encoding: base64\r\n";
    $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
    $header .= $content."\r\n\r\n";
    $header .= "--".$uid."--";
    if (mail($mailto, $subject, "", $header)) {
        echo "mail send ... OK"; // or use booleans here
    } else {
        echo "mail send ... ERROR!";
    }
}

//start editing and inputting attachment details here
$my_file = "somefile.zip";
$my_path = "/your_path/to_the_attachment/";
$my_name = "Olaf Lederer";
$my_mail = "[email protected]";
$my_replyto = "[email protected]";
$my_subject = "This is a mail with attachment.";
$my_message = "Hallo,\r\ndo you like this script? I hope it will help.\r\n\r\ngr. Olaf";
mail_attachment($my_file, $my_path, "[email protected]", $my_mail, $my_name, $my_replyto, $my_subject, $my_message);
?>

Er hat mehr Details auf seiner Seite und beantwortet einige Probleme im Kommentarbereich.

Jon
quelle
-1

100% funktionierendes Konzept zum Senden von E-Mails mit Anhang in PHP:

if (isset($_POST['submit'])) {
  extract($_POST);
  require_once('mail/class.phpmailer.php');

  $subject = "$name Applied For - $position";
  $email_message = "<div>Thanks for Applying ....</div> ";

  $mail = new PHPMailer;
  $mail->IsSMTP(); // telling the class to use SMTP
  $mail->Host = "mail.companyname.com"; // SMTP server
  $mail->SMTPDebug = 0;
  $mail->SMTPAuth = true;
  $mail->SMTPSecure = "ssl";
  $mail->Host = "smtp.gmail.com";
  $mail->Port = 465;
  $mail->IsHTML(true);
  $mail->Username = "[email protected]";  // GMAIL username
  $mail->Password = "mailPassword";          // GMAIL password

  $mail->SetFrom('[email protected]', 'new application submitted');
  $mail->AddReplyTo("[email protected]","First Last");
  $mail->Subject = "your subject";

  $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

  $mail->MsgHTML($email_message);

  $address = '[email protected]';
  $mail->AddAddress($address, "companyname");

  $mail->AddAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']);      // attachment

  if (!$mail->Send()) {
    /* Error */
    echo 'Message not Sent! Email at [email protected]';
  } else {
    /* Success */
    echo 'Sent Successfully! <b> Check your Mail</b>';
  }
}

Ich habe diesen Code für das Versenden von Google SMTP-E-Mails mit Anhang verwendet.

Hinweis: Laden Sie die PHPMailer-Bibliothek von hier herunter -> https://github.com/PHPMailer/PHPMailer

Irshad Khan
quelle