Özel şablon ile e-posta göndermek için drupal_mail () nasıl kullanılır


31

Bu drupal_mail()işlevi, e-postaları göndermek için kullanmak istiyorum, ancak özel bir HTML şablonuyla, web sitesi tasarımımı koruyacaklar, ancak kancalar ve modüller vb. Konusunda tam bir yeniyim, bu yüzden bir çeşit açıklama veya yeni başlayanlar lütfen.

Şablonu kendim oluşturabilirim, nasıl kullanacağımı bilmem drupal_mail()gerekiyor.

Yanıtlar:


39

Postaları özel modülünüz aracılığıyla göndermeye çalışıyorsanız, aşağıdaki kılavuzu takip edebilirsiniz. Diyelim ki "Ticaret Tuvali (commerce_canvas)" adında bir Modülüm vardı. 1. Bağlantıları desteklemek ve diğer kodlama türlerini eklemek için Drupal'ın posta işlevini değiştirin.


/**
 * Implements hook_mail_alter()
 * @param string $message
 */
function commerce_canvas_mail_alter(&$message) {
    $headers = array(
        'MIME-Version' => '1.0',
        'Content-Type' => 'text/html; charset=iso-8859-1; format=flowed',
        'Content-Transfer-Encoding' => '8Bit',
        'X-Mailer' => 'Drupal',
    );
    foreach ($headers as $key => $value) {
        $message['headers'][$key] = $value;
    }
}
  1. Ardından, HOOK_mail’i modülünüze takın

/**
 * Implements hook_mail()
 * @param string $key
 * @param string $message
 * @param unknown_type $params
 */
function commerce_canvas_mail($key, &$message, $params) {

    //Language Selection
    $options = array(
        'langcode' => $message['language']->language,
    );
    switch($key) {
        case "user_payment_notification" :
            $message['subject'] = isset($params['subject']) ? $params['subject'] : $message['subject'] = t('Payment recieved @site-name', array('@site-name' => variable_get('site_name', 'Express Canvas')), $options);
            $message['body'][] = isset($params['body']) ? $params['body'] : NULL;
            if (isset($params['headers']) && is_array($params['headers'])) {
                $message['headers'] += $params['headers'];
            }
            break;
    }
}


  1. Ardından, postanızı modülünüzden çağırmak için bir sarmalayıcı işlevi oluşturmanız gerekir.

function commerce_canvas_mail_send(array $values = array()) {
    $module = $values['module'];
    $key = $values['key'];
    $to = $values['to'];
    $from = $values['form'];
    $language = isset($values['lang']) ? $values['lang'] : language_default();
    $params = array(
        'subject' => $values['subject'],
        'body' => $values['body'],
    );
    if(array_key_exists('headers', $values)) {
        $params['headers'] = $values['headers']; //Assumed as an array
    }
    $send = TRUE;
    $mail = drupal_mail($module, $key, $to, $language, $params, $from, $send);
    if($mail['result']) {
        return TRUE;
    } else {
        $error_msg = 'Failed to send the email in commerce_canvas Module';
        watchdog('canvas-email', $error_msg, array(), WATCHDOG_ALERT);
        return FALSE;
    }
}

Bu işlev e-postayı gönderir ve yanlış bir şey olursa hata ayıklama mesajları oluşturur. Ancak yine de HTML postasını gönderemezsiniz çünkü Drupal 7'nin varsayılan DefaultMailSystem'ını kendiniz ile genişletmeniz gerekir . Bu yüzden aşağıdaki gibi yapmanız gereken


class CommerceCanvasMailSystem extends DefaultMailSystem {
    /**
     * Concatenate and wrap the e-mail body for plain-text mails.
     *
     * @param $message
     *   A message array, as described in hook_mail_alter().
     *
     * @return
     *   The formatted $message.
     */
    public function format(array $message) {
        $message['body'] = implode("\n\n", $message['body']);
        return $message;
    }

    /**
     * Send an e-mail message, using Drupal variables and default settings.
     *
     * @see http://php.net/manual/en/function.mail.php
        * @see drupal_mail()
     *
     * @param $message
     *   A message array, as described in hook_mail_alter().
     * @return
     *   TRUE if the mail was successfully accepted, otherwise FALSE.
     */
    public function mail(array $message) {
        $mimeheaders = array();
        foreach ($message['headers'] as $name => $value) {
            $mimeheaders[] = $name . ': ' . mime_header_encode($value);
        }
        $line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS);
        return mail(
        $message['to'],
        mime_header_encode($message['subject']),
        // Note: e-mail uses CRLF for line-endings. PHP's API requires LF
        // on Unix and CRLF on Windows. Drupal automatically guesses the
        // line-ending format appropriate for your system. If you need to
        // override this, adjust $conf['mail_line_endings'] in settings.php.
        preg_replace('@\r?\n@', $line_endings, $message['body']),
        // For headers, PHP's API suggests that we use CRLF normally,
        // but some MTAs incorrectly replace LF with CRLF. See #234403.
        join("\n", $mimeheaders)
        );
    }
}


Sonra, özel şablon dosyanızı hook_theme () kodunuzda çağıracak yeni bir tema fonksiyonu kaydetmeniz gerekir.


/**
 * Implements hook_theme();
 */
function commerce_canvas_theme($existing, $type, $theme, $path) {
  if($type == 'module') {
    return array(
      'tracking_code_email' => array(
        'variables' => array(
          'image_path' => NULL,
          'user' => NULL,
          'page' => NULL,
        ),
        'template' => 'commerce-canvas-tracking-code',
        'path' => drupal_get_path('module', 'commerce_canvas').'/theme',
      ),

    );
  }
}

