Ir para o conteúdo
sEnte

Anexos PHP

Mensagens Recomendadas

sEnte

dá para enviar anexos?

Editado por sEnte

"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sEnte

Descobri uma maneira mais simples mas agota tenho dificuldade em lidar com o ficheiro


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sEnte

Andei a mexer nisto e já consegui alguma coisa, mas mesmo assim ainda continuo com problemas...

<?php

if(empty($_POST) === false){
$errors = array();

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$file = $_FILES['filename'];

if(empty($name) === true || empty($email) === true || empty($message) === true){
	$errors[] = 'Name, email and message are required!';
} else {
	if(filter_var($email, FILTER_VALIDATE_EMAIL) === false){
		$errors[] ='Not a valid email';
	}
	if(ctype_alpha($name) === false){
		$errors[] ='Name must only contain letters';
	}
}

if(empty($errors) === true){ 
	$boundary = md5(rand());

	$headers = array(
		'MIME-Version: 1.0',
		"Content-type: multipart/mixed; boundary=\"{$boundary}\"",
		"From: {$email}"
	);
	$message = array(
		"--{$boundary}",
		'Content-type: text/html',
		'Content-Transfer-Encoding: 7bit',
		'',
		chunk_split($message),
		"--{$boundary}",
		"Content-type: {$file['type']}; name=\"{$file['filename']}\"",
		"Content-Disposition: attachment; filename=\"{$file['filename']}\"",
		'Content-Transfer-Encoding: base64',
		'',
		chunk_split(base64_encode(file_get_contents($file['tmp_name']))),
		"--{$boundary}--"
	);

	//send email
	mail($email, 'Contact form', implode("\r\n", $message), implode("\r\n", $headers));

	//redirect user
	header('Location: index.php?sent');
	exit();
}    
}

?>

manda o fichiero mas o nome não vai como deve ser (se for por exemplo ficheiros jpg ou pdf vai mas se mandar por exemplo php já não vai)

Queria pegar o type e size do ficheiro para mandar, e depois mais tarde fazer uma verificação de tipo de ficheiro e tamanho.

Se quiserem experimentar.... Vão receber o mail no vosso mail como podem confirmar pelo código

http://exp.net84.net/testcontact.php

Editado por brunoais
código retirado do pastebin

"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Parece-me que o servidor aonde tens isso não permite o envio de ficheiros com a extensão php...

Já tentaste ver os logs?


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sEnte

logs? não.

Estou a mandar para o gmail e o servidor é o 000wenhost

O que acontece é que como disse se mandar jpg ou pdf funciona mas se mandar um ficheiro php por exemplo o nome nem seqer fica como deve ser.


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Então vai ver os logs na tua conta no "000wenhost". É lá que está a razão pq é que o ficheiro não está a ser enviado.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sEnte

O ficheiro envia, eu é que não consigo fazer com que envie o nome como está no computador e a respectiva extensão.


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Faz echo do nome no script q está no servidor e confirma o que aparece.

Faz tb echo do e-mail completo que envias.

Escreve aqui o output entro de tags

.

Assim já devo conseguir ajudar-te.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sEnte

Não estou a perceber.

quando faço

echo '$_FILES'; apenas aparece isto Array

do mail pralem do nome que não aparece em lado nenhum, meto o mail que é para onde vai o mail e o camplo $message é uma cena muito random. carego num monte de letras e pronto.

Posso estar enganado mas deve ser alguma coisa aqui que não está a funcionar.

		    $message = array(
				    "--{$boundary}",
				    'Content-type: text/html',
				    'Content-Transfer-Encoding: 7bit',
				    '',
				    chunk_split($message),
				    "--{$boundary}",
				    "Content-type: {$file['type']}; name=\"{$file['filename']}\"",
				    "Content-Disposition: attachment; filename=\"{$file['filename']}\"",
				    'Content-Transfer-Encoding: base64',
				    '',
				    chunk_split(base64_encode(file_get_contents($file['tmp_name']))),
				    "--{$boundary}--"
		    );

Editado por sEnte

"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Nem era suposto fazeres echo de um array. Só era suposto fazeres do nome do ficheiro.

É normal no $message aparecer um monte de "jiberish" mas realmente sabes o que interessa nesse "jibberish"?

De qq modo faz como te pedi.

Faz echo do resultado de:

implode("\r\n", $message)


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sEnte

o que tentei fazer diz apenas Array

implode(" ", Array)

tentei fazer também

echo "$_FILES['filename']";

e aparece Array

Editado por sEnte

"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Lê o que escrevi com atenção.

Não estás a fazer o que pedi


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Procura por:

mail($email, 'Contact form', implode("\r\n", $message), implode("\r\n", $headers));

Escreve depois:

echo implode("\r\n", $message);
echo "\n\n\n\n";
echo $_FILES['filename']['name'];

eu quero esse output.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sEnte

Ai não queres não lol

