使用配置 PHP 文件和 PHP Mailer 将电子邮件发送到多个地址

Posted

技术标签:

【中文标题】使用配置 PHP 文件和 PHP Mailer 将电子邮件发送到多个地址【英文标题】:Sending emails to multiple addresses using config PHP file and PHP Mailer 【发布时间】:2021-12-11 03:28:18 【问题描述】:

我设置了一个 config.php 文件,以便我的客户可以轻松地在他们的网站上为在线表单添加电子邮件、主题和其他发送信息。 它看起来像这样:

<?php
$config = [
    "host" => "xxx",
    "username" => "xxx",
    "password" => "xxx",
    "secure" => "ssl", // ssl or tls
    "port" => 465,
    "sendTo" => "abc@email.com",
    "sendToBCC" => "xyz@email.com",
    "from" => "no-reply@email.com",
    "fromName" => "Contact Form"
];

我现在面临的挑战是发送多封电子邮件。我试过"sendTo" =&gt; "abc@email.com, efg@email.com, hik@email.com",,但它抛出了无效的电子邮件错误。

在发送文件中,我们有以下代码:

//Recipients
$mail->setFrom($config['from'], $config['fromName']);
$mail->addAddress($config['sendTo']);
$mail->addCC($config['sendToCC']);          
$mail->addBCC($config['sendToBCC']);
$mail->addAddress($_POST['email']);

所以我猜$mail-&gt;addAddress($config['sendTo']); 行在选择多封电子邮件时遇到了麻烦。我们如何编辑此代码以允许多个收件人?非常希望确保我们的客户可以轻松地将电子邮件添加到 config.php 文件而不是发送文件中。

【问题讨论】:

如果你查看examples for PHPMailer,你会发现你可以多次调用addAddress() @ChrisHaas。那非常有帮助。现在问题已经解决了。谢谢 【参考方案1】:

你可以支持这两种情况:

$addrs = preg_split('#[\\s;,]+#', $config['sendTo'], -1, PREG_SPLIT_NO_EMPTY);
foreach ($addrs as $addr) 
    $mail->addAddress($addr);

这会将"joe@mail1.com; jack@mail2.com, jill@mail3.com jane@mail4.com" 拆分为四个地址,然后将它们全部添加。单个地址将浪费几个周期来转换为单元素数组,但随后也可以正常工作。

您可能还想过滤$addrsfilter_var,使用array_unique,如果count($addrs) 为零,则不执行任何操作,这意味着没有可用的有效地址:

function filterMail($emails) 
    $emails = array_map('trim', $emails);
    $emails = array_filter($emails);
    $emails = array_unique($emails);
    $emails = array_map(
        function ($email) 
            return filter_var($email, FILTER_VALIDATE_EMAIL);
        ,
        $emails
    );
    $emails = array_filter($emails);
    $emails = array_values($emails);
    return $emails;

【讨论】:

【参考方案2】:

基于@Chris Haas 共享的链接提供的examples from PHPMailer。我做了这些更改:

<?php
$config = [
    "host" => "xxx",
    "username" => "xxx",
    "password" => "xxx",
    "secure" => "ssl", // ssl or tls
    "port" => 465,
    "sendTo" => "abc@email.com",
    "sendTo2" => "efg@email.com",
    "sendTo3" => "hik@email.com",
    "sendToBCC" => "xyz@email.com",
    "from" => "no-reply@email.com",
    "fromName" => "Contact Form"
];

在发送文件中我这样做了:

//Recipients
$mail->setFrom($config['from'], $config['fromName']);
$mail->addAddress($config['sendTo']);
$mail->addAddress($config['sendTo2']);
$mail->addAddress($config['sendTo3']);
$mail->addCC($config['sendToCC']);          
$mail->addBCC($config['sendToBCC']);
$mail->addAddress($_POST['email']);

这解决了问题。

【讨论】:

以上是关于使用配置 PHP 文件和 PHP Mailer 将电子邮件发送到多个地址的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk 中的 PHP Mailer 类无法识别

我被难住了:如何使用 PHP Mailer 发送 HTML 表单

使用 Swift Mailer、GMail 和 PHP 发送电子邮件,权限被拒绝错误

Yii2之mailer的使用

使用 PHP Mailer 从本地服务器外部的电子邮件地址发送 smtp 电子邮件

通过 Microsoft 365 SMTP 发送电子邮件时如何使用自定义显示名称? (以 PHP Swift Mailer 为例)