Drupal 6 的 Mail API 是为 Drupal 模块提供邮件发送服务的。大多数时候,使用 Mail API 需要两个步骤:
1,在你的模块中实现 hook_mail().
2,在模块的其它地方,使用 drupal_mail() 函数调用你的 hook_mail() 实现,并进行附加的格式化和发送操作。
在上一节中,我们大体上看了一下 drupal_mail() 函数。现在,我们来仔细分析一下这个函数。在 emailusers_compose_form_submit() 函数中,我们用下列参数调用了 drupal_mail():
drupal_mail(
'emailusers',
'composemessage',
$account->mail,
user_preferred_language($account),
$form_values,
variable_get('site_mail', null),
true // Automatically send
);
共有七个参数!为了了解这里究竟是怎么回事,我们逐个分析这些参数。
第一个参数 (emailusers) 是包含 hook_mail() 实现的模块的名称。稍后,我们将分析 emailusers_mail() 钩子,当执行 drupal_mail() 函数时,将调用这个钩子。
第二个参数,composemessage,是一个键值(key),它将被传递给hook_mail() 实现。稍后我们将看到,邮件钩子将根据这个键值确定如何处理消息。换句话说,只要使用不同的键值,就可以用邮件钩子处理各种不同的邮件发送任务。
第三个参数应该包含目的地址。在本例中,管理员将把 email 发送到他正在查看的账户的 emial 地址。地址存放在 $account->mail 中。
第四个参数是 t() 以及其它翻译工具翻译 email 消息时采用的语言。为什么要指定语言呢?因为接收邮件的用户喜欢的语言,可能与发送邮件的系统管理员采用的语言不同。
幸运的是,user_preferred_language()函数接受一个账户对象(如同load_user() 返回的对象)作为参数,这个函数可以返回适当的 locale 信息。
第五个参数保存了一个关联数组的数据,生成邮件时可能会用到此数据。这个数据被传递给 hook_mail() 的实现,稍后我们将用到它。在本例中,此数据恰好就是通过我们的表单提交的值。因此我们此处传递的是 $form_values。
再来看第六个参数,我们需要指定一个发送地址。这个邮件是谁发送的?Drupal 的全站配置中的一个值是管理员的 email 地址。我们可以通过读取配置使用这个地址 variable_get('site_mail', null)。这个函数尝试读取 'site_mail' 配置。如果找不到这个配置,将返回默认值 null (在这种情况下,邮件库将尝试分配一个适当的地址)。
七个参数中的最后一个是个布尔标志,它表明是否发送邮件。当 drupal_mail() 被执行时,它将返回一个具有特殊结构的数组,这个数组可以传递给drupal_mail_send()。不过,如果最后一个参数被设置为 true,drupal_mail() 将在返回前发送邮件。在这种情况下,就不必调用 drupal_mail_send() 函数了,甚至不必保存 drupal_mail() 的返回值。
如果邮件无法发送将会怎样?
如果邮件程序配置不当或是 Drupal 或 PHP 检测到邮件子系统的错误,将在屏幕上打印出一条错误消息。不过,如果底层的邮件系统已经接受了准备发送的邮件,出错消息将发送到 from 参数指定的地址。正因为如此,创建一个邮箱(或者别名)用于接受邮件派送错误是个很好的做法。
当 drupal_mail() 被调用时,它将进行一系列步骤接受传入的 7 个参数并创建一个适当的邮件。例如,它设置默认的 RFC 2822 邮件头部,并确保某些值被设定(例如 from 地址)。
随后它执行 hook_mail() 的实现(如果能找到的话)。
然和,它进行其它几个步骤,比如在发送邮件(可选的)以前执行hook_mail_alter() 并返回一条格式化了的消息。
因此,mail hook 是在这个过程的中间执行的。它做了些什么呢?简而言之,它负责设定适当的字段(例如 subject, CC 和 BCC 字段)以及为邮件创建格式化的正文。
分享到:
相关推荐
Drupal7 API
Drupal 6 API文档,CHM格式
drupal 6 的API手册,CHM版本。方便携带和查询。
drupal_6_api.chm 英文的. 要的直接下载.
Laravel开发-drupal-jsonapi 使用JSONAPI模块使用Drupal的ORM。
WLW_BLOGAPI是网上最流行的BLOGAPI模块,用于取代DRUPAL自带的BLOGAPI,使用这个模块,可以方便地使用桌面工具(比如 Windows Live Writer)离线编写博客文章。但在我的使用过程中,我发现了一些BUG和不足,于是尝试...
python库。 资源全名:ckanext-drupal-api-0.1.3.tar.gz
简单的 Drupal 8 模块,通过使用 Mandrill 在保存新文章节点时发送电子邮件来演示邮件 API 的使用。
drupal voting apidrupal voting apidrupal voting apidrupal voting apidrupal voting api
drupal 6.x (drupal-6.zh-hans)简体中文集成汉化包.
drupal_5_api.chm 英文的.要的下载.
精心总结的drupal开发资源,已成功开发2个网站
Add new resources to Drupal’s REST API using the REST plugin system Generate API documentation that complies with the OpenAPI (Swagger) standard Cover Front Matter Part l.Decoupled Drupal ...
一个简单的 Drupal 8 安装配置文件,突出显示了与 Drupal 的 RESTful 交互。 安装 安装和初始化。 $ > npm install $ > grunt 安装站点。 根据需要更改数据库网址$ > drush @restapi si --db-url=mysql://restapi:...
Drupal API 它如何建立 cronjob每分钟都会在队列之外处理任务。 Cron任务每隔15分钟运行一次,并将更多垃圾拉入该队列。 几个小时后,它建成了。 建造 docker-compose up --build 启动可能需要大约5分钟。 检查...
drupal安装使用笔记,含drupal安装和所见即所得编辑器fckeditor在drupal里的安装
drupal7 vs drupal6 详细的列出了从drupal6升级到drupal7所做的一些改动。 从代码,配置,UI,API等全方面的诠释drupal7与drupal6 的不同之处。
drupal-scaffold, 使用 Drupal/core更新 Drupal scaffold文件的Composer插件 ...) 插件,用于自动下载Drupal脚本文件,通过编写器使用 drupal/core 。建议在 root root的项目的标准位置放置供应商目录;但是,供应商目
Drupal dataDrupal data
const DrupalAPI = require ( 'drupal-org-api' ) ; const drupalapi = new DrupalAPI ( ) ; exports.node(filterOptions) 参数 filterOptions : Object ,查询字符串过滤器选项 返回: Promise ,未决...