Problema PHPMailer con allegati > 1.5 mb

di il
9 risposte

Problema PHPMailer con allegati > 1.5 mb

Buongiorno,
sono nuovo alla programmazione in PHP quindi non so se il problema sia già stato discusso, ma non riesco a risolverlo con quanto ho trovato online.
Sto progettando un sito in cui intendo inserire un contact-form che invia i dati e gli allegati tramite PHPMailer.

Il problema si presenta quando tento di inviare uno o più file la cui dimensione totale è superiore a 1.5 mb, PHPMailer mi restituisce il messaggio "Impossibile istanziare la funzione mail".

Se la dimensione dei file (anche più di uno) è inferiore la mail viene inviata senza problemi...

Sapete darmi qualche dritta? Grazie

P.S.:
il problema è sicuramente riferibile a PHPMailer in quanto lo stesso form gestito in ASP funziona perfettamente;
il sito è caricato su Aruba che gestische allegati PHP di dimensioni molto superiori (ripeto, in ASP nessun problema)


<?php

	require 'PHPMailer/PHPMailerAutoload.php';

	// email del mittente
	$fromEmail = $_POST['email'];
	$fromName = 'Modulo di contatto';

	// email del destinatario
	$sendToEmail = 'xxx@yyy.it';
	$sendToName = 'xxxx';

	// oggetto del messaggio
	$subject = 'Nuovo messaggio dal modulo di contatto';

	// nomi dei campi del modulo e loro traduzioni
	// nome variabile nella matrice => Testo da visualizzare nell'email
	$fields = array('name' => 'Nome', 'surname' => 'Cognome', 'phone' => 'Telefono', 'email' => 'Email', 'message' => 'Messaggio');

	// messaggio che verrà visualizzato in caso di successo
	$okMessage = 'Il modulo di contatto è stato inviato con successo. Grazie!';

	// messaggio che verrà visualizzato in caso di errore
	$errorMessage = "Si è verificato un errore durante l'invio del modulo. Per favore riprova più tardi!";

	try	{
		
		if(count($_POST) == 0) throw new \Exception('Il modulo è vuoto!');
		
		// inizializza la classe PHPMailer
		$mail = new PHPMailer;

		// imposta l'email
		$mail->setLanguage('it');
		$mail->setFrom($fromEmail, $fromName);
		$mail->addAddress($sendToEmail, $sendToName);
		$mail->addReplyTo($from);
		$mail->Subject = $subject;
		$mail->isHTML(true);
		
		// imposta il testo del messaggio
		$emailTextHtml = "<h1>Hai un nuovo messaggio dal tuo modulo di contatto</h1>";
		$emailTextHtml .= "<table>";
		foreach ($_POST as $key => $value) {
			// se il campo esiste nella matrice $fields, lo include nel messaggio e-mail
			if (isset($fields[$key])) {
				$emailTextHtml .= "<tr><th style='text-align:left'>$fields[$key]: </th><td>$value</td></tr>";
			}
		}
		$emailTextHtml .= "</table>";
		$emailTextHtml .= "<p>Buona giornata!</p>";
		$mail->msgHTML($emailTextHtml);

		// allega i file all'email
		$count = count($_FILES['attachment']['name']);
		for ($i = 0; $i < $count; $i ++) {
			if (!empty($_FILES["attachment"]["name"][$i])) {
				$tempFileName = $_FILES["attachment"]["tmp_name"][$i];
				$fileName = $_FILES["attachment"]["name"][$i];
				$mail->AddAttachment($tempFileName, $fileName);
			}
		}

		// invia l'email e intercetta l'eventuale errore
		if(!$mail->send()) {
			throw new \Exception("Non ho potuto inviare l'email: " . $mail->ErrorInfo);
		}
				
		// SUCCESSO: imposta il messaggio
		$okmessage = $count;
		$responseArray = array('type' => 'success', 'message' => $okMessage);
	
	} catch (\Exception $e) {

		// ERRORE: imposta messaggio
		// $responseArray = array('type' => 'danger', 'message' => $errorMessage);
		$responseArray = array('type' => 'danger', 'message' => $e->getMessage());
	
	}

	// se richiesto dalla richiesta AJAX, restituisce la risposta JSON
	if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
		$encoded = json_encode($responseArray);
		header('Content-Type: application/json');
		echo $encoded;
	} else {
		echo $responseArray['message'];
	}

