2009-09-13 7 views
0

J'ai un script php qui envoie des e-mails avec des pièces jointes une fois que les utilisateurs ont envoyé des informations. Je reçois ces courriels dans ma boîte de réception Gmail sans problème. Cependant, lorsque j'utilise mon adresse e-mail personnelle ou mon adresse e-mail professionnelle, l'e-mail n'est jamais envoyé. Est-ce un problème avec mon script (ci-dessous) ou un paramètre que j'ai sur le serveur? Je pense que cela pourrait être un problème avec les en-têtes, mais chaque fois que je change les en-têtes, ils cassent l'email et tout apparaît dans le corps du message. Est-ce que quelqu'un sait comment réparer ceci? Le serveur est le serveur linux géré par les clients avec un panneau de contrôle plesk, donc je n'ai pas accès au fichier phi ini.Php mail() envoi d'e-mails arrivant dans un compte gmail mais pas dans un compte e-mail classique

//define the receiver of the email 
$to = '[email protected]'; 
//define the subject of the email 
$subject = 'Email with Attachment'; 
//create a boundary string. It must be unique 
//so we use the MD5 algorithm to generate a random hash 
$random_hash = md5(date('r', time())); 
//define the headers we want passed. Note that they are separated with \r\n 
$mime_boundary = "<<<--==+X[".md5(time())."]"; 

$path = $_SERVER['DOCUMENT_ROOT'].'/two/php/'; 
$fileContent = chunk_split(base64_encode(file_get_contents($path.'CTF_brochure.pdf'))); 


$headers .= "From: [email protected] <[email protected]>\r\n"; 

$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "Content-Type: multipart/mixed;\r\n"; 
$headers .= " boundary=\"".$mime_boundary."\""; 




$message = "This is a multi-part message in MIME format.\r\n"; 

$message .= "\r\n"; 
$message .= "--".$mime_boundary."\r\n"; 

$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n"; 
$message .= "Content-Transfer-Encoding: 7bit\r\n"; 
$message .= "\r\n"; 
$message .= "Email content and what not: \r\n"; 
$message .= "This is the file you asked for! \r\n"; 
$message .= "--".$mime_boundary."" . "\r\n"; 

$message .= "Content-Type: application/octet-stream;\r\n"; 
$message .= " name=\"CTF-brochure.pdf\"" . "\r\n"; 
$message .= "Content-Transfer-Encoding: base64 \r\n"; 
$message .= "Content-Disposition: attachment;\r\n"; 
$message .= " filename=\"CTF_brochure.pdf\"\r\n"; 
$message .= "\r\n"; 
$message .= $fileContent; 
$message .= "\r\n"; 
$message .= "--".$mime_boundary."\r\n"; 

//send the email 
$mail_sent = mail($to, $subject, $message, $headers); 
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" 
echo $mail_sent ? "Mail sent" : "Mail failed"; 
+0

salut Drew. était la sortie "Mail envoyé" ou "Mail a échoué" lorsque vous envoyez à d'autres comptes non-Gmail. avez-vous essayé d'envoyer à un autre compte Gmail? – mauris

+0

sortie à chaque fois est envoyé par courrier – Drew

Répondre

2

Essayez cette version alternative multi-parties. Il accepte les messages en clair et en html et permet au client de courrier électronique de choisir lequel afficher.


//define the receiver of the email 
$to = '[email protected]'; 
//define the subject of the email 
$subject = 'Email with Attachment'; 
//create 2 boundary strings. They must be unique 
$boundary1 = rand(0,9)."-" 
          .rand(10000000000,9999999999)."-" 
          .rand(10000000000,9999999999)."=:" 
          .rand(10000,99999); 
$boundary2 = rand(0,9)."-".rand(10000000000,9999999999)."-" 
          .rand(10000000000,9999999999)."=:" 
          .rand(10000,99999); 

$path = $_SERVER['DOCUMENT_ROOT'].'/two/php/'; 
$fileContent = chunk_split(base64_encode(file_get_contents($path.'CTF_brochure.pdf'))); 

$txt_message = "Email content and what not: \r\n"; 
$txt_message .= "This is the file you asked for! \r\n"; 

$html_message = "Email content and what not: <br />"; 
$html_message .= "This is the file you asked for! "; 

$headers  =<<<AKAM 
From: [email protected] <[email protected]> 
MIME-Version: 1.0 
Content-Type: multipart/mixed; 
    boundary="$boundary1" 
AKAM; 

$attachment = <<<ATTA 
--$boundary1 
Content-Type: application/octet-stream; 
    name="CTF_brochure.pdf" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment; 
    filename="CTF_brochure.pdf" 

$fileContent 

ATTA; 

$body = <<<AKAM 
This is a multi-part message in MIME format. 

--$boundary1 
Content-Type: multipart/alternative; 
    boundary="$boundary2" 

--$boundary2 
Content-Type: text/plain; 
    charset=ISO-8859-1; 
Content-Transfer-Encoding: 7bit 

$txt_message 
--$boundary2 
Content-Type: text/html; 
    charset=ISO-8859-1; 
Content-Transfer-Encoding: 7bit 

$html_message 

--$boundary2-- 

$attachment 
--$boundary1-- 
AKAM; 

//send the email 
$mail_sent = @mail($to, $subject, $body, $headers); 
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" 
echo $mail_sent ? "Mail sent" : "Mail failed"; 
+0

merci pour cela. hélas, je reçois aucun message sur le compte Gmail et rien à travers autre chose – Drew

0

Vérifiez votre dossier de courrier indésirable sur les autres comptes. Parfois, le courrier peut se retrouver dans le spam s'il déclenche trop d'avertissements pour le logiciel de filtrage du courrier indésirable utilisé par le fournisseur de messagerie.

+0

merci pour la suggestion, mais hélas, c'est le premier endroit où j'ai regardé! – Drew

0

La fonction mail() est très utile sauf lorsque vous devez gérer des en-têtes. La plupart des e-mails seront rejetés par les robots spammeurs sans en-têtes appropriés.

Je recommanderais d'utiliser la classe PHPMailer et de faire tout le travail. Faire un soi-même est une douleur et non recommandé.

https://github.com/PHPMailer/PHPMailer

Cela vient avec de nombreuses fonctionnalités merveilleuses et vous sauvera la vie de tous ces problèmes :)

Questions connexes