tem aqui o equivalente a umas 10 ou 15 páginas de texto maluco, caracteres sem o menor nexo


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sEnte

aqui fica a solução do amigo brunoais

<?php
error_reporting(-1);
if(empty($_POST) === false){
$errors = array();

$name = $_POST['name'];
$email = $_POST['email'];
$file = $_FILES['filename'];

if(empty($name) === true || empty($email) === true || empty($_POST['message']) === true){
 $errors[] = 'Name, email and message are required!';
} else {
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === false){
  $errors[] ='Not a valid email';
 }
 if(ctype_alpha($name) === false){
  $errors[] ='Name must only contain letters';
 }
}
$message;
if(empty($errors) === true){
 if($_FILES['filename']['error'] == UPLOAD_ERR_OK){
  $boundary = '-----' . md5(rand()) . '---';
  $headers = array(
   'MIME-Version: 1.0',
   "Content-type: multipart/mixed; boundary=\"{$boundary}\"",
   "From: {$email}"
  );
  $message = array(
   "--{$boundary}",
   'Content-type: text/html',
   'Content-Transfer-Encoding: 7bit',
   '',
   chunk_split($_POST['message']),
   "--{$boundary}",
   "Content-type: {$file['type']}; name=\"{$file['name']}\"",
   "Content-Disposition: attachment; filename=\"{$file['name']}\"",
   'Content-Transfer-Encoding: base64',
   '',
   chunk_split(base64_encode(file_get_contents($file['tmp_name']))),
   "--{$boundary}--"
  );
  $message = implode("\r\n", $message);
 } else {
  $headers = array(
   "From: {$email}"
  );
  $message = &$_POST['message'];
 }
 //send email
 var_dump(mail($email, 'Contact form', $message, implode("\r\n", $headers)));

		    echo $_FILES['filename']['name'];
 /*//redirect user
 header('Location: index.php?sent');
 exit();*/
}   
}

?>

<!doctype html>
<html>
<head>
 <title>A contact form</title>
</head>
<body>
 <?php
  if(isset($_GET['sent']) === true){
   echo '<p>Thanks for contacting us</p>';
  } else {
   if(empty($errors) === false){
 echo '<ul>';
 foreach($errors as $error){
  echo '<li>', $error ,'</li>';
 }
 echo '</ul>';
   }
    ?>
    <form action="" method="post" enctype="multipart/form-data">
	    <p>
		    <label for="name">Name:</label><br />
		    <input type="text" name="name" id="name" <?php if(isset($_POST['name']) === true){ echo 'value="', strip_tags($_POST['name']), '"';} ?>>
	    </p>
	    <p>
		    <label for="email">Email:</label><br />
		    <input type="text" name="email" id="email" <?php if(isset($_POST['email']) === true){ echo 'value="', strip_tags($_POST['email']), '"';} ?>>
	    </p>
	    <p>
		    <label for="message">Message:</label><br />
		    <textarea name="message" id="message"><?php if(isset($_POST['message']) === true){ echo strip_tags($_POST['message']); } ?></textarea>
	    </p>
	    <p>
		    List of files allowed: .pdf, .odt, .doc(x), xls(x), ppt(x), xps, xml
	    </p>
	    <p>
		    <input type="file" name="filename">
	    </p>
	    <p>
		    <input type="submit" value="submit">
	    </p>
    <?php
	    }
    ?>
    </form>
</body>
</html>


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Bah... É preciso indicar qual era o problema, não?

De qq modo, o problema estava relacionado com o mau uso do array $_FILES que provocava um output errado.

Quando vi o código que aparece no 3º post não reparei, por causa dos alias, que o $_FILES estava a ser mal usado, então o e-mail estava a ser enviado sem o nome para o servidor de e-mail. Era o servidor de e-mail que estava a adivinhar o nome para alguns tipos de ficheiro.

Esta aqui é uma boa solução para se pegar como alternativa a usar "coisas" como o PHPMailer. Pelo menos fica-se a perceber melhor como é que o e-mail funciona de mais baixo nível.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sEnte

PHPMailer? nunca usei nada disso.

ahah esqueci-me de indicar o problema xD

De qualquer forma ainda fiz uma limpeza a esse código, porque tinhas coisas que não interessavam tal como o error_reporting, os var_dump e um echo que aí estava.

Agora o mais importante será segurar os inputs para não haver SQL Injections nem nada do tipo.

sei que posso usar

mysql_real_escape string()
htmlentities()
trim()
strip_tags()

no entanto nunca percebi muito bem se o mysql_real_escape string() é só para quando há SQL envolvido ou não...

A seguir vai ser feita uma verificação de extensões, e pode-se enviar apenas um determinado tipo de extensãoes tal como .pdf, .odt, .doc(x), xls(x), ppt(x), xps, xml

Outra coisa que me lembrei de fazer por exemplo Se as extensões forem aquelas manda normalmente, se for outras chama a função ZipArchive() mas sinceramente aindanão sei bem

Editado por sEnte

"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.