Задать вопрос
@pesterevilya

Как настроить phpmailer для отправки данных из сложной формы?

Не могу разобраться как настроить форму, чтобы на почту приходили данные из select (там может быть выбрано несколько значений), а также прикрепленные файлы, которых тоже может быть несколько.

Код моей формы в HTML:
<form class="nobottommargin" id="template-contactform" name="template-contactform" action="include/sendemail.php" method="post">
 
	<div class="form-process"></div>
	<h4>Куда оптравить наше предложение?</h4>
	<div class="col_one_third">
		<label for="template-contactform-name">Имя <small>*</small>
		</label>
		<input type="text" id="template-contactform-name" name="template-contactform-name" value="" class="sm-form-control required" />
	</div>
 
	<div class="col_one_third">
		<label for="template-contactform-phone">Телефон <small>*</small>
		</label>
		<input type="text" id="template-contactform-phone" name="template-contactform-phone" value="" class="sm-form-control required" />
	</div>
 
	<div class="col_one_third col_last">
		<label for="template-contactform-email">E-mail <small>*</small>
		</label>
		<input type="email" id="template-contactform-email" name="template-contactform-email" value="" class="required email sm-form-control" />
	</div>
 
	<div class="clear"></div>
 
	<div class="col_full">
		<label>Какие материалы вы используете?</label>
		<select id="template-contactform-service" name="template-contactform-service" class="sm-form-control selectpicker" multiple title="Кликните для выбора">
			<option>Геомембрана</option>
			<option>Бентомат</option>
			<option>Биомат</option>
			<option>Георешетка</option>
			<option>Геотекстиль</option>
			<option>Дренажный мат</option>
			<option>Теплонит</option>
			<option>Анкеры</option>
		</select>
	</div>
 
	<div class="clear"></div>
	<h4>Прикрепите документы по текущему проекту (если имеются)</h4>
	<div class="col_one_third col_last">
 
		<input id="input-3" name="input2[]" type="file" class="file" multiple data-show-upload="false" data-show-caption="true" data-show-preview="true">
	</div>
 
	<div class="col_full hidden">
		<input type="text" id="template-contactform-botcheck" name="template-contactform-botcheck" value="" class="sm-form-control" />
	</div>
 
	<div class="col_full">
		<button class="button button-yellow button-3d nomargin" type="submit" id="template-contactform-submit" name="template-contactform-submit" value="submit">Отправить</button>
	</div>
 
</form>


Код моего sendemail.php:
<?php
 
require_once('phpmailer/PHPMailerAutoload.php');
 
$toemails = array();
 
$toemails[] = array(
				'email' => 'info@zenlabs.ru', // Your Email Address
				'name' => 'Your Name' // Your Name
			);
 
// Form Processing Messages
$message_success = 'We have <strong>successfully</strong> received your Message and will get Back to you as soon as possible.';
 
// Add this only if you use reCaptcha with your Contact Forms
$recaptcha_secret = 'your-recaptcha-secret-key'; // Your reCaptcha Secret
 
$mail = new PHPMailer();
 
// If you intend you use SMTP, add your SMTP Code after this Line
 
if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
	if( $_POST['template-contactform-email'] != '' ) {
 
	
		$name = isset( $_POST['template-contactform-name'] ) ? $_POST['template-contactform-name'] : '';
		$email = isset( $_POST['template-contactform-email'] ) ? $_POST['template-contactform-email'] : '';
		$phone = isset( $_POST['template-contactform-phone'] ) ? $_POST['template-contactform-phone'] : '';
		$service = isset( $_POST['template-contactform-service'] ) ? $_POST['template-contactform-service'] : '';
 
		$botcheck = $_POST['template-contactform-botcheck'];
 
		if( $botcheck == '' ) {
 
			$mail->SetFrom( $email , $name );
			$mail->AddReplyTo( $email , $name );
			foreach( $toemails as $toemail ) {
				$mail->AddAddress( $toemail['email'] , $toemail['name'] );
			}
			$mail->Subject = "Заявка с сайта geo174.ru";
 
			$name = isset($name) ? "Имя: $name<br><br>" : '';
			$email = isset($email) ? "E-mail: $email<br><br>" : '';
			$phone = isset($phone) ? "Телефон: $phone<br><br>" : '';
			$service = isset($service) ? "Материалы: $service<br><br>" : '';
 
			$referrer = $_SERVER['HTTP_REFERER'] ? '<br><br><br>This Form was submitted from: ' . $_SERVER['HTTP_REFERER'] : '';
 
			$body = "$name $email $phone $service $message $referrer";
 
			// Runs only when File Field is present in the Contact Form
			if ( isset( $_FILES['template-contactform-file'] ) && $_FILES['template-contactform-file']['error'] == UPLOAD_ERR_OK ) {
				$mail->IsHTML(true);
				$mail->AddAttachment( $_FILES['template-contactform-file']['tmp_name'], $_FILES['template-contactform-file']['name'] );
			}
 
			// Runs only when reCaptcha is present in the Contact Form
			if( isset( $_POST['g-recaptcha-response'] ) ) {
				$recaptcha_response = $_POST['g-recaptcha-response'];
				$response = file_get_contents( "https://www.google.com/recaptcha/api/siteverify?secret=" . $recaptcha_secret . "&response=" . $recaptcha_response );
 
				$g_response = json_decode( $response );
 
				if ( $g_response->success !== true ) {
					echo '{ "alert": "error", "message": "Captcha not Validated! Please Try Again." }';
					die;
				}
			}
 
			$mail->MsgHTML( $body );
			$sendEmail = $mail->Send();
 
			if( $sendEmail == true ):
				echo '{ "alert": "success", "message": "' . $message_success . '" }';
			else:
				echo '{ "alert": "error", "message": "Email <strong>could not</strong> be sent due to some Unexpected Error. Please Try Again later.<br /><br /><strong>Reason:</strong><br />' . $mail->ErrorInfo . '" }';
			endif;
		} else {
			echo '{ "alert": "error", "message": "Bot <strong>Detected</strong>.! Clean yourself Botster.!" }';
		}
	} else {
		echo '{ "alert": "error", "message": "Please <strong>Fill up</strong> all the Fields and Try Again." }';
	}
} else {
	echo '{ "alert": "error", "message": "An <strong>unexpected error</strong> occured. Please Try Again later." }';
}
 
