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 = [email protected];
$mail->FromName = My name;
$mail->AddAddress([email protected],"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
行の下にあると想定しています)。しかし...
process.php
を取り込むためにuploaded_file
ファイルの先頭に何を置くのですか? contact_us.phpページからファイルを取り込むために$_FILES['uploaded_file']
を使用するものが好きですか?AddAttachment();
の内部には、ファイルが添付されてメールとともに送信され、このコードはどこに行く必要がありますか?助けてコードを提供してください!ありがとう!
試してください:
if (isset($_FILES['uploaded_file']) &&
$_FILES['uploaded_file']['error'] == UPLOAD_ERR_OK) {
$mail->AddAttachment($_FILES['uploaded_file']['tmp_name'],
$_FILES['uploaded_file']['name']);
}
基本的な例は here にもあります。
AddAttachment
の関数定義は次のとおりです。
public function AddAttachment($path,
$name = '',
$encoding = 'base64',
$type = 'application/octet-stream')
HTMLフォームでは、次の行を追加していないため、添付ファイルは送信されませんでした。
enctype = "multipart/form-data"
フォームに上記の行を追加した後(以下を参照)、添付ファイルは完璧になりました。
<form id="form1" name="form1" method="post" action="form_phpm_mailer.php" enctype="multipart/form-data">
このコードは、添付ファイルの送信に役立ちます。
$mail->AddAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']);
AddAttachment(...)コードを上記のコードに置き換えます
$_FILES['uploaded_file']['tmp_name']
を使用します。これはPHPがアップロードされたファイルを保存したパスです(一時ファイルであり、スクリプトの終了時にPHPによって自動的に削除されます。他の場所に移動/コピーしました)。
クライアント側のフォームとサーバー側のアップロード設定が正しいと仮定すると、アップロードを「プルイン」するために必要なことは何もありません。 tmp_nameパスで魔法のように利用できるようになります。
アップロードが実際に成功したことを検証する必要があることに注意してください。
if ($_FILES['uploaded_file']['error'] === UPLOAD_ERR_OK) {
... attach file to email ...
}
そうでない場合は、破損した/部分的な/存在しないファイルを添付しようとする場合があります。
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 = "[email protected]"; //[email protected]
$mail->Password = "password";
$mail->SetFrom("[email protected]", "Your Website Name");
$mail->Subject = $subj;
$mail->Body = $new_body;
$mail->AddAttachment($uploadfile);
$mail->AltBody = 'Upload';
$mail->AddAddress("[email protected]");
if(!$mail->Send())
{
echo "Mailer Error: " . $mail->ErrorInfo;
}
else
{
echo '<p> Success </p> ';
}
}
?>
これを参照してください link .
私自身の場合、フォームでserialize()
を使用していたため、ファイルはphpに送信されませんでした。 jqueryを使用している場合は、FormData()
を使用します。例えば
<form id='form'>
<input type='file' name='file' />
<input type='submit' />
</form>
Jqueryを使用して、
$('#form').submit(function (e) {
e.preventDefault();
var formData = new FormData(this); // grab all form contents including files
//you can then use formData and pass to ajax
});
皆さん、次のコードは私にとって完璧に機能しました。 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('[email protected]', 'CV from Web site');
$mail->addAddress('[email protected]', '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>
これは完全に機能します
<form method='post' enctype="multipart/form-data">
<input type='file' name='uploaded_file' id='uploaded_file' multiple='multiple' />
<input type='submit' name='upload'/>
</form>
<?php
if(isset($_POST['upload']))
{
if (isset($_FILES['uploaded_file']) && $_FILES['uploaded_file']['error'] == UPLOAD_ERR_OK)
{
if (array_key_exists('uploaded_file', $_FILES))
{
$mail->Subject = "My Subject";
$mail->Body = 'This is the body';
$uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['uploaded_file']['name']));
if (move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $uploadfile))
$mail->addAttachment($uploadfile,$_FILES['uploaded_file']['name']);
$mail->send();
echo 'Message has been sent';
}
else
echo "The file is not uploaded. please try again.";
}
else
echo "The file is not uploaded. please try again";
}
?>