草庐IT

PHP mail() BCC - 仅显示 To : header 中的最终收件人地址

coder 2024-04-17 原文

我正在尝试使用 PHP mail() 密件抄送数据库中的订阅者列表。一切正常,但我遇到了一个困扰我一上午的问题。我可以使用 BCC 发送列表,但无法将接收端电子邮件地址附加到 deader“To:”。

例如,我将列表发送到以下电子邮件地址 (test1@example.com、test2@example.com 和 test3@example.com)。每个电子邮件地址都会收到一封电子邮件,而其他电子邮件地址由于密件抄送而被隐藏。

我的问题是在标题中,“收件人:”在列表的所有接收端都显示为空白。我理解并知道标题不会显示,因为我在外发邮件中只有密件抄送标题。我已尝试 for 循环处理该过程,但我收到了所有电子邮件,并在一个循环中收到了一封针对该地址的电子邮件。

这是我的工作代码:工作代码包括我试图解决 To: header 的循环。我可以发送电子邮件,但我会收到所有发送的电子邮件。

<?php

/*
   Gathers the number of rows within the database. Used for the loop that displays the entire list in the BCC. 
*/

   session_start();
   include_once '../dbconnect.php';
   $result = mysql_query("SELECT * FROM news");
   $num_rows = mysql_num_rows($result);
   $rows = $num_rows;

/*
   Requests the list from the database, please the list in a loop, displays the list only once, and places list in an operator.
*/

   $result = mysql_query("SELECT * FROM `news`");
     while($row = mysql_fetch_array( $result )) {
       for ($x = 1; $x <= 1; $x++) {
         $contacts.= "".$row['email'].",";
       }
     }

/*
   ATTEMPT (It works... sort of): Sends mail to the list using BCC, displays the ONLY receivers email address in the To: header
*/

   $result = mysql_query("SELECT * FROM `news`");
     while($row = mysql_fetch_array( $result )) {
       for ($x = 1; $x <= 1; $x++) {
         $receiver= "".$row['email']."";

         $to = "$receiver";
         $subject = 'Test Email';
         $headers = "From: example@example.com\r\n";
         $headers .= "BCC: $contacts";

         $headers .= "MIME-Version: 1.0\r\n";
         $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
         $message = '<html><body>';
         $message .= '<h1 style="">Test Message</h1>';
         $message .= '</body></html>';
         mail($to,$subject, $message, $headers);
      }
    }
?>

我的一般想法是循环,但我找不到真正完全解决这个问题的解决方案,通过 BBC 到列表并在 To: 标题中仅显示接收端电子邮件地址。有什么想法或想法吗?

使用 SMTP 服务器更新

我一直在尝试使用在此线程中找到的解决方案并将其应用于 SMTP 服务器。使用 SendGrid 发送消息是理想的选择。我想出了以下选项,但脚本似乎只将一条消息发送到数据库中的一个地址,而不是所有地址。

<?php
require_once "Mail.php";

$sub = $_POST['subject'];
$ttl = $_POST['title'];
$img = $_POST['image'];
$bdy = $_POST['body'];
$lk = $_POST['link'];

mysql_connect("", "", "") or die(mysql_error()) ; 
   mysql_select_db("") or die(mysql_error()) ; 

  $result = mysql_query("SELECT `email` FROM news");

  $num_rows = mysql_num_rows($result);

  $receivers = array();
  while ($row = mysql_fetch_array($result)) {
    $receivers[] = $row['email'];
  }

  foreach ($receivers as $receiver) { }

$from = "test@example.com";
$to = $receiver;
$subject = $sub;
$mime = "1.0";
$ctype = "text/html; charset=ISO-8859-1";
$body = '
<html><body>
<p>Test Message!</p>
</body></html>
';

$host = "";
$port = "";
$username = "";
$password = "";

$headers = array ('From' => $from,
  'To' => $to,
  'Subject' => $subject,
  'MIME-Version' => $mime ,
  'Content-Type:' => $ctype);

$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'port' => $port,
    'auth' => true,
    'username' => $username,
    'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
  echo("<p>" . $mail->getMessage() . "</p>");
} else {
  echo("<p>Message successfully sent!</p>");
}
?>

最佳答案

该代码包括对您的代码的一些一般改进。我添加了内联评论来解释我所做的事情。

<?php

  // General thing: If you do not need a session, do not start one ;)
  session_start();

  include_once '../dbconnect.php';

  // Select only what you really need from the table. This saves you memory
  // and it speeds up the query.
  $result = mysql_query("SELECT `email` FROM news");

  // You are not using these numbers in the script you showed us. I am just
  // leaving them in here to show you, how you can reuse the "$result"
  // variable without querying the database again.
  $num_rows = mysql_num_rows($result);

  // We are reusing the "$result" here without re-querying the database, which
  // speeds the whole process up and takes load away from the database. We are
  // storing all receivers in a dedicated variable, to reuse them later on.
  $receivers = array();
  while ($row = mysql_fetch_array($result)) {
    $receivers[] = $row['email'];
  }

  // Now, instead of querying the database again, we are using our stored mail
  // addresses in "$receivers" to send the emails one by one. We could have
  // done this part in the "while" loop before, but I wanted to stay close to
  // your code, so you would recognize it ;)
  foreach ($receivers as $receiver) {
    // I have removed the "for" loop here, because it runs only once. If a loop
    // only runs once and you control all its input, you really do not need a
    // loop at all (except some exceptions, just in case someone knows one^^).

    // You can actually just put the value of $receiver in $to. PHP is pretty
    // good at typecasting of scalar types (integers, strings etc.), so you do
    // not need to worry about that.
    $to = $receiver;

    $subject = 'Test Email';

    // I am putting the headers into an array and implode them later on. This
    // way we can make sure that we are not forgetting the new line characters
    // somewhere.
    $headers = array(
      "From: example@example.com",
      "MIME-Version: 1.0",
      "Content-Type: text/html; charset=ISO-8859-1",
      // I have removed the "BCC" header here, because this loops send out an
      // email to each user seperately. It is basically me sending an email to
      // you. Afterwards I copy&paste all the content to another new mail and
      // send it to another fella. You would never know that you both got the
      // same mail ;)
    );

    $message = '<html><body>';
    $message .= '<h1 style="">Test Message</h1>';
    $message .= '</body></html>';

    // Imploding the headers.
    $imploded_headers = implode("\r\n", $headers);

    mail($to, $subject, $message, $imploded_headers);
  }

此代码基本上一次发送一封电子邮件。收到此类电子邮件的人都不知道这封电子邮件发送到了哪些电子邮件地址。

如代码中所述,此代码段可以进一步优化。由于电子邮件发送本身是一个非常困难的领域,我真的建议您找到一些 PHP 库来捆绑整个东西并使用它。在整个电子邮件发送过程中,您可能会犯很多错误,如果您不想很快被标记为垃圾邮件,我不会在生产环境中运行这样的脚本。

关于PHP mail() BCC - 仅显示 To : header 中的最终收件人地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34575717/

有关PHP mail() BCC - 仅显示 To : header 中的最终收件人地址的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  7. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  8. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  9. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  10. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

随机推荐