Son olarak, e-postayı şu şekilde gönderirken, bu tema işlevini çağırmanız gerekir,



function a_custom_function($params) {

$email_text_user = theme('tracking_code_email', array(
                    'image_path' => $base_url . '/' . drupal_get_path('module', 'commerce_canvas') . '/images',
                    'user' => null,
                    'page' => array(
                        'greet_text' => t('Thank you for your order at Express Canvas. Your order is ready and has shipped. You may track your order using FedEx tracking with your tracking number: '.$order->field_tracking_number['und']['0']['value'].''),

                    ),
                ));
$sent_to_user = commerce_canvas_mail_send($email_values_user);

}

Bunlar, HTML e-postasını Drupal 7’de doğru şekilde işleyebilmek için kullanılan kod parçası.


1
Cevabınız için çok teşekkür ederim - tam olarak istediğim şey buydu! Maalesef şimdi çalışmayı gördüm ve benim için her şeyi yapabilecek modüller var. Sanırım kendi kancamı oluşturmak için acele etmeden önce bekleyeceğim. Ancak, cevabınız için yeterince teşekkür edemem, çünkü istediğim her şey bu. Keşke birden fazla kez oy kullanabilseydim
Andy

11
Mükemmel cevap.
Drupal'ın

1
But still you won't be able to send the HTML mail..., sağ.
Ejaz

@Ejay, evet yapabilirsiniz. Bunu yapar.
Aneek Mukhopadhyay

1
Kayıt için: Aşağıdaki modülü kullanmak daha kolay: drupal.org/project/simple_mail
gue

11

Giden postaları özel şablonlar yardımı ile temalamak istiyorsanız, HTML Mail modülünü kullanmalısınız.

İletilerinizi, web sitenizin geri kalanıyla aynı şekilde temalandırmanıza izin verir.

Print , Mail mime vb. Diğer modüllerle iyi çalışır .

HTML posta kullanabilmek için Posta Sistemi modülünü kurmanız gerekir .


1
Lütfen HTML Mail'in Mime Mail ile değil Mail Mime modülüyle çalıştığını unutmayın (Mime Mail ve HTML Mail benzer şeyler yapar ve birbirlerini geçersiz kılar).
Patrick Kenny

@indrock Cevabınız için teşekkürler. Php kodu kullanılarak gönderilen e-postaları temalamak için HTML Mail modülünü kullanabilir miyim, biliyor musunuz?
Andy

4

Örnek kullanım:

    $module = 'module_name';
    $key = 'key';
    $language = language_default();
    $params = array();
    $from = NULL;
    $send = FALSE;
    $message = drupal_mail($module, $key, $email, $language, $params, $from, $send);

    $message['subject'] = $subject;
    $message['body'] = array();
    $message['body'][] = $line1;
    $message['body'][] = $line2;

    // Retrieve the responsible implementation for this message.
    $system = drupal_mail_system($module, $key);

    // Format the message body.
    $message = $system->format($message);

    // Send e-mail.
    $message['result'] = $system->mail($message);

4
Her zaman kullanarak postaları göndermek için tavsiye edilir drupal_mail()yerine $system->mail(..kullanmak için hook_mail_alterkullanarak gönderildi yalnızca postaların için çalışır fonksiyonunu ( drupal_mail().
AjitS

İşlevin nasıl kullanılacağının tam olarak farkındayım (sözdizimi / kod bilge), sadece bir temanın nasıl yapıldığını bilmek istiyorum, böylece drupal_mailvb ile gönderilen tüm e-postalara başvurabilirim , ama yine de teşekkür ederim
Andy

Bu kodu kullanıyorum, gayet iyi çalışıyor ancak bir de boş posta göndermiş.
vishal sirsodiya

3

HTML e-posta göndermek için Mimemail modülünü kullanabilirsiniz . Kurulduktan ve yapılandırıldıktan sonra, şablonu hazırlayabilir, adlandırabilir mimemail-message.tpl.php, tema dizininize bırakabilirsiniz ve tüm giden e-postalara otomatik olarak uygulanacaktır (tüm postaları Mimemail tarafından gönderilecek şekilde yapılandırdığınız varsayılarak) .

Modülü kurmak muhtemelen geçersiz kılmaktan daha kolaydır drupal_mail().


Cevabınız için teşekkür ederim! Bu modülle PHP kullanarak e-posta gönderebilir miyim? Eğer öyleyse, lütfen nasıl gösterir misiniz?
Andy

Mimemail, Posta Sistemi modülüyle birleştirildiğinde, site tarafından gönderilen tüm e-postaları devralacak. Böylece, özel modüller de dahil olmak üzere herhangi bir modül tarafından gönderilen tüm e-postalar, otomatik olarak Mimemail aracılığıyla gönderilecektir. Hangi e-postaların etkileneceğini sınırlamak istiyorsanız, Mail System'in modül yapılandırma seçeneklerini kullanabilirsiniz.
Patrick Kenny,

1
Sanırım bu Andy'nin tam olarak sorduğu şey değil. Doğru, Mimemail modülüne ihtiyacınız olacak veya bunu yapmak için kendi MailSystem'ınızı kullanmanız gerekecek, ancak Andy'nin hook_mail () işlevinde yapılması gereken bir e-posta gövdesinin nasıl temasını ve içinde bir tema ('my_custom_theme') çağrısını nasıl yapacağını sormuş olabilir mi?
AyeshK

1
Sanırım @Andy, Mimemail modülünün e-posta göndermek için çağrılabilecek bir işlevi olup olmadığını bilmek istiyor.
kiamlaluno

@kiamlaluno Haklısın, bu lütfen bilmek istediğim şey
Andy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.