76

次のようなフォームがありexample.com/contact-us.phpます(簡略化):

<form method="post" action="process.php" enctype="multipart/form-data">
  <input type="file" name="uploaded_file" id="uploaded_file" />
  <input type="hidden" name="MAX_FILE_SIZE" value="10000000" />
</form>

私のprocess.phpファイルにはPHPMailer()、電子メールを送信するために利用する次のコードがあります。

require("phpmailer.php");

$mail = new PHPMailer();

$mail->From     = me@example.com;
$mail->FromName = My name;
$mail->AddAddress(me@example.com,"John Doe");

$mail->WordWrap = 50;
$mail->IsHTML(true);

$mail->Subject  =  "Contact Form Submitted";
$mail->Body     =  "This is the body of the message.";

電子メールは本文を正しく送信しますが、添付ファイルはありませんuploaded_file

私の質問

フォームのファイルuploaded_fileをメールに添付して送信する必要があります。process.phpスクリプトがメールでファイルを送信した後、ファイルを保存することは気にしません。

添付ファイルを送信するには、AddAttachment();どこかに追加する必要があることを理解しています(行の下にあると想定しています)。Bodyしかし...

  1. process.phpファイルを取り込むには、ファイルの先頭に何を入力すればよいですuploaded_fileか? $_FILES['uploaded_file']contact-us.php ページからファイルを取得するために何かを使用するようなものですか?
  2. AddAttachment();ファイルを添付して電子メールと一緒に送信するには、 の内部には何があり、このコードはどこに行く必要がありますか?

助けてコードを提供してください!ありがとう!

4

8 に答える 8

114

試す:

if (isset($_FILES['uploaded_file']) &&
    $_FILES['uploaded_file']['error'] == UPLOAD_ERR_OK) {
    $mail->AddAttachment($_FILES['uploaded_file']['tmp_name'],
                         $_FILES['uploaded_file']['name']);
}

基本的な例もここにあります。

の関数定義AddAttachmentは次のとおりです。

public function AddAttachment($path,
                              $name = '',
                              $encoding = 'base64',
                              $type = 'application/octet-stream')
于 2012-08-01T17:12:21.987 に答える
7

クライアントPCからのファイル添付(アップロード)ができませんでした

HTMLフォームでは、次の行を追加していないため、添付ファイルはありませんでした:

enctype="multipart/form-data"

上記の行をフォームに追加した後(以下のように)、添付ファイルは完璧になりました.

<form id="form1" name="form1" method="post" action="form_phpm_mailer.php"  enctype="multipart/form-data">
于 2012-12-15T19:07:49.650 に答える
1

このコードを使用して、phpmailer の html フォームを使用してアップロード ファイル オプションで添付ファイルを送信します。

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


                    <input type="text" name="name" placeholder="Your Name *">
                    <input type="email" name="email" placeholder="Email *">
                    <textarea name="msg" placeholder="Your Message"></textarea>


                    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
                    <input type="file" name="userfile"  />


                <input name="contact" type="submit" value="Submit Enquiry" />
   </form>


    <?php




        if(isset($_POST["contact"]))
        {

            /////File Upload

            // In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
            // of $_FILES.

            $uploaddir = 'uploads/';
            $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

            echo '<pre>';
            if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
                echo "File is valid, and was successfully uploaded.\n";
            } else {
                echo "Possible invalid file upload !\n";
            }

            echo 'Here is some more debugging info:';
            print_r($_FILES);

            print "</pre>";


            ////// Email


            require_once("class.phpmailer.php");
            require_once("class.smtp.php");



            $mail_body = array($_POST['name'], $_POST['email'] , $_POST['msg']);
            $new_body = "Name: " . $mail_body[0] . ", Email " . $mail_body[1] . " Description: " . $mail_body[2];



            $d=strtotime("today"); 

            $subj = 'New enquiry '. date("Y-m-d h:i:sa", $d);

            $mail = new PHPMailer(); // create a new object


            //$mail->IsSMTP(); // enable SMTP
            $mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only ,false = Disable 
            $mail->Host = "mail.yourhost.com";
            $mail->Port = '465';
            $mail->SMTPAuth = true; // enable 
            $mail->SMTPSecure = true;
            $mail->IsHTML(true);
            $mail->Username = "admin@domain.net"; //from@domainname.com
            $mail->Password = "password";
            $mail->SetFrom("admin@domain.net", "Your Website Name");
            $mail->Subject = $subj;
            $mail->Body    = $new_body;

            $mail->AddAttachment($uploadfile);

            $mail->AltBody = 'Upload';
            $mail->AddAddress("recipient@domain.com");
             if(!$mail->Send())
                {
                echo "Mailer Error: " . $mail->ErrorInfo;
                }
                else
                {

                echo '<p>       Success              </p> ';

                }

        }



?>

このリンクを参照してください。

于 2017-12-26T11:33:38.870 に答える
1

このコードは、添付ファイルの送信に役立ちます....

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

AddAttachment(...) コードを上記のコードに置き換えます

于 2016-06-02T10:50:11.503 に答える
0

を使用します$_FILES['uploaded_file']['tmp_name']。これは、PHP がアップロードされたファイルを保存したパスです (これは一時ファイルであり、他の場所に移動またはコピーしていない限り、スクリプトの終了時に PHP によって自動的に削除されます)。

クライアント側のフォームとサーバー側のアップロード設定が正しいと仮定すると、アップロードを「プル」するために必要なことは何もありません。その tmp_name パスで魔法のように利用できるようになります。

アップロードが実際に成功したことを検証する必要があることに注意してください。

if ($_FILES['uploaded_file']['error'] === UPLOAD_ERR_OK) {
    ... attach file to email ...
}

そうしないと、破損した/部分的な/存在しないファイルを添付しようとする可能性があります。

于 2012-08-01T17:13:45.813 に答える
0

皆さん、以下のコードは私にとっては完璧に機能しました。setFrom と addAddress を好みのものに置き換えるだけです。

<?php
/**
 * PHPMailer simple file upload and send example.
 */
//Import the PHPMailer class into the global namespace
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$msg = '';
if (array_key_exists('userfile', $_FILES)) {
    // First handle the upload
    // Don't trust provided filename - same goes for MIME types
    // See http://php.net/manual/en/features.file-upload.php#114004 for more thorough upload validation
    $uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name']));
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) 
    {
        // Upload handled successfully
        // Now create a message

        require 'vendor/autoload.php';
        $mail = new PHPMailer;
        $mail->setFrom('info@example.com', 'CV from Web site');
        $mail->addAddress('blabla@gmail.com', 'CV');
        $mail->Subject = 'PHPMailer file sender';
        $mail->Body = 'My message body';

        $filename = $_FILES["userfile"]["name"]; // add this line of code to auto pick the file name
        //$mail->addAttachment($uploadfile, 'My uploaded file'); use the one below instead

        $mail->addAttachment($uploadfile, $filename);
        if (!$mail->send()) 
        {
            $msg .= "Mailer Error: " . $mail->ErrorInfo;
        } 
        else 
        {
            $msg .= "Message sent!";
        }
    } 
        else 
        {
            $msg .= 'Failed to move file to ' . $uploadfile;
        }
}
?>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>PHPMailer Upload</title>
</head>
<body>
<?php if (empty($msg)) { ?>
    <form method="post" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="4194304" />
        <input name="userfile" type="file">
        <input type="submit" value="Send File">
    </form>

<?php } else {
    echo $msg;
} ?>
</body>
</html>
于 2018-02-16T11:04:10.540 に答える