9 Risposte

  • Re: Problema PHPMailer con allegati > 1.5 mb

    Ciao, è sicuramente un problema di configurazione php.
    Crea un file .htaccess ed inserisci
    php_value post_max_size 30M
    php_value upload_max_filesize 30M
  • Re: Problema PHPMailer con allegati > 1.5 mb

    Il problema non credo sia nei limiti di configurazione del server Aruba.
    Ho uno spazio Hosting Windows che ha i seguenti limiti (da manuale Aruba...)

    Di seguito sono riportati i limiti consentiti in Hosting Condiviso per la configurazione del file PHP in Hosting Windows:

    memory_limit
    128 MB con tutte le versioni PHP (da 5.4 a 7.4)

    upload_max_filesize
    18 MB con tutte le versioni PHP (da 5.4 a 7.4)

    post_max_size
    22 MB con tutte le versioni PHP (da 5.4 a 7.4)

    max_input_vars
    1000 con tutte le versioni PHP (da 5.4 a 7.4)

    max_execution_time
    120'' per la versione di PHP 5.4
    300'' per le versioni di PHP 5.5 e 7.4

    Ho comunque provato quanto indicato, ma come pensavo non ho risolto.

    Altre idee?
    Credo che il problema sia nella configurazione di PHPMailer ma non ho trovato niente in merito.


    P.S.: la versione attiva di PHP è la 7.4

    Grazie
  • Re: Problema PHPMailer con allegati > 1.5 mb

    È evidente che il problema sta nella funzione mail nativa di php, sul perché è difficile dirlo. Potrebbe essere che l'allegato consumi troppa memoria (il codice usato da PHPMailer che divide una stringa di 15MB in più parti può portare a 128MB, 256MB . Cioè esaurisce la memoria) o comunque da adattare il codice php.
    Almeno con questo dettagli ti mostra il vero errore? https://www.google.com/amp/s/www.it-swarm.it/it/php/impossibile-eseguire-la-funzione-mail.-perche-si-e-verificato-questo-errore/968695991/amp/ se il metodo send non funziona magari prova inserendo errors_get_last() che ti crea un output su file.
    Comunque dovresti dapprima verificare con isset e poi se l'errore non è presente nella matrice $_FILE['attchament']['error'][0] da ripetere per ogni chiave e comunque ecco la lista completa per l'invio POST PUT https://www.php.net/manual/en/features.file-upload.post-method.php
    Dopo aver letto l'errore prova a usare il metodo send dopo aver impostato gli allegati e non prima.
  • Re: Problema PHPMailer con allegati > 1.5 mb

    Grazie per l'aiuto,
    ho provato a identificare il vero errore come mi hai detto (bel passo avanti...) e ho ricevuto questo:

    Array ( [type] => 2 [message] => mail(): Failed to Send [file] => D:\inetpub\webs\dominio\test\PHPMailer\class.phpmailer.php [line] => 700 )

    la funzione in cui viene generato l'errore nella classe di PHPMailer è la seguente:
    
    686	private function mailPassthru($to, $subject, $body, $header, $params)
    687	{
    688	//Check overloading of mail function to avoid double-encoding
    689	if (ini_get('mbstring.func_overload') & 1) {
    690		$subject = $this->secureHeader($subject);
    691	} else {
    692		$subject = $this->encodeHeader($this->secureHeader($subject));
    693	}
    694
    695	//Can't use additional_parameters in safe_mode, calling mail() with null params breaks
    696	//@link http://php.net/manual/en/function.mail.php
    697	if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
    698		$result = @mail($to, $subject, $body, $header);
    699	} else {
    700		$result = @mail($to, $subject, $body, $header, $params);
    701	}
    702	return $result;
    703	}
    
    Ripeto, si presenta solo con file superiori a 1.5 mb... qualche idea?

    Non credo sia un problema di gestione dei file, se provo a caricare manualmente sul server un file di dimensioni superiori a 1.5 mb e ad inviarlo allegandolo direttamente dal server, ricevo lo stesso errore. Quindi il problema credo sia esclusivamente legato alle dimensioni.
  • Re: Problema PHPMailer con allegati > 1.5 mb

    Prego figurati, cerco la soluzione per te.
    Ok nel tuo primo codice esposto sposta il metodo send dopo il metodo allegati (cioè il metodo send può
    solo essere la fine) se non funziona prova a commentare "$params" alla riga 700.
    Ripeto il problema dipende dalla funzione mail nativa.
    Spero troviamo il modo giusto di comunicare senza leggere nuovamente il discorso dei file (indubbiamente qualcosa del discorso file influisce).
  • Re: Problema PHPMailer con allegati > 1.5 mb

    Ho fatto le prove che mi hai indicato ma non riesco a risolvere, purtroppo...

    Ho provato anche ad inviare la mail direttamente con la classe mail in PHP (senza appoggiarmi a PHPMailer) e con file maggiori di 1.5 mb ricevo lo stesso errore, quindi come dicevi tu è un problema della funzione nativa in PHP ...

    Se possibile, vorrei inviarti un semplice pacchetto di test da caricare su un tuo server in modo che possa renderti meglio conto del problema.

    Come posso fare?
  • Re: Problema PHPMailer con allegati > 1.5 mb

    Posso solo consigliarti di ridurre allo stretto necessario il tuo script, se il problema è la dimensione di un singolo allegato, il codice dovrà avere questa struttura.
    [CODE]<?php error_reporting(-1); ini_set('display_startup_errors', true); ini_set('display_errors', true); use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once "vendor/autoload.php"; $mail = new \PHPMailer; $mail->From = "from@yourdomain.com"; $mail->FromName = "Full Name"; $mail->addAddress("recipient1@example.com", "Recipient Name"); //Provide file path and name of the attachments $mail->addAttachment("file.txt", "File.txt"); $mail->addAttachment("images/profile.png"); //Filename is optional $mail->isHTML(true); $mail->Subject = "Subject Text"; $mail->Body = "<i>Mail body in HTML</i>"; $mail->AltBody = "This is the plain text version of the email content"; try { $mail->send(); echo "Message has been sent successfully"; } catch (\Exception $e) { echo "Mailer Error: " . $mail->ErrorInfo; } ?> Da phpmailer 6.x.x supporta da php 5.5 a successivo.
  • Re: Problema PHPMailer con allegati > 1.5 mb

    Ciao ho indagato dovrai chiedere supporto direttamente ad Aruba per capire quale limiti ci sono.
    Ad esempio su sistemi Unix ci sarebbe maxMessageSize che quantificano il massimo raggiungibile per l'applicazione sendmail.
    Purtroppo php tramite codice C, si affida al cliente di posta installato nel tuo web server che comunque pone limiti alla grandezza dell'email.
    Senza modificare nulla pensa a questo scenario https://php.tutorials24x7.com/blog/how-to-use-sendmail-on-windows-to-send-email-using-php la funzione mail si appoggia a questa configurazione e eredita le caratteristiche dell'applicazione in uso.
    Dunque dovrai chiedere maggiori dettagli sui loro limiti mail (asp, php), se ASP usa una grandezza maggiore usa quello.
  • Re: Problema PHPMailer con allegati > 1.5 mb

    Salve a tutti,
    non riuscendo a risolvere il problema ho optato per l'uso di ASPEmail + ASPUpload per la gestione degli allegati.

    Ho comunque dedotto questo (spero sia di aiuto per altri...):
    - ASPUpload necessita del caricamento dei dati sul Server o in memoria per poter accedere ai singoli input del modulo. Deduco che anche PHP faccia la stessa cosa, cioè necessita che il Form sia caricato in memoria per poter accedere ai singoli elementi del form (inclusi gli input di testo).
    - Essendo richiesto il caricamento in memoria, ovviamente deve essere stabilito un limite per la dimensione dei file e questo potrebbe essere il limite che causa l'errore nella gestione di file di grandi dimensioni.
    - Con ASPEmail ho risolto perchè ho potuto definire la dimensione dell'allocazione in memoria in base alle mie necessità, oppure caricando fisicamente i file sul Server prima di leggere i dati del Form; con PHPMailer non sono riuscito a trovare come configurare questo parametro (...e non so se sia configurabile).

    In ogni caso sono sicuro che il problema non sia di Aruba e di eventuali limiti del Server, ma della gestione della memoria di PHP / PHPMailer
Devi accedere o registrarti per scrivere nel forum
9 risposte