?>
  • Вопрос задан
  • 2179 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
ReenaFuro
@ReenaFuro
Веб, игры, софт, социальный инженеринг
Привет. Я начинающая программер, но сама юзаю нечто похожее на сайте
web.furofamily.com/Realia-Real-Eastate
это магазин готовых сайтов, корзины нет.

1. клиент отмечает и заполняет обязательные поля, иначе - алерт red mess
2. клиент кликает на отправить заказ (green mess) - все приходит мне на мыло, указанное в моем файле cmd_sendmail.php:
<?

global $EMAIL,$TEL,$COLOR,$FULLSKREEN,$ISTZ,$MEDIAFAQ,$HOSTING,$DOMEN,$MEDIADM,$EDUCATION,$PGID;
global $m_conf;
$PGID = (int)$PGID;
$rm='';

include_once("cls/tsendmail.php");
$mail = new TSendmail();
#if(!$mail->ValidEmail($email)){$rm .= "Укажите корректный e-mail";}
if (!$EMAIL) $rm .= " укажите e-mail
";
if (!$TEL) $rm .= " укажите телефон
";
if($rm) $this->red_mess .="Пожалуйста,".$rm;
if($FULLSKREEN) $FULLSKREEN="Да"; else $FULLSKREEN="Нет";
if($ISTZ) $ISTZ="Да"; else $ISTZ="Нет";
if($MEDIAFAQ) $MEDIAFAQ="Да"; else $MEDIAFAQ="Нет";
if($HOSTING) $HOSTING="Да"; else $HOSTING="Нет";
if($DOMEN) $DOMEN="Да"; else $DOMEN="Нет";
if($MEDIADM) $MEDIADM="Да"; else $MEDIADM="Нет";
if($EDUCATION) $EDUCATION="Да"; else $EDUCATION="Нет";

if (!$rm)
{
$mail->From($m_conf['emailfrom']);
$mail->ClearAddresses();
$mail->To('мыло@мыло.com');
$mail->Subject("Новый заказ на Вашсайт.com ");

!!!! Это часть из моей CMS. тут я получаю Название страницы и название товара
$pagenaz = GetFieldFromSQL($this->conn,"SELECT NAZ FROM MTREE WHERE ID=".(int)$PGID,'');
!!!!


$soderv = "

Заказ: $pagenaz

e-mail: $EMAIL

Телефон: $TEL

Цветовая гамма: $COLOR

На весь экран: $FULLSKREEN

Техническое задание: $ISTZ

Видеоинструкция к сайту: $MEDIAFAQ

Хостинг: $HOSTING

Домен: $DOMEN

Видеоинструкция к хостингу: $MEDIADM

Обучение персонала: $EDUCATION

";
$mail->Body($soderv);
$mail->Send();

$this->green_mess ="Сообщение отправлено";
}
?>

Как видно, есть подключение некоторого сендмейла tsendmail.php, вот что было в начале файла:
<?php

/*

this class encapsulates the PHP mail() function.
implements CC, Bcc, Priority headers

@version 1.3

- added ReplyTo( $address ) method
- added Receipt() method - to add a mail receipt
- added optionnal charset parameter to Body() method. this should fix charset problem on some mail clients

@example

$m= new Mail; // create the mail
$m->From( "leo@isp.com" );
$m->To( "destination@somewhere.fr" );
$m->Subject( "the subject of the mail" );

$message= "Hello world!\nthis is a test of the Mail class\nplease ignore\nThanks.";
$m->Body( $message); // set the body
$m->Cc( "someone@somewhere.fr");
$m->Bcc( "someoneelse@somewhere.fr");
$m->Priority(4) ; // set the priority to Low
$m->Attach( "/home/leo/toto.gif", "image/gif" ) ; // attach a file of type image/gif

//alternatively u can get the attachment uploaded from a form
//and retreive the filename and filetype and pass it to attach methos

$m->Send(); // send the mail
echo "the mail below has been sent:
", $m->Get(), "";

author Saravanan(winsaravanan@yahoo.com,ssaravanan@teledata-usa.com)

*/
весь код приводить не буду, только по запросу ))

3. Понятно, что переменные в начале файла соответствуют названиям полей в форме, все инпуты, чеки, радио, и селекты и кнопка.

Есть непонятная чать с PGID и какой-то SQL-фигней:
$pagenaz = GetFieldFromSQL($this->conn,"SELECT NAZ FROM MTREE WHERE ID=".(int)$PGID,'');
и naz и PGID - это внутренние команды CMS Webolla, на которой работает сайт, вместо этих переменных у вас будут свои, которые вы берете там где берете для обозначение страницы с которой был заказ и собственно название товара. Это для магазина без корзины.

4. И последнее, чего, имхо, не хватает вашему коду - верстки, в которую скрипт оформит ответ, собранное из формы. В каком виде вам должно приходить собранное на почту, если нет верстки? Или я чего-то не понимаю? Если так - прошу меня извинить, я начинающая )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы