कस्टम टेम्पलेट के साथ ईमेल भेजने के लिए drupal_mail () का उपयोग कैसे करें


31

मैं drupal_mail()ईमेल भेजने के लिए फ़ंक्शन का उपयोग करना चाहता हूं, लेकिन एक कस्टम HTML टेम्पलेट के साथ ताकि वे मेरी वेबसाइट डिजाइन के अनुसार हों, लेकिन मैं हुक और मॉड्यूल आदि के लिए एक पूर्ण नौसिखिया हूं, इसलिए मैं किसी तरह की व्याख्या की सराहना करूंगा या शुरुआती गाइड कृपया।

मैं खुद टेम्पलेट बना सकता हूं, मुझे बस यह जानना होगा कि drupal_mail()इसका उपयोग कैसे किया जाए ।

जवाबों:


39

यदि आप अपने कस्टम मॉड्यूल के माध्यम से मेल भेजने की कोशिश कर रहे हैं तो आप नीचे बताए गए गाइड का पालन कर सकते हैं। कहो, मेरे पास "कॉमर्स कैनवस (Commerce_canvas)" नामक एक मॉड्यूल था। 1. लिंक का समर्थन करने और अन्य एन्कोडिंग प्रकार जोड़ने के लिए सबसे पहले Drupal का मेल फ़ंक्शन


