Farzam Tahmasebmirza
Farzam Tahmasebmirza

Reputation: 598

How to limit sending email 90 per hour using php code?

I want to limit sending email 90 email per hour using php code

Upvotes: 2

Views: 3041

Answers (3)

user2970934
user2970934

Reputation: 79

There is an in depth tutorial on this subject at https://a1websitepro.com/sending-emails-every-hour-server-limit-php/ Here is the code that you would run using 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: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
mysqli_query($con,"UPDATE users SET     emailed='$newid'
WHERE id='$userid' ");
}
$con->close();
?>

Here is the cron code that you would insert in your cPanel after you uploaded all the scripts from the tutorial. /usr/bin/php -q /home/cpanelusername/public_html/sendnewsletter.php

Upvotes: 0

Stegrex
Stegrex

Reputation: 4024

You can use PHP to do it in this very hackish way:

Create a blank file called count_offset.txt This will be a file that tracks the offset of the chunked set of 90 users.

Create another blank file called count_emails.txt This will be a file that tracks the number of emails sent in the particular hour.

The PHP script that runs the email function (thru cron) can then open up this first text file to check which chunked set has been sent, and sends to the next set of users. It can check the second file for the 90 email limit.

For example:

$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);

Afterwards, write another cron that clears the count_emails.txt file every hour (or turns the contents to 0). This other cron can run another PHP script or can be a Bash command if you prefer.

Here would be the cron if you wanted to do it using Bash commands:

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

The above line when added to cron, with use cat to clear the contents of the count_emails.txt file.

Cheers, and good luck!

Upvotes: 3

Chris Trahey
Chris Trahey

Reputation: 18290

PHP, by itself, is not adequate for this job. You can write PHP to do that actual sending (and the limit of 90), but for scheduling, you need cron or a similar mechanism on your server, which is configured to call your PHP file on a regular basis.

Upvotes: 1

Related Questions