[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 439
  • Last Modified:

PHP Mailer

Hi experts,

I almost finished this php mailer. It creates a file for every smtp server then it splits the recipients file to the number of smtp servers, and at last it should open every smtp file, connect to the smtp in it and assign a recipients file. The code as it is now only connects to the first smtp. Please help.

<?php
error_reporting(E_ALL); 

$hosts        = "smtp.txt";
$emails       = "list.txt";
$hostscount   = count(file($hosts));
$emailscount  = count(file($emails));
$splitnum     = (int)($emailscount / $hostscount);
$handle       = fopen("smtp.txt", "r");
$handle2      = fopen("list.txt", "r");
$currentfile  = 1;
$output       = FALSE;
$output2      = FALSE;

// MESSAGE DETAILS

$fromemail    = "";
$fromname     = "";
$replyto      = "";
$mydomain     = "";
$subject      = "";

// PUT EVERY SMTP IN A DIFFERENT FILE

if ($hosts) 
{
    while (!feof($handle)) 
    {
        $buffer = fgets($handle, 4096);
        if (!$output) 
        { 
            $output = fopen("s-" . ($currentfile++), "w");
            $lines = 0;
        }
        fwrite($output, $buffer);
        if (strrchr($buffer,"\n")) 
        {
            $complete = TRUE;
            ++$lines;
            if ($lines == "1") 
            {
                fclose($output);
                $output = FALSE;
            }
        } 
        else 
        {
            $complete = FALSE;
        }
    }
    fclose($handle);
    if ($output) 
    {
        if (!$complete) 
        {
            fwrite($output,"\n");
        }
        fclose($output);
    }
}

// SPLIT RECIPIENTS LIST TO THE NUMBER OF SMTP SERVERS

$currentfile2 = 1;

if ($emails) 
{
    while (!feof($handle2)) 
    {
        $buffer2 = fgets($handle2, 4096);
        if (!$output2) 
        { 
            $output2 = fopen("m-" . ($currentfile2++), "w");
            $lines2 = 0;
        }
        fwrite($output2, $buffer2);
        if (strrchr($buffer2,"\n")) 
        {
            $complete2 = TRUE;
            ++$lines2;
            if ($lines2 == $splitnum) 
            {
                fclose($output2);
                $output2 = FALSE;
            }
        } 
        else 
        {
            $complete2 = FALSE;
        }
    }
    fclose($handle2);
    if ($output2) 
    {
        if (!$complete2) 
        {
            fwrite($output2,"\n");
        }
        fclose($output2);
    }
}

// ASSIGN A RECIPIENTS FILE TO EVERY SMTP SERVER (FILE)

$currentfile3 = 1;
$currentfile4 = 1;

foreach (file("s-" . ($currentfile3++)) as $line) {

foreach (file("m-" . ($currentfile4++)) as $line2) {

$info2        = explode(",", $line2);
$email        = $info2[0];
$firstname    = $info2[1];
$lastname     = $info2[2];
$message      = "";

$info         = explode(",", $line);
$hostname     = $info[0];
$username     = $info[1];
$password     = $info[2];

$connect      = fsockopen($hostname, 25); 
fputs($connect, "EHLO $mydomain\r\n"); 
fputs($connect, "AUTH LOGIN\r\n"); 
fputs($connect, base64_encode($username)."\r\n");
fputs($connect, base64_encode($password)."\r\n");
fputs($connect, "MAIL FROM: $fromemail\r\n");
fputs($connect, "RCPT TO: $email\r\n"); 
fputs($connect, "DATA\r\n"); 
fputs($connect, "MIME-Version: 1.0\r\n");
fputs($connect, "Content-Type: text/html\r\n");
fputs($connect, "Content-Transfer-Encoding: 8bit\r\n");
fputs($connect, "To: $email\r\n");
fputs($connect, "From: \"$fromname\" <$fromemail>\r\n");
fputs($connect, "Subject: $subject\r\n\r\n"); 
fputs($connect, "$message\r\n"); 
fputs($connect, ".\r\n"); 
fputs($connect, "QUIT\r\n"); 
}
}
?>

Open in new window

0
jebbie635
Asked:
jebbie635
2 Solutions
 
Aaron TomoskyTechnology ConsultantCommented:
Kinda hard to read with all that long fopen while not eof stuff.
With file_get_contents and explode you can make an array from a \n file in two lines.

What exactly are you having problems with?
0
 
nanharbisonCommented:
Have you tried echoing out your results to see if everything is working?
0
 
jebbie635Author Commented:
Don't need to echo, the results are the created files and test emails received. It connects to only one server.
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
Robert SchuttSoftware EngineerCommented:
The two foreach loops on lines 108 and 110 process all lines in files s-1 and m-1 respectively. They do not loop over existing files s-* and m-*, the ++ only increments the variables but you have no looping defined for them. You probably meant to loop those variables from one up to $currentfile1 and 2? (as those hold the number of files created)
0
 
jebbie635Author Commented:
How do i do that?
0
 
Robert SchuttSoftware EngineerCommented:
Well around the outer foreach you could place a loop:
while ($currentfile3 < $currentfile) {
// your entire foreach code ending near the end of the file...
}

Open in new window

I'm not sure if you need another loop, I checked (like the previous remark suggested) with some echo statements and it seems this would do it as each host has 1 associated file with emails.
0
 
jebbie635Author Commented:
Works great. Thank you.
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now