/**
 * 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. फिर, अपने मॉड्यूल में HOOK_mail को हुक करें

/**
 * 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. फिर आपको अपने मॉड्यूल से मेल प्राप्त करने के लिए एक आवरण समारोह बनाने की आवश्यकता है।

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;
    }
}

यह फ़ंक्शन ईमेल भेजेगा और साथ ही कुछ भी गलत होने पर डिबग संदेश बना देगा। लेकिन फिर भी आप HTML मेल नहीं भेज पाएंगे क्योंकि आपको अपने स्वयं के साथ Drupal 7 के डिफ़ॉल्ट DefaultMailSystem को विस्तारित करने की आवश्यकता है । तो निम्नलिखित के रूप में करने की जरूरत है,


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)
        );
    }
}


अगला आपको एक नया थीम फ़ंक्शन पंजीकृत करने की आवश्यकता है जो आपके कस्टम टेम्पलेट फ़ाइल को आपके hook_theme () में कॉल करेगा।


/**
 * 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',
      ),

    );
  }
}

अंतिम बार आपको ईमेल भेजने के समय इस थीम फ़ंक्शन को कॉल करना होगा,



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

}

ये Drupal 7 में HTML ईमेल को सही ढंग से संभालने के लिए पूर्ण स्निपेट हैं। इस प्रकार हुक_टैम में आप अपना कस्टम टेम्प्लेट दे सकते हैं।


1
आपके उत्तर के लिए बहुत बहुत धन्यवाद - यह वही है जो मैंने पूछा था! दुर्भाग्य से अब जब मैंने काम को शामिल कर लिया है और यह कि वहाँ मॉड्यूल हैं जो मेरे लिए सब कुछ कर सकते हैं मुझे लगता है कि मैं अपना हुक बनाने से पहले मैं इंतजार करूंगा। हालाँकि, मैं आपके उत्तर के लिए पर्याप्त धन्यवाद नहीं दे सकता क्योंकि यह वह सब कुछ है जो मैंने माँगा था। काश मैं एक से अधिक बार उत्थान कर सकता
एंडी

11
बहुत बढ़िया जवाब। जिस तरह से
द्रुपाल

1
But still you won't be able to send the HTML mail..., सही।
एजाज

@ अजय, हाँ आप कर सकते हैं। यह वह करता है।
ऐक मुखोपाध्याय

1
रिकॉर्ड के लिए: निम्न मॉड्यूल का उपयोग करना अधिक आसान है: drupal.org/project/simple_mail
gue

11

यदि आप कस्टम टेम्प्लेट की मदद से आउटगोइंग मेल्स को थीम करना चाहते हैं, तो आपको HTML मेल मॉड्यूल का उपयोग करना चाहिए ।

आप अपने संदेशों को उसी तरह थीम देते हैं जैसे आप अपनी वेबसाइट के बाकी हिस्सों को थीम करते हैं।

यह अन्य मॉड्यूल के साथ अच्छी तरह से काम करता है, जैसे प्रिंट , मेल माइम , आदि।

HTML मेल का उपयोग करने के लिए आपको मेल सिस्टम मॉड्यूल स्थापित करना होगा ।


1
कृपया ध्यान दें कि HTML मेल मेल माइम मॉड्यूल के साथ काम करता है, न कि माइम मेल (माइम मेल और HTML मेल समान चीजें करते हैं और एक-दूसरे को ओवरराइड करते हैं)।
पैट्रिक केनी

@indrock आपके उत्तर के लिए भी धन्यवाद। क्या आप जानते हैं कि अगर मैं php कोड का उपयोग करके भेजे गए विषय ईमेल को HTML मेल मॉड्यूल का उपयोग कर सकता हूं?
एंडी

4

उदाहरण का उपयोग:

    $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
फ़ंक्शन का उपयोग करने के drupal_mail()बजाय मेल का उपयोग करने के लिए हमेशा मेल भेजने की सिफारिश की जाती है (जो केवल भेजे गए मेल का उपयोग करने के लिए काम करता है ।$system->mail(..hook_mail_alterdrupal_mail()
अजीत

मैं फ़ंक्शन (सिंटैक्स / कोड वार) का उपयोग करने के बारे में पूरी तरह से अवगत हूं, मैं सिर्फ यह जानना चाहूंगा कि एक विषय कैसे बनाया जाए ताकि मैं drupal_mailआदि के साथ भेजे गए सभी ईमेलों पर आवेदन कर सकूं, लेकिन वैसे भी धन्यवाद
एंडी

मैं इस कोड का उपयोग कर रहा हूं, इसका काम ठीक है लेकिन साथ ही एक खाली मेल भी भेजा है।
विहल सिरसोदिया

3

HTML ई-मेल भेजने के लिए, आप Mimemail मॉड्यूल का उपयोग कर सकते हैं । एक बार जब यह सेट और कॉन्फ़िगर हो जाता है, तो आप बस टेम्पलेट तैयार कर सकते हैं, इसे नाम दे सकते हैं mimemail-message.tpl.php, इसे अपनी थीम डायरेक्टरी में छोड़ सकते हैं, और यह स्वचालित रूप से सभी आउटगोइंग ई-मेल पर लागू हो जाएगा (यह मानते हुए कि आपने सभी मेल को मिम्मेल द्वारा भेजे जाने के लिए कॉन्फ़िगर किया है) ।

मॉड्यूल को स्थापित करना शायद ओवरराइड करने की तुलना में आसान है drupal_mail()


आपके उत्तर के लिए धन्यवाद! क्या मैं इस मॉड्यूल के साथ PHP का उपयोग करके ईमेल भेज सकता हूं? यदि हां, तो क्या आप मुझे दिखा सकते हैं कि कृपया कैसे?
एंडी

मेल सिस्टम के साथ संयुक्त होने पर, मिम्मेल, साइट द्वारा भेजे गए सभी ई-मेलों को संभाल लेगा। इस प्रकार, कस्टम मॉड्यूल सहित किसी भी मॉड्यूल द्वारा भेजे गए सभी ई-मेल स्वचालित रूप से मीमाइल के माध्यम से बाहर भेजे जाएंगे। यदि आप सीमित करना चाहते हैं कि कौन से ई-मेल प्रभावित हैं, तो आप मेल सिस्टम के मॉड्यूल कॉन्फ़िगरेशन विकल्पों का उपयोग कर सकते हैं।
पैट्रिक केनी

1
मुझे लगता है कि एंडी ने जो पूछा है वह यह नहीं है। सही है, आपको ऐसा करने के लिए Mimemail मॉड्यूल की आवश्यकता होगी या अपना खुद का MailSystem रोल करना होगा, लेकिन हो सकता है कि एंडी से पूछा जाए कि ईमेल बॉडी को कैसे थीम किया जाए जो कि हुक_मेल () फ़ंक्शन और एक थीम ('my_custom_theme) में किया जाए?
आयुष

1
मुझे लगता है कि @Andy यह जानना चाहता है कि क्या Mimemail मॉड्यूल में कोई फ़ंक्शन है जिसे ईमेल भेजने के लिए कहा जा सकता है।
kiamlaluno

@kiamlaluno आप सही हैं, यह वही है जो मैं जानना चाहता हूं
एंडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.