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

jebbie635Asked:
Who is Participating?
 
Robert SchuttConnect With a Mentor Software 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
 
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
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

 
jebbie635Author Commented:
Don't need to echo, the results are the created files and test emails received. It connects to only one server.
0
 
Robert SchuttConnect With a Mentor Software 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
 
jebbie635Author Commented:
Works great. Thank you.
0
All Courses

From novice to tech pro — start learning today.