3

ユーザーが添付ファイルをアップロードして電子メールに送信できるようにする PHP フォームを作成しています。私はそれを作るためにかなり長い間探してきました。で、やっと見つけたこれ。http://www.shotdev.com/php/php-mail/php-send-email-upload-form-attachment-file/ . それは正常に動作します。しかし、自分で修正(フィールドを変更)すると、うまくいかないことがあります。

<?php

$location=$_POST['location'];
$name_ha=$_POST['name_ha'];
$name_person=$_POST['name_person'];
$email=$_POST['email'];
$date_sent=$_POST['date_sent'];
$date_completed=$_POST['date_completed'];
$date_received=$_POST['date_received'];

$to="admin@admin.com" . "$email";

$message="to";

//*** Uniqid Session ***//
$sid = md5(uniqid(time()));

$header = "";
$header .= "From: ".$_POST["name_ha"]."<".$_POST["email"].">\nReply-To: ".$_POST["email"]."";

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

$header .= "--".$sid."\n";
$header .= "Content-type: text/html; charset=utf-8\n";
$header .= "Content-Transfer-Encoding: 7bit\n\n";
$header .= $message."\n\n";

//*** Attachment ***//
if($_FILES["fileAttach"]["name"] != "")
{
    $FilesName = $_FILES["fileAttach"]["name"];
    $Content = chunk_split(base64_encode(file_get_contents($_FILES["fileAttach"]["tmp_name"]))); 
    $header .= "--".$sid."\n";
    $header .= "Content-Type: application/octet-eam; name=\"".$FilesName."\"\n"; 
    $header .= "Content-Transfer-Encoding: base64\n";
    $header .= "Content-Disposition: attachment; filename=\"".$FilesName."\"\n\n";
    $header .= $Content."\n\n";
}

$flgSend = @mail($to,"A new file for you!",null,$header);  // @ = No Show Error //

if ($flgSend)
{
    echo "Mail sent.";
}

?>

shotdev.com からダウンロードしたファイルと変更したファイルは、同じサーバーの同じフォルダーにホストされています。しかし、私が修正したものでは、ファイル サイズが 1 MB を超えると、添付ファイルがアップロードされる前に (アップロード プロセスの ~ 45%)、電子メールが送信されます。受信したメールには添付ファイルがなく、差出人 ($name_ha) の情報もありません。一方、shotdev.com でダウンロードしたファイルの場合、添付ファイルのサイズに関係なく、添付ファイルが完全にアップロードされた後にのみ電子メールが送信されます。

スクリプトのエラー、または何かが不足しているため、このようなことが発生していませんか? あなたの時間と助けに感謝します。

4

1 に答える 1

1

まず、例として示したコードでは、次の行にエラーがあります。

$to="admin@admin.com" . "$email";

次のように変更します。

$to="admin@admin.com, " . "$email";
  • 不足しているコンマに注意してください...その特定の方法で追加したいすべての新しい受信者の電子メールに必要です...

また、サーバーでコードをテストしましたが、すべて正常に動作します。
100 mbps のアップロードがあり、4.5 MB のファイルを試しましたが、動作します。

したがって、アップロード速度と、このメールを送信するために呼び出している php スクリプトの許容実行時間に問題がある可能性があります。

<?phpaction="something.php" として HTML 形式で設定した php ファイルの直後に、以下を追加してみてください。

set_time_limit(0);

つまり、スクリプトの実行時間に制限がないことを意味し、0 を目的の秒数に変更します...

また、エラーを表示する必要がある場合は、@mail() 関数の前に @ を削除します。エラーを非表示にしても、何の役にも立ちません。

編集:

最初にファイルがあるかどうか、そうでない場合は添付なしでメールを送信するかどうかを確認するように、コードを変更しました。そして、ファイルがある場合は、それがbase64にエンコードされて分割されているかどうかを確認し、その場合は添付ファイル付きのメールを送信します...

<?php

$location=$_POST['location'];
$name_ha=$_POST['name_ha'];
$name_person=$_POST['name_person'];
$email=$_POST['email'];
$date_sent=$_POST['date_sent'];
$date_completed=$_POST['date_completed'];
$date_received=$_POST['date_received'];
$FilesName = $_FILES["fileAttach"]["name"];

$to = "admin@mail.com," . "$email";

$message = "to";

$sid = md5(uniqid(time()));

$header = "";
$header .= "From: ".$_POST["name_ha"]."<".$_POST["email"].">\nReply-To: ".$_POST["email"]."";

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

$header .= "--".$sid."\n";
$header .= "Content-type: text/html; charset=utf-8\n";
$header .= "Content-Transfer-Encoding: 7bit\n\n";
$header .= $message."\n\n";


if($_FILES["fileAttach"]["name"] != "") {


    $Content = chunk_split(base64_encode(file_get_contents($_FILES["fileAttach"]["tmp_name"]))); 
    $header .= "--".$sid."\n";
    $header .= "Content-Type: application/octet-stream; name=\"".$FilesName."\"\n"; 
    $header .= "Content-Transfer-Encoding: base64\n";
    $header .= "Content-Disposition: attachment; filename=\"".$FilesName."\"\n\n";
    $header .= $Content."\n\n";

}

if (strlen($FilesName) > 0) {

    if ($Content) {

        $flgSend = mail($to,"Here is that file",null,$header);

    }
    else {

        echo "problem with file...";

    }

}
else {

    $flgSend = mail($to,"Here is that file",null,$header);

}

if ($flgSend) {

    echo "Mail sent.";

}

?>

ここにそれのためのHTMLがあります:

<html>
<head>
</head>
<body>
<form method="post" action="sender.php" enctype="multipart/form-data" >
    location: <input type="text" name="location" />
    <br />
    name_ha: <input type="text" name="name_ha" />
    <br />
    name_person: <input type="text" name="name_person" />
    <br />
    email: <input type="text" name="email" />
    <br />
    date_sent: <input type="text" name="date_sent" />
    <br />
    date_completed: <input type="text" name="date_completed" />
    <br />
    date_received: <input type="text" name="date_received" />
    <br />
    file: <input type="file" name="fileAttach" />
    <br />
    <input type="submit" value="submit" />
</form>
</body>
</html>
于 2012-10-08T10:21:49.453 に答える