2

PHPコードを使用して1時間あたり90通のメールを送信するように制限したい

4

3 に答える 3

3

PHPを使用して、この非常にハックな方法でそれを行うことができます。

count_offset.txtという名前の空のファイルを作成します。これは、90人のユーザーのチャンクセットのオフセットを追跡するファイルになります。

count_emails.txtという名前の別の空のファイルを作成します。これは、特定の時間に送信された電子メールの数を追跡するファイルになります。

電子メール関数(cronを介して)を実行するPHPスクリプトは、この最初のテキストファイルを開いて、どのチャンクセットが送信されたかを確認し、次のユーザーセットに送信できます。2番目のファイルで90通の電子メール制限を確認できます。

例えば:

$userCount = getNumberOfUsers(); // Whatever query you may have that counts how many total users there are.

$numChunks = ceil($userCount/90); // How many different groups to send the email.

$chunkFile = fopen('chunk_offset.txt', 'r+'); // Loads the file as resource.
$currentChunk = fread($chunkFile, filesize('chunk_offset.txt')); // Load the contents of chunk_offset.txt into variable.
$currentChunk = ($currentCount == '' ? 0 : (int)$currentChunk); // Load 0 if contents of file blank.

$countFile = fopen('count_emails.txt', 'r+'); // Loads the file as a resource in variable $countFile.
$currentCount = fread($countFile, filesize('count_emails.txt')); // Load the content of the file into variable $currentCount.
$currentCount = ($currentCount == '' ? 0 : (int)$currentCount); // If the value of $currentCount is blank, then sets it to integer 0, otherwise sets the variable as the integer value of file contents.

if ($currentCount <= 90) // Test the variable to see if it's under the limit. If it's under, send the email.
{
    foreach ($whateverUserListYouHave as $integerKey => $emailAddress) // Iterating through whatever array of users you have.
    // Hopefully index number => email, but the index number is important.
    // Also, consistent ordering of the list of users is important.
    // Remember, you can always create your own counter.
    {
        // The magic:
        // You're testing for set of people who fall within the current chunk.
        if ($integerKey >= ($currentChunk * 90) && $integerKey < ($currentChunk * 90 + 90))
        {
            send_email($emailAddress); // Whatever arbitrary email function you have here.
        }
    }
}

$currentCount++; // Iterate up the count.
fwrite($countFile, $currentCount); // Write the new count into the file.

if ($currentChunk == $numChunks) // If the current chunk number hits the total number of groups of 90, then reset the file to blank...
{
    $currentChunk = '';
}
else if ($currentChunk < $numChunks) // ... Otherwise iterate up and let it hit the next chunk on the next hour.
{
    $currentChunk++; // Iterate up the chunk.
}
fwrite($chunkFile, $currentChunk);

その後、count_emails.txtファイルを1時間ごとにクリアする(または内容を0にする)別のcronを作成します。この他のcronは、別のPHPスクリプトを実行することも、必要に応じてBashコマンドにすることもできます。

Bashコマンドを使用して実行したい場合は、cronを次に示します。

0 * * * * cat /dev/null > count_emails.txt

上記の行をcronに追加し、catを使用してcount_emails.txtファイルの内容をクリアします。

乾杯、そして幸運を!

于 2012-07-07T06:46:56.377 に答える
1

PHP自体は、この仕事には十分ではありません。PHPを記述して、実際の送信(および制限90)を実行できますが、スケジューリングには、サーバー上にcronまたは同様のメカニズムが必要です。これは、PHPファイルを定期的に呼び出すように構成されています。

于 2012-07-07T05:50:03.543 に答える
0

https://a1websitepro.com/sending-emails-every-hour-server-limit-php/に、このテーマに関する詳細なチュートリアルがあります。これ は、cronを使用して実行するコードです。

    <?php
include('config.php');
$result = $con->query("SELECT * FROM newsletter     ORDER BY id DESC LIMIT 1") ;
while ($row = $result->fetch_assoc()) {
 $newid=$row['id'];
$thtetitle=$row['title'];
$thecontent=$row['content'];
echo '<hr/>';
}
$resultt = $con->query("SELECT * FROM users WHERE      emailed <> $newid ORDER BY id ASC LIMIT 50") ;
while ($rowt = $resultt->fetch_assoc()) {
$userid=$rowt['id'];
$email= $rowt['email'];
echo '<hr/>';
$to = $email;
$subject = $thetitle;
$message = $thecontent;
$headers = 'From: you@yourwebsite.com' . "\r\n" .
'Reply-To: noreply@yourwebsite.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
mysqli_query($con,"UPDATE users SET     emailed='$newid'
WHERE id='$userid' ");
}
$con->close();
?>

チュートリアルからすべてのスクリプトをアップロードした後にcPanelに挿入するcronコードは次のとおりです。/ usr / bin / php -q /home/cpanelusername/public_html/sendnewsletter.php

于 2015-12-17T17:47:30.110 に答える