使用PHP表单从文件发送多封电子邮件

时间:2013-07-12 20:31:33

标签: php arrays forms email contact-form

我有一个页面,允许用户通过输入他们的电子邮件地址订阅我的邮件列表。在他们单击SUBMIT按钮后,电子邮件地址POST到txt文件,该文件每次有人订阅时自动填充。这个页面非常好。

我的问题是成功向该txt文件中的电子邮件地址列表发送电子邮件。我测试了代码但它仍然停留在“发送消息...”但没有任何事情发生。

我该如何解决这个问题?

<?
error_reporting(1);
//#############################################################
//#################   CONFIGURATION  ##########################
//#############################################################

// choose a password
$my_password="1234";
// the email from which emails are sent

$from_email="Name <name@gmail.com>";
// Your replay to email (whatever you want).
$replyto="name@gmail.com";
// A message to be attached to the bottom of the message
//   We recommend to add a link to subscription page
$message_at_bottom="
------------------------------------------------------------
P.D.: To remove from this list go to... 
http://www.domain.com/Dating/dwh-emaillist.php/
";
$emails_file="emaillist-XXXXXXXXX.txt"; 

//#############################################################
//###############   END CONFIGURATION  ########################
//#############################################################

// IF INFO IS NOT POSTED, PRINT THE FORM AND DIE
if (!$_POST["message"]){ 
    print_form();
    die();
}

// IF INFO IS POSTED YOU WILL BE HERE
// Check whether the password is correct
//  (only webmaster is supposed to know the password, which has been specified above)
if ($_POST["p"]!=$my_password){die("Incorrect password");}

// Get the subject of message 
$subject =$_POST["subject"];
// Get the body of message 
$message=$_POST["message"];
// Add to body of message the bottom
$message.=$message_at_bottom; 
// Read the file with emails to variable $emails_file        
$emails_file=file_get_contents($emails_file);
// Extract list of emails to array $emails_array 
preg_match_all("/<.{0,100}?>/", $emails_file, $emails_array); 

// Start output
print "<b>Sending messages...</b>";

// Send email to each email
foreach ($emails_array[0] as $email){
    // remove "<" and ">" from each email
    $email=substr($email,1,strlen($email)-2);
    // Next line is the one sending the email: the key command of this script 
    mail ($email, $subject, $message,"From: $from_email\nReply-To: $replyto\nContent-    Type: text/plain");
    // Each time an email is send, output it
    print "<br>$email\n";
    // After sending each email, send previous line (the email) to the browser 
    flush();
}

?>



<?php
// THIS FUNCTION WILL SHOW THE FORM
// MODIFY IT AS REQUIRED
function print_form(){
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"  http-equiv="content-type">
  <title>My email list</title>
</head>
<body style="background-color: rgb(255, 255, 255);">
<center>
<h2>Form to send email to the mailing list</h2>
<table style="font-family: times new roman;" border="0" cellpadding="0"  cellspacing="0">
  <tbody>
    <tr>
      <td style="vertical-align: top;">
<form method=POST action="dwh-emaillist-sendmessage.php">
Subject
<br><input type=text name=subject size=40>
<br>Message
<br><textarea name=message cols=50 rows=8></textarea>
<br>Password <input type=password name=p size=10>
<br><input type=submit value=Send>
</form>
      </td>
    </tr>
  </tbody>
</table>
</center>
</body>
</html>
<? } ?>

2 个答案:

答案 0 :(得分:0)

foreach循环需要以下形式:

foreach ($array as $value) { ... }

因此,你不应该在$emails_array中提供一个密钥,而是整个数组 这意味着什么

foreach ($emails_array[0] as $email){ ... }

应该成为

foreach ($emails_array as $email){ ... }

阅读PHP's foreach loop

答案 1 :(得分:-1)

不确定您是否正确阅读文件 - 我从未见过这样做过。

这种方式应该有效:

 $i=1;
 $file = fopen($emails_file, "r") or exit("Unable to open file!");
 while(!feof($file)) {
   $email=fgets($file);
   $email=trim($email);

   // remove "<" and ">" from each email
   $email=substr($email,1,strlen($email)-2);
   // Next line is the one sending the email: the key command of this script 
   mail ($email, $subject, $message,"From: $from_email\nReply-To: $replyto\nContent-    Type: text/plain");
   // Each time an email is send, output it




   print $i . ") sending message to: " . $email . "\n";
   if( ($i % 10)==0 ) { sleep(1); }
   $i++;
 }
 fclose($file);