makinacorpus / drupal-netsmtp
基于PEAR::Net_SMTP的Drupal SMTP模块
Requires
- pear/net_smtp: ^1.7
README
使用Net_SMTP PEAR库的SMTP连接器。
运行时配置
Drupal邮件系统配置
为了方便,此模块使用一个特定的Drupal邮件系统实现,作为代理,允许您使用不同的格式化和邮件发送器。
要使用它,只需将其添加到settings.php文件中
$conf['mail_system'] = [
'default-system' => '\\MakinaCorpus\\Drupal\\NetSmtp\\MailSystemProxy'
];
然后您可以这样设置格式化器
$conf['netsmtp_proxy'] = [
'default' => 'MimeMailSystem',
];
如果您需要为其他模块指定特定的格式化器,可以使用此变量,方式与核心'mail_system'变量相同
$conf['netsmtp_proxy'] = [
'default' => 'MimeMailSystem',
'MYMODULE' => 'SomeOtherFormatter',
'MYMODULE_MYMAIL' => 'YetAnotherFormatter',
];
就这样了。
SMTP配置
至少您需要指定您的SMTP服务器主机
$conf['netsmtp'] = [
'default' => [
'hostname' => '1.2.3.4'
],
];
主机名可以是IP或有效的域名。
为了使用SSL,只需添加'use_ssl'键,值为true或false。
如果您愿意,可以使用'port'键设置端口号。
如果您需要认证,请使用以下方法
$conf['netsmtp'] = [
'default' => [
'hostname' => 'smtp.provider.net',
'username' => 'john',
'password' => 'foobar',
],
];
另外,如果您需要将主机名宣传为不同于当前localhost.localdomain的另一个主机名,可以设置'localhost'变量。
一个完整的示例
$conf['netsmtp'] = [
'default' => [
'hostname' => 'smtp.provider.net',
'port' => 465,
'use_ssl' => true,
'username' => 'john',
'password' => 'foobar',
'localhost' => 'host.example.tld',
],
];
注意,目前这仅支持PLAIN和LOGIN认证方法,我肯定太懒了,不想包括Auth_SASL PEAR包。
另外,您可以将'use_ssl'参数更改为'tls'值,并希望事情顺利进行,它应该会强制Net::SMTP库执行TLS连接。
高级SMTP配置
另外,您可以定义一组服务器,例如,如果您需要一个mailjet或mandrill连接
$conf['netsmtp'] = [
'default' => [
'host' => '1.2.3.4',
'ssl' => true,
],
'mailjet' => [
'host' => '1.2.3.4',
'ssl' => true,
'user' => 'john',
'pass' => 'foobar',
],
];
然后您可以通过在发送邮件时设置Drupal $message数组中的'smtp_provider'键来强制邮件通过除默认服务器以外的其他服务器。
标识项目
如果您需要标识来自不同项目和环境的邮件,可以使用以下变量之一或它们的任何组合
$conf['netsmtp_project_name'] = 'My client business project';
$conf['netsmtp_project_env'] = 'staging';
这两个都是任意值,可以设置为任何值,而不会对发送的邮件产生任何副作用。
它们都将映射到添加到邮件的附加邮件头
X-Project-Name
将包含netsmtp_project_name
值X-Project-Env
将包含netsmtp_project_env
值。
有一个例外,如果netsmtp_project_env
以prod
开头(不区分大小写),则X-Project-Env
头将被删除,邮件主题将保持不变,无论其他调试选项如何设置。
默认情况下,将环境设置为不以prod
子串开始的字符串,主题将更改,并将以包含项目名称和项目环境的字符串开头。要禁用此更改,只需设置
$conf['netsmtp_project_expose_subject'] = false;
向所有发出的邮件添加附加固定头
您可能需要根据各种目的向邮件添加任意平台驱动头,为此
$conf['netsmtp_additional_headers'] = [
'X-FORWARD' => 'some value',
'X-USERNAME' => '...',
// ...
];
覆盖代理
另外,如果您有特定的业务需求,可以覆盖代理类,首先编写自己的,例如
use MakinaCorpus\Drupal\NetSmtp\MailSystemProxy
MyProxy extends MailSystemProxy
{
// Do something
}
然后在任何自动加载器中注册它。
然后,告诉net-smtp模块使用它而不是提供的库存版本,在settings.php文件中
$conf['mail_system'] = [
'default-system' => 'MyProxy'
];
附加配置
默认情况下,此模块正确使用Drupal原生函数编码邮件主题,如果您使用了一个为您完成这项工作的格式化器,将 netsmtp_subject_encode 设置为 false 以禁用此行为。
$conf['netsmtp_subject_encode'] = false;
测试
测试您的Drupal配置
此模块提供了一个drush命令来测试您的配置
drush netsmtp-config-test mommy@myfamily.com
请注意,如果您已配置调试选项,它们将保持激活状态,并且如果已配置,邮件将根据配置路由。
测试SMTP连接
此模块提供了一个drush命令来测试您的SMTP连接
drush netsmtp-smtp-test \ --hostname=mail.makina-corpus.net --port=465 --use_ssl=tls --username=john.smith@example.com --password=ask mommy@myfamily.com
只有 hostname
参数是必须的。如果您将 ask
作为密码,drush 将安全地提示它,而不会显示它。
请注意,所有模块配置都将被绕过,如果您已配置邮件捕获,它将被跳过,并且测试邮件实际上会被发送。
调试
重新路由所有外出邮件
此功能在开发阶段非常有用,您不想将邮件发送给实际收件人。要激活它,只需设置
$conf['netsmtp_catch'] = 'someuser@example.com';
此外,您可以设置多个收件人
$conf['netsmtp_catch'] = [
'user1@example.com',
'user2@example.com',
'user3@example.com',
// ...
];
请注意,这是一个调试功能,收件人用户地址将不会被处理,这意味着您可以将一个包含逗号字符的电子邮件地址设置为,它不会被转义。
发送数据转储
此外,您还可以启用一个调试输出,该输出将把此模块将发送到文件系统上的所有MIME编码消息转储。只需设置
$conf['netsmtp_debug_mime'] = true;
然后,每封邮件都会转储到以下Drupal临时文件夹中
temporary://netsmtp/YYYY-MM-DD/
此外,您还可以使用此变量更改路径
$conf['netsmtp_debug_mime_path'] = 'private://netsmtp';
发送邮件跟踪
这可能会属于另一个模块,但如果您需要广泛的邮件跟踪日志记录,您可以选择启用
$conf['netsmtp_debug_trace'] = true;
这将激活一个 hook_mail_alter() 实现,该实现将在单个文件中记录平台发送的每封邮件活动
temporary://netsmtp/netsmtp-trace-YYYY-MM-DD.log
在此文件中,您将找到有关正在发送的邮件的各种内部Drupal模块信息,包括邮件发送时的堆栈跟踪。
此外,您还可以使用此变量更改路径
$conf['netsmtp_debug_trace_path'] = 'private://netsmtp';
历史
Drupal contrib 已经有一个名为 "SMTP" 的良好SMTP模块,可在以下URL找到
http://www.drupal.org/project/smtp
但在现实生活中,此模块尝试使用PHPMailer库连接到SMTP服务器,该库可在以下找到
https://github.com/PHPMailer/PHPMailer
如果您再仔细看看,您会发现PHPMailer不是一个SMTP连接器,虽然它可以,但它的主要目标是为您格式化MIME消息。
每次您使用Drupal与如MIMEMail之类的模块时,您可以在以下找到
http://www.drupal.org/project/mimemail
您会注意到您的消息已经非常精确地格式化在一个非常精确和有效的MIME封装中。
在这个场景背后发生的事情是,SMTP模块需要解构有效的MIME编码消息,以便能够使用PHPMailer API,然后它将尝试重新构建一个MIME消息。
在现实生活中,它确实解构了您的MIME编码消息,但以一种非常错误的方式,并在很多情况下破坏了它。