Phpmailer SMTP

  • Creatore Discussione Creatore Discussione Rey
  • Data di inizio Data di inizio

Rey

Utente Attivo
11 Set 2012
73
0
6
Salve a tutti, ho un form con phpmailer che spedisce senza problemi le email tramite smtp, questo è il codice:

PHP:
<?

require "class.phpmailer.php";

$nome = $_POST["nome"];
$mail = $_POST["mail"];

$messaggio = new PHPmailer();
$messaggio->Mailer='smtp';
$messaggio->Host='mail.mioserver.com';
$messaggio->Port='25';
$messaggio->SMTPAuth=true;
$messaggio->Username='mia@mail.com';
$messaggio->Password='miapass';
$messaggio->IsHTML(true);

$messaggio->From="mia@mail.com";
$messaggio->FromName="$name";
$messaggio->AddAddress("$mail");
$messaggio->Subject='Test';
$messaggio->Body="Ciao sono $nome";

if(!$messaggio->Send()){ 
  echo $messaggio->ErrorInfo; 
}else{ 
  echo 'Email inviata correttamente!';
}


$messaggio->SmtpClose();
unset($messaggio);
?>

Una volta ricevute le email dal form se clicco su rispondi viene selezionata l'email dell'smtp che uso per spedire. Ovviamente ho pensato di modificare il From mettendo $mail però ho pensato, gmail si vede arrivare una email da mia@mail.com e dice di provenire da mail@delmittente.com, la cosa non vorrei venisse vista alla lunga come spam/pishing (parliamo di 20 email dal form al giorno circa). Gironzolando per il class.phpmailer.php ho trovato questo:

PHP:
  /**
   * Sets the Sender email (Return-Path) of the message.  If not empty,
   * will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
   * @var string
   */
  public $Sender            = '';

Quindi mettendo $messaggio->Sender="$mail"; ? O è lo stesso discorso di prima? cosa ne pensate?


Grazie a tutti :)
 
Come soluzione per non essere scambiati per degli spammoni potrebbe andare bene, semmai ti consiglio un'altra cosa: non usare "<?" come delimitatore di apertura per il codice, è deprecato, usa invece "<?php".
 
Ok, ho corretto con <?php. Il fatto è che cercando ci sono molte persone che usano AddReplayTo=""; e non capisco se essendo post vecchi utilizzavano una versione di phpmailer precedente ed ora quel valore è sostituito da Sender oppure si può usare, insomma non capisco la differenza :)
 
Ok, ho corretto con <?php. Il fatto è che cercando ci sono molte persone che usano AddReplayTo=""; e non capisco se essendo post vecchi utilizzavano una versione di phpmailer precedente ed ora quel valore è sostituito da Sender oppure si può usare, insomma non capisco la differenza :)

Lo puoi usare, basta che vedi nella classe. Funziona bene :)
 
Perfetto grazie manu ora è a posto, l'ultima cosa è lo spam, questa volta riguardo agli spambot, per esperienza prevedo che il form ne venga invaso, quindi avevo pensato di controllare le variabili ottenute con qualcosa di questo tipo:

