hook_mail и drupal_mail Не приходят письма.

Главные вкладки

Аватар пользователя ShamAnton ShamAnton 15 августа 2013 в 16:41

Здравствуйте! Реализую в модуле 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'$tolanguage_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; 
//выходим из цикла и функция возвращает и отдает на отправку тело и тему письма
    
}
    
    
}
?>

Комментарии

Аватар пользователя ShamAnton ShamAnton 15 августа 2013 в 16:56

Текст съехал, поблочно и поправляя стоки отправлю:
Проходим валидацию:

<?php
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.'
));
    }
}
?>

Обрабатываем событие Сабмита если валидация успешна:

<?php
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'$tolanguage_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'])));

    }
    
}

?>

Ну и hook_mail для нашего модуля:

<?php
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; 
//выходим из цикла и функция возвращает и отдает на отправку тело и тему письма
    

}
?>
Аватар пользователя q2_faith q2_faith 15 августа 2013 в 18:22

"ShamAnton" wrote:
$message['body'] = $bodymess;

массив должен быть
https://api.drupal.org/api/drupal/modules%21system%21system.api.php/func...
"ShamAnton" wrote:
if (isset($_SESSION['messages']['error']))

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.)