Phpmailer SMTP

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='[email protected]';
$messaggio->Password='miapass';
$messaggio->IsHTML(true);

$messaggio->From="[email protected]";
$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 [email protected] e dice di provenire da [email protected], 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 :)
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
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".
 

Rey

Utente Attivo
11 Set 2012
73
0
6
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 :)
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
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 :)
 

Rey

Utente Attivo
11 Set 2012
73
0
6
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:

Rey

Utente Attivo
11 Set 2012
73
0
6
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
 

Rey

Utente Attivo
11 Set 2012
73
0
6
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:
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
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.');
}
 

Rey

Utente Attivo
11 Set 2012
73
0
6
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.');
}
}
?>
 

Rey

Utente Attivo
11 Set 2012
73
0
6
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 :)
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

Rey

Utente Attivo
11 Set 2012
73
0
6
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();
    } 
}
?>
 

Rey

Utente Attivo
11 Set 2012
73
0
6
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();
    }
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
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:

minatore

Utente Attivo
25 Set 2007
410
0
0
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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();
?>
 

Rey

Utente Attivo
11 Set 2012
73
0
6
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 :)
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
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
 

Rey

Utente Attivo
11 Set 2012
73
0
6
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
Autore Titolo Forum Risposte Data
G PHPMailer: SMTP error Gmail PHP 8
P [PHPmailer] SMTP Aruba.. problemi PHP 8
G Invio Mail con PHPMailer, problemi SMTP PHP 7
L invio smtp con phpmailer - problema invia due volte la email allo stesso utente PHP 0
L Problema phpmailer,jquery e smtp PHP 1
G phpmailer e php 8.1 con estensione mysqli PHP 6
E Hosting e phpmailer PHP 0
E PHPMailer PHP 4
D PHPMailer con account gmail PHP 14
I PHPMailer non funziona PHP 13
I Guida/Tutorial configurare PHPMailer per inviare mails tramite contact form? PHP 2
A PHPMAILER e UMLAUTS (lettere tedesche äüäöß) PHP 2
M Come usare la nuova versione di phpmailer? PHP 2
V PHPMailer PHP 11
V PHPmailer allegato PHP 0
P problemi invio email con phpmailer PHP 47
P phpmailer PHP 0
localhost.nicola File log erroe con phpmailer PHP 3
A problema phpmailer PHP 32
O PhpMailer, Composer e Netbeans PHP 1
M Come inviare due mail diverse con phpmailer PHP 6
Z email phpmailer non arrivano PHP 0
B Invio email multiple PHPMAILER PHP 3
P Problemi visualizzazione html con phpmailer PHP 6
P phpmailer e file_get_contents PHP 1
P Phpmailer ed wind-infostrada PHP 20
felino PHPMailer: Indirizzo IP e Immagine PHP 6
lsnight Phpmailer per principianti PHP 7
K form con phpmailer PHP 18
P Invio multiplo mail con phpmailer PHP 5
L problema classe phpmailer con la mia classe clsMail PHP 2
G problema con phpmailer 5.2.1 PHP 1
minatore Phpmailer PHP 6
M phpmailer multiplo in più pagine di un sito PHP 5
N PhpMailer SELECT e OPTION PHP 190
N PhpMailer e salvataggio allegato sul server PHP 11
A problema con phpmailer PHP 10
metalgemini PHPmailer non arriva allegato PHP 10
piccino PHPMailer: inserire allegato PHP 5
E Invio email (era: phpmailer) PHP 52
F Phpmailer e l'indirizzo del mittente PHP 3
F PhpMailer PHP 5
borgo italia phpmailer?? PHP 7
C phpmailer PHP 7
emanuelevt phpmailer e altervista PHP 3
catellostefano Problema con la classe class.phpmailer.php PHP 5
SolidSnake4 PHPmailer errore PHP 4
A classe PHPMailer e mail di Libero PHP 1
S php mail vs phpmailer PHP 0
T Problemi phpmailer x invio ad indirizzi di libero. Aiutatemi! PHP 14

Discussioni simili