PHP:
if (strpos($_POST['note'], 'http')

in modo che se viene rilevata una determinata badword l'email non parte restituendo un errore però non so come integrarlo..
 
Ultima modifica:
Ho provato così:

PHP:
[...]
$mail->Body    = "$messaggio</b>";
// $mail->AltBody = "This is the body in plain text for non-HTML mail clients";

if(strpos($note,'http') || strpos($note,'www') || strpos($note,'HTTP') || strpos($note,'WWW') {
   echo "Spam detected.";
	exit;
}

if(!$mail->Send())
{
   echo "Message could not be sent. <p>";
   echo "Mailer Error: " . $mail->ErrorInfo;
   exit;
}
    header('Location: mail-ok.html');
?>

Parse error: syntax error, unexpected '{' in /home/xxx/domains/xxx.com/public_html/test/mail.php on line 166

la 166 è quella dell'if(strpos
 
Perdonate il triplo post, non mi fa editare i precedenti, l'errore era una parentesi mancante, ora sono giunto a questo:

PHP:
if((strpos($note,'http') === true) || (strpos($note,'www') === true) || (strpos($note,'HTTP') === true) || (strpos($note,'WWW') === true)) {
   echo "Spam detected.";
	exit;
}

solo che indipendentemente da dove lo metto, lo script non si interrompe e l'email viene inviata, non riesco a capire perchè :confused:
 
strpos non restituisce mai true, ma la posizione della stringa cercata, o false se non la trova. Quindi devi cambiare così:
PHP:
if (strpos($note, 'http') !== false || strpos($note, 'www') !== false || strpos($note, 'HTTP') !== false || strpos($note, 'WWW') !== false) {
    exit('Spam detected.');
}
 
grazie per la dritta alessandro, ho provato ma le email continuano a partire.. ho provato nel tuo modo e anche a scriverlo così:

PHP:
if((strpos($note,'http') === false) && (strpos($note,'www') === false) && (strpos($note,'HTTP') === false) && (strpos($note,'WWW') === false)) {
    exit('Spam detected.');
}

Ho provato anche a racchiudere tutto in un if ma sembra non piacergli:

PHP:
if((strpos($note,'http') === false) && (strpos($note,'www') === false) && (strpos($note,'HTTP') === false) && (strpos($note,'WWW') === false)) {


$mail = new PHPMailer();

$mail->IsSMTP();                                      // set mailer to use SMTP
$mail->Host = "xxx.com";  // specify main and backup server
$mail->SMTPAuth = true;     // turn on SMTP authentication
$mail->Username = "xxx";  // SMTP username
$mail->Password = "xxx"; // SMTP password

$mail->From = "xxxx";
$mail->FromName = "$nomemittente";
$mail->AddAddress("xxx");                  // name is optional
$mail->AddReplyTo("$email", "$nome");

// $mail->WordWrap = 50; 
$mail->IsHTML(true);                                  // set email format to HTML

$mail->Subject = "$nomemittente - $subjectnew";
$mail->Body    = "$messaggio</b>";
// $mail->AltBody = "This is the body in plain text for non-HTML mail clients";


if(!$mail->Send())
{
   echo "Message could not be sent. <p>";
   echo "Mailer Error: " . $mail->ErrorInfo;
   exit;
}
    header('Location: mail-ok.html');
else {
exit('spam detected.');
}
}
?>
 
Nessuno mi sa aiutare? vorrei che prima che l'email parta sia fatto un check sul campo note (è una textarea di un form) e se non trova *http* o *www* fa partire, altrimenti mostra un errore :)
 
ciao
se non ho capito male se nella variabile $note trova un HTTP o un WWW l'email non deve partire.
prova così
PHP:
<?php
//.....
if(strpos(strtolower($note,'http') !== false || strpos(strtolower($note,'www') !== false){//ha trovato un http o un www
	header('Location: mail-errore.php?err=1');
	exit();
}else{
	if($mail->Send()){
		header('Location: mail-ok.php');
		exit();
	}else{
		header('Location: mail-errore.php?err=2');
		exit();
	} 
}
?>
poi nella pag mail-errore.php raccogli l'errore e se 1 scrivi spamboot se 2 scrivi errore di trasmissione
 
ciao borgo, non funziona, ho trovato un paio di parentesi aperte in strpos che ho chiuso, inoltre (io sono un novellino in php eh) ma dopo l'if non ci va else if e poi l'ultimo else? ecco come ho provato a sistemarlo ma mi da questo errore:

Parse error: syntax error, unexpected '{', expecting '(' in /home/xxxx/domains/xxxx.com/public_html/test/mail.php on line 169


PHP:
if(strpos(strtolower($note,'http')) !== false || strpos(strtolower($note,'www') !== false)){//ha trovato un http o un www
    header('Location: mail-errs.html');
    exit();
} else if { // <------ linea 169
    ($mail->Send()){
        header('Location: mail-ok.html');
        exit();
    } else {
        header('Location: mail-err.html');
        exit();
    } 
}
?>
 
credo di aver fatto un po' di macello.. mettendo così il codice:

Warning: Wrong parameter count for strtolower() in /home/xxx/domains/xxx.com/public_html/test/mail.php on line 166

Warning: Wrong parameter count for strpos() in /home/xxx/domains/xxx.com/public_html/test/mail.php on line 166

Warning: Cannot modify header information - headers already sent by (output started at /home/xxx/domains/xxx.com/public_html/test/mail.php:166) in /home/xxx/domains/xxx.com/public_html/test/mail.php on line 167

PHP:
if(strpos(strtolower($note,'http')) !== false || strpos(strtolower($note,'www')) !== false){//ha trovato un http o un www
    header('Location: mail-errs.html'); // <------ linea 167
    exit();
} elseif ($mail->Send()) {  
        header('Location: mail-ok.html');
        exit();
    } else {
        header('Location: mail-err.html');
        exit();
    }
 
ma dopo l'if non ci va else if e poi l'ultimo else?
Perchè? Se hai 3 possibilità per esempio devi sapere se il numero inserito è positivo, negativo oppure uguale a 0:
PHP:
if($numero<0){
...
}elseif($numero==0){
...
}else{//entra solo se è maggiore di 0
...
}
In questo caso la funzione Send() restituisce TRUE se la mail è stata inviata con successo altrimenti restituisce FALSE.
Quindi prova semplicemente a copiare e incollare il codice di borgo.

P.S. Rivedi un po' la documentazione sulla if in quanto necessita sempre di una espressione che deve stare tra parentesi tonde (ecco cosa andava alla linea 169 di prima che poi hai corretto).
 
Ultima modifica:
Nessuno mi sa aiutare? vorrei che prima che l'email parta sia fatto un check sul campo note (è una textarea di un form) e se non trova *http* o *www* fa partire, altrimenti mostra un errore :)
Ciao. hai provato solo con
PHP:
exit;
è solo una prova ciao
 
ciao
a parte la chiusura delle paretesi tonde che mi ero dimenticato facendo il copia/incolla, scrivere
PHP:
 <?php
//.....
if(strpos(strtolower($note,'http')) !== false || strpos(strtolower($note,'www')) !== false){//ha trovato un http o un www
    header('Location: mail-errore.php?err=1');
    exit();
}else{
    if($mail->Send()){
        header('Location: mail-ok.php');
        exit();
    }else{
        header('Location: mail-errore.php?err=2');
        exit();
    } 
}
?>
oppure
PHP:
 <?php
//.....
if(strpos(strtolower($note,'http') !== false || strpos(strtolower($note,'www') !== false){//ha trovato un http o un www
    header('Location: mail-errore.php?err=1');
    exit();
}elseif($mail->Send()){
    header('Location: mail-ok.php');
    exit();
}else{
   header('Location: mail-errore.php?err=2');
   exit();
} 
?>
sono due stili diversi per fare la stessa cosa, si tratta di preferenze.
poi se l'header ti da quell'errore
Warning: Cannot modify header information - headers already sent by (output started at /home/xxx/domains/xxx.com/public_html/test/mail.php:166) in /home/xxx/domains/xxx.com/public_html/test/mail.php on line 167
vuol dire che prima dell'header hai un output html, per out html basta che tu scriva il tag <?php alle seconda riga, qiundi o sostituisci gli header col tag meta (es)
PHP:
echo "<meta http-equiv='Refresh' content='4; URL=pinco_pallo.php'>";
e allora prima puoi mettere un echo per il messaggio oppure racchiudi tutto lo script
PHP:
<?php
ob_start();
//tutto lo script
ob_end_flush();
?>
 
ciao borgo, ho copiato pari pari i codici, ecco i due errori rispettivamente del primo e del secondo:

PHP:
Warning: Wrong parameter count for strtolower() in /home/xxx/domains/xxx.com/public_html/test/mail.php on line 166

Warning: Wrong parameter count for strpos() in /home/xxx/domains/xxx.com/public_html/test/mail.php on line 166

Warning: Cannot modify header information - headers already sent by (output started at /home/xxx/domains/xxx.com/public_html/test/mail.php:166) in /home/xxx/domains/xxx.com/public_html/test/mail.php on line 167

PHP:
Parse error: syntax error, unexpected '{' in /home/xxx/domains/xxx.com/public_html/test/mail.php on line 166

vuol dire che prima dell'header hai un output html, per out html basta che tu scriva il tag <?php alle seconda riga, qiundi o sostituisci gli header col tag meta (es)
credo di non avere afferrato (perdonami :) ), prima dell'header (questo header -> header('Location: mail-errore.php?err=1');") ho output html, si cel'ho, ho una variabile con dell'html che poi sarà mandato per email. O forse ti riferisci al fatto che le variabili che arrivano a questa pagina php sono di un form in html? Anche questo è vero. Però una cosa, prima di aggiungere strpos il form funzionava, quindi secondo me non c'entra nulla, è solo questione di riuscire a implementare strpos in maniera adatta no?


Grazie a tutti per l'aiuto :)
 
Output HTML vuol dire che 'stampi qualcosa a video' con una ECHO oppure da codice HTML.
Dalla Documentazione della funzione header, cito:
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP
 
Output HTML vuol dire che 'stampi qualcosa a video' con una ECHO oppure da codice HTML.
Dalla Documentazione della funzione header, cito:

ti ringrazio, ho sostituito al primo codice gli header con gli echo ma rimangono gli errori di strpos:
PHP:
Warning: Wrong parameter count for strtolower() in /home/xxx/domains/xxx.com/public_html/test/mail.php on line 166

Warning: Wrong parameter count for strpos() in /home/xxx/domains/xxx.com/public_html/test/mail.php on line 166
rilevato spam
 

Discussioni simili