使用PHP脚本和MySQL数据库发送大量电子邮件

3
我想使用PHP邮件函数发送大量电子邮件。电子邮件地址存储在MySQL数据库中,约有30k个电子邮件地址。我一次只发送一封电子邮件。 前60封电子邮件可以正常发送,但接下来的所有电子邮件都被跳过了。我正在使用Godaddy主机发送电子邮件。以下是我正在使用的代码:
<?php 

$con1=mysqli_connect("subscibe","subscibe","pw","subscibe");

$subject = $_POST['subject'];        
$message = $_POST['message'];

$getusers = mysql_query("SELECT * FROM subscibe.emaillist");
$email_from = "email@gmail.com";
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();

while($result = mysql_fetch_array($getusers)) {

$emailaddress = $result['Emailaddresses'];

mail($emailaddress,$subject,$message,$headers);

//Add email address to temp table
$sqlq="INSERT INTO subscibe.temp VALUES ('$emailaddress')";

if (!mysqli_query($con1,$sqlq)) {
die('Error: ' . mysqli_error($con1));
}
}

echo "Emails are sent"

?>

专用服务器还是共享服务器?需要独立IP吗? - zeflex
6
https://support.godaddy.com/help/article/313/how-many-email-messages-can-i-send-per-day?countrysite=ca - zeflex
4
Godaddy对你发送邮件的数量进行了限制,如果你想发送更多的邮件,你需要使用像Mailchimp这样的商业邮件服务器(如果是新闻通讯类型),或者Mandrill(如果是交易邮件)。 - Jonathan
7
如果你想发送3万封电子邮件,我建议你使用专门的服务...自己管理这个过程是个糟糕的主意,第一次发送时你就会被认为是垃圾邮件发送者。 - zeflex
我也会推荐Mailchimp。 - Rohit Gupta
我认为任何允许大规模邮件发送的服务提供商都是值得推荐的。如果从未进行高级配置就从服务器发送大量邮件,很容易被列入黑名单。 - Rimble
2个回答

0
<?php 
$con = mysql_connect("localhost","dbuser","dbpass"); // replace dbuser, dbpass with your db user and password
mysql_select_db("dbname", $con); // replace dbname with your database name
/*
To use this script database table must have three fields named sno, email and sub_status
*/
$query = "select sno, email from dbtable where sub_status = 'SUBSCRIBED'";
$result = mysql_query($query, $con);
$emails = array();
$sno = array();
while($row=mysql_fetch_assoc($result))
{
    $sno[] = $row['sno']; // this will be used to unsubscribe the user
    $emails[]=$row['email']; // email id of user
}
/* you can also get email id data from CSV using below code */
//$file =  file_get_contents("travel_database.csv"); 
//$emails = explode(",",$file);
/* count.txt is used to store current email sent number/count */
$count =  file_get_contents("count.txt");
for($i=$count;$i<count($emails);$i++)
{
    $to  = $emails[$i];
    // subject
    $subject = 'Set Your Title Here';
    // message
    $message = file_get_contents("sample.html"); // this will get the HTML sample template sample.html
    $message .= '<p><a href="http://yourdomain.com/path-to-folder/unsubscribe.php?id='.$sno[$i].'&username='.$emails[$i].'">Please click here to unsubscribe.</a></p>
    </body>
    </html>';
    // To send HTML mail, the Content-type header must be set
    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    // Additional headers
    //$headers .= "To: $to" . "\r\n";
    $headers .= 'From: Name <info@yourdomain.com>' . "\r\n";
    //$headers .= 'Cc: sendcc@yourdomain.com' . "\r\n";
    //$headers .= 'Bcc: sendbcc@yourdomain.com' . "\r\n";
    // Mail it
    if(mail($to, $subject, $message, $headers)) {
        $file = fopen("mailsentlist.txt","a+"); // add email id to mailsentlist.txt to track the email sent
        fwrite($file, $to.",\r\n");
        fclose($file);
    }
    else
    {
        $file = fopen("notmailsentlist.txt","a+"); // add email to notmailsentlist.txt here which have sending email error
        fwrite($file, $to.",\r\n");
        fclose($file);
    }
    if(($i-$count)>=200) // this will send 200 mails from database per execution
    {   
        $filec = fopen("count.txt",'w'); // store current count to count.txt
        fwrite($filec, $i);
        fclose($filec);
        break;
    }
}//for end
$filec = fopen("count.txt",'w'); // store fine count to count.txt this will be used as a start point of next execution
fwrite($filec, $i);
fclose($filec);
?>

0

你可能想使用 foreach 循环,它会将电子邮件发送到数据库中的每个记录。类似于:

$getusers = mysql_query("SELECT * FROM subscibe.emaillist");
foreach ($getusers as $maillist) {
$mail->to($mailist['email_address']);
$mail->send()

1
OP已经在使用循环发送邮件,问题在于邮件在发送60封后停止发送。 - Rimble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接