Здравствуйте! Реализую в модуле nodebasket отправку на почу оформленного заказа. Столкнулся с тем, что Drupal 7 ошибок никаких не выдает, но письмо на почту не приходит. Проверял составляемые массивы и получаемый адрес почты - все хорошо.
Привожу код полностью (да да, всю портянку) с отрисовкой формы отправки, дабы не было непонимания что где то что-то не передал.
<?php
function nodebasket_orderform() {
$data = $_SESSION['nodebasket_data'];
global $user;
if ($user->uid > 0) {
if (isset($user->realname)) {
$data['name'] = $user->realname;
}
else {
$data['name'] = $user->name;
}
$data['email'] = $user->mail;
}
$form['mydata'] = array(
'#type' => 'markup',
'#value' => 'Внимательно заполните поля формы и отправьте её.',
);
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('You name'),
'#required' => TRUE,
'#default_value' => $data['name'],
'#size' => 20,
'#maxlength' => 60,
);
$form['phone'] = array(
'#type' => 'textfield',
'#title' => t('You conact phone'),
'#required' => TRUE,
'#default_value' => $data['phone'],
'#size' => 20,
'#maxlength' => 60,
);
$form['email'] = array(
'#type' => 'textfield',
'#title' => t('You e-mail'),
'#required' => TRUE,
'#default_value' => $data['email'],
'#size' => 20,
'#maxlength' => 60,
);
$form['payway']= array (
'#type' => 'select',
'#title' => t('Способ оплаты'),
'#default_value' => variable_get('feed_item_length','teaser'),
'#options' => array(
'Банковский перевод' => t('Банковский перевод'),
'Банковская карта Visa/MasterCard' => t('Банковская карта Visa/MasterCard'),
'Безналичный расчёт' => t('Безналичный расчёт'),
),
'#required' => TRUE,
);
$form['deliverymethod']= array (
'#type' => 'select',
'#title' => t('Способ доставки'),
'#default_value' => variable_get('feed_item_length','teaser'),
'#options' => array(
'Cамовывоз' => t('Cамовывоз'),
'«Почта России»' => t('«Почта России»'),
'Транспортной компанией' => t('Транспортной компанией'),
),
'#required' => TRUE,
);
$form['adress'] = array(
'#type' => 'textfield',
'#title' => t('Адрес доставки'),
'#required' => TRUE,
'#default_value' => '',
'#size' => 50,
'#maxlength' => 100,
);
$form['descr'] = array(
'#type' => 'textarea',
'#title' => t('Any Notes'),
'#required' => FALSE,
'#default_value' => '',
'#rows' => 5,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
$ip = $_SERVER['REMOTE_ADDR'];
$form['sender_ip'] = array(
'#type' => 'hidden',
'#title' => t('Sender IP'),
'#value' => $ip,
);
return $form;
}
function
nodebasket_orderform_validate($form, &$form_state) {
if (!valid_email_address($form_state['values']['email'])) {
form_set_error('email', t('Please provide an e-mail address.'));
}
$regex = "^[0-9\-\(\)\ \+]+$";
$phone_state = $form_state['values']['phone'];
if (!ereg($regex, $phone_state)) {
form_set_error('phone', t('Please provide a valid phone number.'));
}
}
function
nodebasket_orderform_submit($form, &$form_state) {
global $language;
//Получаем данные из формы после проверки валидации
$values = $form_state['values'];
$tableitems="";
foreach ($_SESSION['basket'] as $k => $v) {
$tableitems.= check_plain($v['title']) .' | '. t('Количество') .': '. $v['count'] ."\n". t('Страница товара') .': '. url('node/'. $k, array('absolute' => TRUE)) ."\n";
}
//Получаем куда отправлять (если в "О сайте" указан e-mail, то ставим его
//print_r(variable_get('site_mail', ini_get('sendmail_from')));
//exit;
$to = variable_get('nodebasket_basket_email', variable_get('site_mail', ini_get('sendmail_from')));
$values['tableitems']=$tableitems;
//производим отправку письма, перед его выполнением срабатывает nodebasket_mail, который составит тело и тему письма
//drupal_mail('nodebasket', 'order', $to, language_default(), array(), $values['email']);
drupal_mail('nodebasket', 'order', $to, language_default(), $values, $values['email']);
if (isset($_SESSION['messages']['error'])) {
drupal_set_message(t('Order sending error. Sorry, %name', array('%name' => $values['name'])), 'warning');
}
else {
$date = date("d.m.Y (H:i:s)");
save_order_to_db();
$_SESSION['basket_history'][$date] = $_SESSION['basket'];
unset($_SESSION['basket']);
$form_state['redirect'] = 'basket/history';
drupal_set_message(t('The order is sent. Thanks for filling out the form, %name', array('%name' => $values['name'])));
}
}
function
nodebasket_mail($key, &$message, $values) {
//формируем тело письма
$bodymess = t('Оформление заказа')."\n\n";
$bodymess.=t('Имя отправителя').': '.$values['name']."\n";
$bodymess.=t('Контактный телефон').': '.$values['phone']."\n";
$bodymess.=t('Способ оплаты').': '.$values['payway']."\n";
$bodymess.=t('Способ доставки').': '.$values['deliverymethod']."\n";
if(isset($values['adress'])) {
$bodymess.=t('Адрес доставки').': '.$values['adress']."\n";
}
$bodymess.="\n".t('Заказанные товары:')."\n";
$bodymess.=$values['tableitems'];
$bodymess.="\n\n";
if(isset($values['descr'])) {
$bodymess.=t('Замечания и дополнения').': '.$values['descr']."\n";
}
// Формируем тему письма
$subject = t("Заказ товара с sitename", array('sitename' => variable_get('site_name', "t('вашего сайта')")));
//Смотрим id письма
switch ($key) {
//Если это заказ (order) со страницы оформления заказа,то добавляем тему и тело письма
case 'order':
$message['subject'] = $subject;
$message['body'] = $bodymess;
break; //выходим из цикла и функция возвращает и отдает на отправку тело и тему письма
}
}
?>
Комментарии
Самый сок и основа отправки - внизу, выше лишь подготавливающая обработка и отрисовка формы
Текст съехал, поблочно и поправляя стоки отправлю:
Проходим валидацию:
<?php
form_set_error('email', t('Please provide an e-mail
function nodebasket_orderform_validate($form, &$form_state) {
if (!
valid_email_address($form_state['values']['email'])) {address.'));
}
$regex = "^[0-9\-\(\)\ \+]+$";
$phone_state = $form_state['values']['phone'];
if (!ereg($regex, $phone_state)) {
form_set_error('phone', t('Please provide a valid
phone number.'));
}
}?>
Обрабатываем событие Сабмита если валидация успешна:
<?php
$values['tableitems']=$tableitems;
drupal_mail('nodebasket', 'order', $to, language_default(),
$date = date("d.m.Y (H:i:s)");
drupal_set_message(t('The order is sent. Thanks for
function nodebasket_orderform_submit($form, &$form_state) {
global $language;
//Получаем данные из формы после проверки валидации
$values = $form_state['values'];
$tableitems="";
foreach ($_SESSION['basket'] as $k => $v)
{
$tableitems.= check_plain($v['title']) .' | '.
t('Количество') .': '. $v['count'] ."\n". t('Страница товара') .': '. url('node/'. $k, array('absolute' => TRUE)) ."\n";
}
//Получаем куда отправлять (если в "О сайте"указан e-mail, то ставим его
//print_r(variable_get('site_mail', ini_get('sendmail_from')));
//exit;
$to = variable_get('nodebasket_basket_email',
variable_get('site_mail', ini_get('sendmail_from')));
//производим отправку письма, перед его выполнением срабатывает //nodebasket_mail, который составит тело и тему письма
//drupal_mail('nodebasket', 'order', $to, language_default(),
// array(), $values['email']);
$values, $values['email']);
if (isset(
$_SESSION['messages']['error'])){
drupal_set_message(t('Order sending error. Sorry,
%name', array('%name' => $values['name'])), 'warning');
}
else {
// save_order_to_db(); - пока не будем записывать в базу
$_SESSION['basket_history'][$date] = $_SESSION['basket'];
unset(
$_SESSION['basket']);$form_state['redirect'] = 'basket/history';
filling out the form, %name', array('%name' =>
$values['name'])));
}
?>}
Ну и hook_mail для нашего модуля:
<?php
//Смотрим id письма
//Если это заказ (order) со страницы оформления заказа,то добавляем тему и тело письма
function nodebasket_mail($key, &$message, $values) {
//формируем тело письма
$bodymess = t('Оформление заказа')."\n\n";
$bodymess.=t('Имя отправителя').': '.$values['name']."\n";
$bodymess.=t('Контактный телефон').':
'.$values['phone']."\n";
$bodymess.=t('Способ оплаты').': '.$values['payway']."\n";
$bodymess.=t('Способ доставки').':
'.$values['deliverymethod']."\n";
if(isset($values['adress'])) {
$bodymess.=t('Адрес доставки').':
'.$values['adress']."\n";
}
$bodymess.="\n".t('Заказанные товары:')."\n";
$bodymess.=$values['tableitems'];
$bodymess.="\n\n";
if(isset($values['descr'])) {
$bodymess.=t('Замечания и дополнения').':
'.$values['descr']."\n";
}
// Формируем тему письма
$subject = t("Заказ товара с @sitename", array('@sitename'
=> variable_get('site_name', "t('вашего сайта')")));
switch ($key) {
case 'order':
$message['subject'] = $subject;
$message['body'] = $bodymess;
break; //выходим из цикла и функция возвращает и отдает на отправку тело и тему письма
}
}?>
После длительных поисков наткнулся на интересный ресурс: очень понятно и доходчиво: http://php-include.ru/stati/otpravka-email-sredstvami-drupal
Завтра опробую и сообщу о результатах
http://xandeadx.ru/blog/drupal/85
массив должен быть
https://api.drupal.org/api/drupal/modules%21system%21system.api.php/func...
Return value drupal_mail()
The $message array structure containing all details of the message. If already sent ($send = TRUE), then the 'result' element will contain the success indicator of the e-mail, failure being already written to the watchdog. (Success means nothing more than the message being accepted at php-level, which still doesn't guarantee it to be delivered.)
ну да должен быть
$message['body'][] = $bodymess;