2010-12-12 2 views
0

У меня есть контактная форма, которая отправляет 2 письма одному пользователю, а другому - администратору.Проблема PHP Отправка почты с заголовками

Письмо, отправленное пользователю, не имеет проблем, но другое не работает и дает код успеха.

Вот мой код:

Это конфигурационный файл (сообщения электронной почты и содержимое удалены):

$adminEmail = "*********@*****.com"; 
$adminSubj = "Admin Subject"; 

$userSubj = "User Subject"; 

//////////////////////////////////////////////////////// 
//DON`T EDIT BELOW THIS LINE 
//////////////////////////////////////////////////////// 

$userName = $_GET['name']; 
$userEmail = $_GET['email']; 
$userPhone = $_GET['phone']; 
$userMessage = $_GET['message']; 


$adminHeaders = 'MIME-Version: 1.0' . "\r\n"; 
$adminHeaders .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";; 
$adminHeaders .= "To: " . $adminEmail . "<" . $adminEmail . ">" . "\r\n"; 
$adminHeaders .= "From: " . $userName ."<" . $userEmail . ">" . "\r\n"; 


$userHeaders = 'MIME-Version: 1.0' . "\r\n"; 
$userHeaders .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
$userHeaders .= "To: " . $userName . "<" . $userEmail . ">" . "\r\n"; 
$userHeaders .= "From: website <[email protected]>" . "\r\n"; 

И это файл, который отправляет почту:

include("config.php"); 

$userSendMessage = "Your Message:<br /> 
$userMessage<br /><br /><br /> 
We will get back you. 
<br /><br /> 
Thanks 
Website Team. 

"; 

$adminSendMessage = " 
$userName<br /> 
$userEmail<br /> 
$userPhone<br /> 
$userMessage"; 


$toUser = mail($userEmail,$userSubj,$userSendMessage,$userHeaders); 
$toAdmin = mail($adminEmail,$adminSubj,$adminSendMessage,$adminHeaders); 

if($toAdmin && $toUser) 
    echo 1; 
else 
    echo 0; 

I предположим, что проблема заключается в $adminHeaders

$adminHeaders = 'MIME-Version: 1.0' . "\r\n"; 
$adminHeaders .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";; 
$adminHeaders .= "To: " . $adminEmail . "<" . $adminEmail . ">" . "\r\n"; 
$adminHeaders .= "From: " . $userName ."<" . $userEmail . ">" . "\r\n"; 

, когда я использую заголовки, как это это работает:

$adminHeaders = 'MIME-Version: 1.0' . "\r\n"; 
$adminHeaders .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";; 
$adminHeaders .= "To: " . $adminEmail . "<" . $adminEmail . ">" . "\r\n"; 
$adminHeaders .= "From: Someone <[email protected]someServer.com" . "\r\n"; 

Любая идея, как отправить почту администратора по электронной почте пользователя?

+0

здесь идет почта инъекции –

ответ

1

Вы можете использовать PHP Mailer.

Он может быть использован в качестве оболочки для функции mail(), и это так просто:

<?php 

require_once('PHPMailer_v5.1/class.phpmailer.php'); 

$mail = new PHPMailer(); // defaults to using php "mail()" 

$body = file_get_contents('contents.html'); 
$mail->SetFrom($fromAddress, 'First Last'); 
$mail->AddReplyTo($replyToAddress, "First Last"); 
$mail->AddAddress($toAddress, "John Doe"); 
$mail->Subject = "PHPMailer Test Subject via mail(), basic"; 
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test 
$mail->MsgHTML($body); 

// $mail->AddAttachment("images/phpmailer.gif");  // attachment 
// $mail->AddAttachment("images/phpmailer_mini.gif"); // attachment 

if (!$mail->Send()) { 
    echo "Mailer Error: " . $mail->ErrorInfo; 
} else { 
    echo "Message sent!"; 
} 
+0

Я не хочу использовать внешние приложения, я хочу использовать функцию mail() по умолчанию. Я не хочу проходить документацию и установку. – sikas

+0

@sikas Отредактировано примером, в котором используется встроенная функция 'mailer()' PHP, поэтому нет никакой необходимости в какой-либо конфигурации, просто включите файл класса. –

+0

Всегда давая мне ошибку: не удалось создать почтовую функцию. – sikas

1

Напряженная работа была сделана для Вас. Есть много библиотек, которые делают то, что вы нуждаясь с моим любимым быть здесь:

http://phpmailer.worxware.com/

Это простое в использовании, очень прочное и сохраняет спам от WebForms вниз довольно хорошо.

+0

Я не хочу использовать внешние приложения, я хочу использовать функцию mail() по умолчанию. Я не хочу проходить документацию и установку. – sikas

+0

@ sikas: ОК. Приготовьтесь к спаму. :) –

+0

Спам не проблема, я использую reCAPTCHA для предотвращения спама – sikas

1

Некоторые почтовые домены имеют проверки, чтобы гарантировать, что отправитель не претендует на роль какого-либо другого домена. Адрес отправляется, если отправитель не указан.

Это может быть исправлено путем добавления еще один заголовок:

Sender: [email protected] 

Также обратите внимание, ваш скрипт уязвим для заголовка манипуляции, как это не правильно убежали. Это можно сделать только в PHP 5.3, используя quoted_printable_encode, например.

'From: ' . quoted_printable_encode($userName . '<' . $userEmail . '>'); 

Ранние версии PHP не имеют простого способа сделать это правильно без библиотеки.

Я согласен с другими ответами, что вы должны посмотреть на использование библиотеки для этого, однако я не предлагаю использовать PHP-почтовую программу, поскольку она больше не находится в активной разработке (хотя она может быть многофункциональной).

Я использую класс почты, который приходит от Zend Framework (как я использую рамки, а):

http://framework.zend.com/manual/en/zend.mail.introduction.html

компоненты Apache Zeta (ранее Э.З. компоненты), делает хорошая реализация:

http://qafoo.com/blog/011_apache_zeta_components_doing_mail_right.html

+0

Отредактированная кодировка, поскольку она не работает правильно. Нет простого способа сделать это Andy

0

Когда я пишу сценарии, подобные этим, я всегда проверяю пробельные и устранить так же, как я, возможно, может поэтому они заголовки отправляются правильно. В противном случае взгляните на примеры функции mail.

Я заметил, что у вас есть 2 квадратных скобки в конце строки ниже, когда установлены adminHeaders.

$adminHeaders .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";; 

Когда вы изменили заголовок к следующему:

$adminHeaders .= "From: Someone <[email protected]" . "\r\n"; 

Вы пропустили закрывающую скобку после «Кто-то» адрес электронной почты.

В других примерах на странице руководства они показывают параметры «Кому» и «От» только как адрес электронной почты. Попробуйте удалить скобки и дублирование электронной почты вместе. Вы также можете защитить свои значения от переменной $ _GET, которая потенциально может быть использована. Также может стоить отлаживать то, что переменные $ _GET дают вам значения $ userName и $ userEmail (это может быть так же просто, как эхо или vardumping переменных).

0

Я также сталкиваюсь с теми же проблемами, и после некоторого R & D я обнаружил, что если мы удаляем символы новых строки из поля сообщения, то наша PHP функция почты начать работать

для, например, Предыдущее сообщение, которое я использовал -

$message = '<html> 
     <head> 
      <title>App Approval</title> 
     </head> 
     <body> 
      <p>Hi amir!</p> 
      <table> 
      <tr> 
       <td>Amir Khan has created a new app HH</td> 
      </tr> 
      <tr> 
       <td>Click the following link in order to <a href="http://theexecutiveeye.com/teenetwork/index.php?action=view&sub=app&app_id=">view</a> the app.</td> 
      </tr> 
      </table> 
     </body> 
     </html> 
     '; 

после изменения его

$message = '<html><head><title>App Approval</title></head><body><p>Hi amir!</p><table><tr><td>Amir Khan has created a new app HH</td></tr><tr><td>Click the following link in order to <a href="http://theexecutiveeye.com/teenetwork/index.php?action=view&sub=app&app_id=">view</a> the app.</td></tr></table></body></html>'; 

Он начал работать.

Кроме того, если вы не уверены относительно того, как использовать переменные в содержании сообщения между отдельным qoutes тогда мое предложение будет просто использовать его как двойные кавычки , как для этого

$message = 'blah blah blah'; 

использования этого

$message = 'blah'.$blah.' blah'; 
Смежные вопросы