por - funcion mail php adjuntar archivo
Enviar archivo adjunto del formulario mediante phpMailer y PHP (7)
Tengo un formulario en example.com/contact-us.php
que se ve así (simplificado):
<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>
En mi archivo process.php
, tengo el siguiente código que utiliza PHPMailer()
para enviar un correo electrónico:
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.";
El correo electrónico envía el cuerpo correctamente, pero sin el Adjunto de uploaded_file
.
MI PREGUNTA
Necesito el archivo uploaded_file
del formulario para adjuntarlo al correo electrónico y enviarlo. NO me importa guardar el archivo después de que el script process.php
envíe en un correo electrónico.
Entiendo que necesito agregar AddAttachment();
en algún lugar (estoy asumiendo en la línea del Body
) para que se envíe el archivo adjunto. Pero...
- ¿Qué debo poner en la parte superior del archivo
process.php
para obtener el archivouploaded_file
? ¿Te gusta algo usando$_FILES[''uploaded_file'']
para obtener el archivo de la página contact-us.php? - Qué va dentro de
AddAttachment();
para que el archivo se adjunte y se envíe junto con el correo electrónico y ¿a dónde debe ir este código?
Por favor ayuda y proporciona el código! Gracias!
El archivo no se pudo adjuntar desde la PC del cliente (cargar)
En el formulario HTML, no he agregado la siguiente línea, por lo que no estaba adjunto:
enctype = "multipart / form-data"
Después de agregar la línea superior en el formulario (como se muestra a continuación), el archivo adjunto fue perfecto.
<form id="form1" name="form1" method="post" action="form_phpm_mailer.php" enctype="multipart/form-data">
En mi propio caso, estaba usando serialize()
en el formulario, por lo tanto, los archivos no se enviaron a php. Si está usando jquery, use FormData()
. Por ejemplo
<form id=''form''>
<input type=''file'' name=''file'' />
<input type=''submit'' />
</form>
Usando 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
});
Este código me ayuda en el envío de archivos adjuntos ...
$mail->AddAttachment($_FILES[''file''][''tmp_name''], $_FILES[''file''][''name'']);
Reemplace su código AddAttachment (...) con el código anterior
Hola chicos, el código siguiente funcionó perfectamente bien para mí. Simplemente reemplace setFrom y addAddress con su preferencia y eso es todo.
<?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>
Tratar:
if (isset($_FILES[''uploaded_file'']) &&
$_FILES[''uploaded_file''][''error''] == UPLOAD_ERR_OK) {
$mail->AddAttachment($_FILES[''uploaded_file''][''tmp_name''],
$_FILES[''uploaded_file''][''name'']);
}
El ejemplo básico también se puede encontrar here .
La definición de función para AddAttachment
es:
public function AddAttachment($path,
$name = '''',
$encoding = ''base64'',
$type = ''application/octet-stream'')
Utilice este código para enviar archivos adjuntos con la opción de cargar archivo usando el formulario html en phpmailer
<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> '';
}
}
?>
Use este link para referencia.
Utilizaría $_FILES[''uploaded_file''][''tmp_name'']
, que es la ruta donde PHP almacenó el archivo cargado (es un archivo temporal, eliminado automáticamente por PHP cuando termina el script, a menos que lo haya movido / copiado) en otra parte).
Suponiendo que la configuración del lado del cliente y la del lado del servidor son correctas, no hay nada que tenga que hacer para "subir" la carga. Simplemente estará mágicamente disponible en esa ruta tmp_name.
Tenga en cuenta que tendrá que validar que la carga realmente tuvo éxito, por ejemplo
if ($_FILES[''uploaded_file''][''error''] === UPLOAD_ERR_OK) {
... attach file to email ...
}
De lo contrario, puede tratar de hacer un archivo adjunto con un archivo dañado / parcial / inexistente.