通过电子邮件发送整个节点(包括模板内容)


9

我已经创建了自己的自定义node.tpl.php文件。现在,我希望通过电子邮件向整个节点发送电子邮件,每次用户创建该内容类型的新节点时(我已确保node.tpl.php文件中的所有HTML都是电子邮件友好的)。

我怎样才能做到这一点?理想情况下,保存节点后,我希望电子邮件自动转到特定的电子邮件地址。

我发现将规则HTML Mail结合使用可以实现我想要的功能。除...创建规则操作时,无法选择通过电子邮件发送整个节点(包括node.tpl.php主题)。规则仅提供通过电子邮件发送特定节点字段的选项(不带主题)。

任何建议将不胜感激!

Answers:


20

这是另一种方法。(此沙箱中提供了代码。)

nodemail.info

name = Nodemail
description = Sends node e-mails.
core = 7.x

nodemail.install”

<?php
function nodemail_enable() {
  $current = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  $addition = array('nodemail' => 'NodemailMailSystem');
  variable_set('mail_system', array_merge($current, $addition));
}

function nodemail_disable() {
  $mail_system = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  unset($mail_system['nodemail']);
  variable_set('mail_system', $mail_system);
}

nodemail.module

<?php
class NodemailMailSystem extends DefaultMailSystem {
  public function format(array $message) {
    $message['body'] = implode("\n\n", $message['body']);
    $message['body'] = drupal_wrap_mail($message['body']);
    return $message;
  }
}

function nodemail_mail($key, &$message, $params) {
  switch ($key) {
    case 'node_mail':
      $message['headers']['Content-Type'] = 'text/html; charset=UTF-8;';
      $message['subject'] = $params['subject'];
      $message['body'][] = $params['body'];
      break;
  }
}

function nodemail_node_insert($node) {
  if ($node->type == 'mycontenttype') {
    $params['subject'] = 'Node "' . $node->title . '" was created';
    $params['body'] = render(node_view($node));
    $to = variable_get('site_mail', '');
    $from = 'noreply@example.com';
    $lang = language_default();
    drupal_mail('nodemail', 'node_mail', $to, $lang, $params, $from);
  }
}

安装文件的内容和NodemailMailSystem类用于允许该模块发送html电子邮件。另外2个功能是hook_mail()hook_node_insert()的实现,这些实现在mycontenttype创建的节点时处理发送电子邮件。您必须要注意的一件事是,Drupal将使用用于节点创建页面的主题的节点模板文件(如果没有主题,则使用核心node.tpl.php)作为节点视图。 。您可能还需要检出此处使用的node_view()drupal_mail()函数。这整个事情应该与Drupal 7核心功能一起使用(不需要贡献的模块)。


谢谢!除...外,该方法有效……在我的网站上,节点的模板根据分类法术语进行更改。因此,如果用户使用术语1标记节点,则使用模板1渲染该节点。(请参阅drupal.stackexchange.com/questions/23688/…)。当我使用您的代码时,仅使用默认的node.tpl.php文件(而不使用用于呈现该节点的模板)。有没有什么办法解决这一问题?(很抱歉,如果我不提早提到这个问题很讨厌-我认为这不会成为问题,因为渲染的节点确实包含模板)。
big_smile 2012年

@big_smile问题可能是我在回答中提到的问题:用于节点创建的管理主题。我目前可以想到的可能解决方法:1)使用默认主题进行内容编辑/创建(取消选中“ admin / appearance”中的复选框)2)将必要的代码从template.php和节点模板复制到admin theme文件夹,清除缓存3)在您的模块中为电子邮件创建自定义模板。
Madis 2012年

6

您可以创建作为渲染节点的令牌,或者创建将发送渲染节点的自定义“规则”操作。

你想看看

$build = node_view($node);
$html = render($build);

用代码更新

此代码显示如何向可以在规则中访问的所有节点添加属性。我创建了一个名为googletorp

/**
 * Implements hook_entity_property_info_alter().
 */
function googletorp_entity_property_info_alter(&$info) {
  // Add the current user's shopping cart to the site information.
  $info['node']['properties']['rendered_node'] = array(
    'label' => t("Rendered_node"),
    'description' => t('The full rendered node.'),
    'getter callback' => 'googletorp_render_node',
  );
}

/**
 * Return a rendered node as HTML.
 */
function googletorp_render_node($node) {
  return render(node_view($node));
}

第一个函数是一个将属性添加到节点的挂钩,该节点在其中定义了提供数据的回调。第二个函数是返回已渲染节点的实际回调。

为了使其正常工作,您需要安装实体令牌模块,该模块是实体API模块的一部分,但是无论如何,这是规则所必需的。


谢谢-这正是我所需要的。但是,你是怎么做的?我已经下载了“规则和令牌”,但是没有选项来发送渲染的节点。
big_smile

@big_smile您必须自己创建此功能-有几种方法可以执行此操作。
googletorp

感谢您抽出时间回复。老实说,您的回答不是很有帮助。如果我自己知道如何创建功能,那么我就不会提出问题。显然,我不希望您发布完整的答案。但是,如果您可以提供指向详细说明如何执行建议的资源的链接,将会很有帮助,
big_smile 2012年

2
@big_smile所以你不赞成我,因为我没喂你吗?您是否尝试过Google,是否尝试过项目首页?我在30秒内找到了广泛的Rules文档,我相信您也可以这样做。别偷懒
googletorp

1
我不懒惰,不期望被喂饱。您的答案非常模糊,并不意味着可以在“规则”文档中找到答案。实际上,“您将自己创建此功能”意味着我将不得不生产超出规则的内容。这就是为什么我拒绝您的回答-太含糊,无法提供帮助。但是,通过查看您的个人资料,我可以发现您非常有帮助,基于此,我认为您的含糊其辞并非故意。我认为这次否决票不会很令人沮丧。如果可以的话,我会撤消它。我希望不要有难过的感觉。
big_smile 2012年

1

另一个选择是使用我的模块Entity2Text(DRupal 7)。

现在,它为实体的每个查看模式提供一个“ textexport”令牌。这对于许多字段类型都适用,但是对于一些更复杂的字段(例如地址字段)也存在一些问题。

我还将添加“ htmlexport”。如果您想尝试一下,请签出此分支:http : //drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

您仍然必须使用RuleMimeMail(或者上面提到的htmlmail)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.