You are not logged in.

#26 30 May 2007 5:31 am

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

Whats the difference between using CC, BCC and To anyway? Don't they all send a mail to the address? And I am actually using a header, I have one that says: $headers = "From: $from";

Other than that, I have not touched the CC or BCC coding, nor applied any variable that should use them, weird that it should give me an error on it.


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#27 30 May 2007 6:33 am

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: Sending mails

cc stands for carbon copy, and bcc stands for blind carbon copy, cc will show up in the original email, bcc's wont.  you dont need an extra from address, it will use the $settings['sender'] setting.

Offline

 

#28 31 May 2007 11:49 am

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

Hmm, I am running no variable for headers, that being CC, BCC or the original "From:", but I still get the messages saying:

Code:

Warning: Variable passed to each() is not an array or object in /home/bambooco/public_html/mail/smtp.php on line 83

Warning: Variable passed to each() is not an array or object in /home/bambooco/public_html/mail/smtp.php on line 91

Line 83: while(list(, $bcc_address) = each($bcc)) {
Line 91: while(list(, $cc_address) = each($cc)) {

If I did not specify any value for it, why is he complaining about it? Also, if I were to make a "Check All" and  a "UnCheck All" button with javascript, would I need to use the input name "check[]" to be able to use it? I have this set up for the function:
<input type="button" name="CheckAll" value="Check All" onClick="checkAll(document.addresses.check[])">

But I don't know if I need that [], I know its needed for the mail-sending, but does it make a difference when trying to make this button? JavaScript drives me crazy, it is so unconventional compared to PHP.


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#29 31 May 2007 1:10 pm

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: Sending mails

try using this code:

Code:

<?php

$settings = array(
                    'sender'=>'senders@email.address',
                    'username'=>'mail_username',
                    'password'=>'mail_password',
                    'host'=>'mail.server.address'
);

function validate($socket, $response, $line = __LINE__) {
    while(substr($server_response, 3, 1) != ' ') {
        if(!($server_response = fgets($socket, 256))) {
            return "Couldn't get mail server response codes";
        }
    }
    if(!(substr($server_response, 0, 3) == $response)) {
        return "Ran into problems sending Mail. Response: $server_response";
    }
    return false;
}

function sendmail($mail_to, $subject, $message, $headers = '') {
    global $settings;
    $message = preg_replace("#(?<!\r)\n#si", "\r\n", $message);
    if($headers != '') {
        if(is_array($headers)) {
            if(sizeof($headers) > 1) {
                $headers = join("\n", $headers);
            } else {
                $headers = $headers[0];
            }
        }
        $headers = chop($headers);
        $headers = preg_replace('#(?<!\r)\n#si', "\r\n", $headers);
        $header_array = explode("\r\n", $headers);
        @reset($header_array);
        $headers = '';
        while(list(, $header) = each($header_array)) {
            if(preg_match('#^cc:#si', $header)) {
                $cc = preg_replace('#^cc:(.*)#si', '\1', $header);
            } else if(preg_match('#^bcc:#si', $header)) {
                $bcc = preg_replace('#^bcc:(.*)#si', '\1', $header);
                $header = '';
            }
            $headers .= ($header != '') ? $header . "\r\n" : '';
        }
        $headers = chop($headers);
        $cc = explode(', ', $cc);
        $bcc = explode(', ', $bcc);
    }
    if(trim($subject) == '') {
        return "No email Subject specified";
    }
    if(trim($message) == '') {
        return "Email message was blank";
    }    
    if( !$socket = @fsockopen($settings['host'], 25, $errno, $errstr, 20) ) {
        return "Could not connect to smtp host : $errno : $errstr";
    }
    if(($err = validate($socket, "220", __LINE__)) != false) return $err; 
    if(!empty($settings['username']) && !empty($settings['password']) ) {
        fputs($socket, "EHLO " . $settings['host'] . "\r\n");
        if(($err = validate($socket, "250", __LINE__)) != false) return $err;
        fputs($socket, "AUTH LOGIN\r\n");
        if(($err = validate($socket, "334", __LINE__)) != false) return $err;
        fputs($socket, base64_encode($settings['username']) . "\r\n");
        if(($err = validate($socket, "334", __LINE__)) != false) return $err;
        fputs($socket, base64_encode($settings['password']) . "\r\n");
        if(($err = validate($socket, "235", __LINE__)) != false) return $err;
    } else {
        fputs($socket, "HELO " . $settings['host'] . "\r\n");
        if(($err = validate($socket, "250", __LINE__)) != false) return $err;
    }
    fputs($socket, "MAIL FROM: <" . $settings['sender'] . ">\r\n");
    if(($err = validate($socket, "250", __LINE__)) != false) return $err;
    $to_header = '';
    $mail_to = (trim($mail_to) == '') ? 'Undisclosed-recipients:;' : trim($mail_to);
    if (preg_match('#[^ ]+\@[^ ]+#', $mail_to)) {
        fputs($socket, "RCPT TO: <$mail_to>\r\n");
        if(($err = validate($socket, "250", __LINE__)) != false) return $err;
    }
    if(is_array($bcc)) {
        //@reset($bcc);
        foreach($bcc as $bcc_address) {
        //while(list(, $bcc_address) = each($bcc)) {
            $bcc_address = trim($bcc_address);
            if (preg_match('#[^ ]+\@[^ ]+#', $bcc_address)) {
                fputs($socket, "RCPT TO: <$bcc_address>\r\n");
                if(($err = validate($socket, "250", __LINE__)) != false) return $err;
            }
        }
    }
    if(is_array($cc)) {
        //@reset($cc);
        foreach($cc as $cc_address) {
        //while(list(, $cc_address) = each($cc)) {
            $cc_address = trim($cc_address);
            if (preg_match('#[^ ]+\@[^ ]+#', $cc_address)) {
                fputs($socket, "RCPT TO: <$cc_address>\r\n");
                if(($err = validate($socket, "250", __LINE__)) != false) return $err;
            }
        }
    }
    fputs($socket, "DATA\r\n");
    if(($err = validate($socket, "354", __LINE__)) != false) return $err;
    fputs($socket, "Subject: $subject\r\n");
    fputs($socket, "To: $mail_to\r\n");
    fputs($socket, "From: ".$settings['sender']);
    fputs($socket, "$headers\r\n\r\n");
    fputs($socket, "$message\r\n");
    fputs($socket, ".\r\n");
    if(($err = validate($socket, "250", __LINE__)) != false) return $err;
    fputs($socket, "QUIT\r\n");
    fclose($socket);
    return false;
}

?>

Offline

 

#30 31 May 2007 1:54 pm

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

Yep, worked like a charm, no error messages big_smile, thanks. Now I just need to figure out this ridiculous JavaScript, wonder who wrote it and why he or she decided to make it so hard to implement in advanced PHP.


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#31 01 Jun 2007 9:53 am

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

Hmmm, is there any way I can change the function to allow for multiple to: ADDR, ? I've set all the other PHP pages to make each address selected into that syntax. It gives me this error:

Code:

Ran into problems sending Mail. Response: 501 : malformed address

Last edited by Butcher (01 Jun 2007 9:55 am)


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#32 01 Jun 2007 10:46 am

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: Sending mails

you have to send them one at a time.  if you want to send an email to more than one person, then add cc's to the headers.

since your to addresses are already in an array, just loop over the array and call this function for each email you want to send.

Offline

 

#33 01 Jun 2007 5:41 pm

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

I have this code:

Code:

<?php 
$check = $_POST['check']; 
foreach($check as $to) 
{
echo $to;
echo ', ';
}          
?>

As far as I can tell, if I rename it $to into $cc, it should change it all. Sadly don't have time to test right now, as I gotta get to bed (promised myself I would cut my hair tomorrow, and got an early appointment).


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#34 01 Jun 2007 5:44 pm

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: Sending mails

why not just do:

Code:

<?php 
$check = $_POST['check']; 
foreach($check as $to) {
    sendmail($to, $subject, $message);
}          
?>

seems a lot easier to me?

Offline

 

#35 02 Jun 2007 2:39 am

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

I am already in the process page, the above that I posted is just for a little box where I have all the mail to be able to see which ones I selected. Thing is on the process page, I need to make a CC out of it, instead of the duplicating To:'s.


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#36 02 Jun 2007 7:10 am

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

Won't mail_to automatically detect the multiple addresses in the to part of sendmail? Or do I need to run them by as headers, and in that case, would it automatically understand that the addresses in the headers are CCs?

($error = sendmail($_POST[mail_to], $_POST[subject], $_POST[message], $_POST[headers])) != false)


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#37 02 Jun 2007 9:23 am

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: Sending mails

yes the protocol does support multiple to addresses, but their implementation does not.  it sets the To: header like this:

Code:

fputs($socket, "RCPT TO: <$mail_to>\r\n");

so if you have a list in there, the protocol is going to think that that list is a single address and will fail.

whether you combine them into a single CC string, or send them one by one, you still have to loop over each address and do something with it, so I really dont see why you would want or care to not just send the email as opposed to wanting to stack the address or CC them all at once.  if you have multiple TO addresses you'll have to have a RCPT TO: <address> header for each recipient, which means you'll have to loop over your to list once to create the string, then again to create the header.  If you pass a cc list in, then you'll have to loop over the list to create the string, then split it up and loop over it again to add the CC header, so as they say, its 6 of one, half dozen of another and I cant understand what is wrong with simply sending one per email address rather than going through all of that.

to send them as a CC you need to build up a string that ends up looking like this:

Code:

$headers = "cc: one@one.com, two@two.com, three@three.com";

to add bcc you would seperate the cc list from the bcc list using \r\n

Code:

$headers = "cc: one@one.com, two@two.com, three@three.com\r\nbcc: four@four.com, five@five.com";

Offline

 

#38 02 Jun 2007 11:51 am

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

Ok, in accordance with the header function with CC, this should theoretically do it:

The message page:

Code:

<input type="hidden" name="mail_to" value="<?php 
          $check = $_POST['check']; 
          foreach($check as $to) 
              {
            echo $to;
            echo ", ";
            }
          ?>">

Then, the process page:

Code:

$mail_to = $_POST['mail_to'];
$headers = "cc: $mail_to";

Though, it gives me this error:

Ran into problems sending Mail. Response: 501 : malformed address: , addr@addr.com,> may not follow ,

But as seen on the message page, it goes addr, addr, addr, addr, it escapes me why it won't send the message to them. And I need it to send the mail to several people, as it will be used as a sort of a maillist function, sending a password to all clanmembers in my BF2 clan.


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#39 02 Jun 2007 3:13 pm

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: Sending mails

pass '' (two single quotes) as the mail to parameter (the first one).  create a string:

"bcc: addr, addr, addr, addr"

and pass that in as the headers parameter.


make sure that your last addr does not have a comma after it.

Offline

 

#40 02 Jun 2007 4:55 pm

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

Hmm, thats a harder one. I only know how to loop stuff with a comma after each variable, like so:

while {
echo "thingy";
echo ", ";
}

Never discovered a way to remove the last comma...


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#41 02 Jun 2007 5:25 pm

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: Sending mails

Code:

$some_var = "";
while {
    $some_var .= "thingy";
    $some_var .= ", ";
}
$some_var = trim($some_var, ', ');

Offline

 

#42 03 Jun 2007 3:35 am

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

Hmmm, I selected three addresses for recipients, then ran it trough this:

Code:

<?php
$check = $_POST['check']; 
foreach($check as $to) 
{
   $to .= "$to";
   $to .= ", ";
}
$to = trim($to, ', ');
echo $to;
?>

But it put out this: addr@addr.comaddr@addr.com, for some reason, he decided that separating them with a comma was useless, and dropped the other addresses.


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#43 03 Jun 2007 6:57 am

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: Sending mails

try using rtrim instead of trim.  trim is supposed to just trim beginning and end of the string (not all occurrences of the characters in the string)

Offline

 

#44 03 Jun 2007 10:36 am

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

Hmm, he still does the same, does not include all the mail addresses, does not seperate them either (he does take ONE of them, and writes it twice). This is weird, I mean   

   $to .= "$to";
   $to .= ", ";

Should if nothing else be able to post all of the addresses and seperate them by commas.


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#45 05 Jun 2007 4:39 am

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

Hmm, I've tested a lot of combinations now, and what almost works is this:

Code:

<?php
          $check = $_POST['check']; 
          foreach($check as $to) 
              {
            $to = "$to, ";
            }
            $to = rtrim($to,", ")
            echo $to;
          ?>

Though, the only way I get it to echo that stuff is by having the echo inside the { }, and then the trim doesnt fit, but when having echo outside, I get an error saying it didnt expect it. I honestly don't know how to get this trimmed correctly.


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#46 05 Jun 2007 7:02 am

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: Sending mails

you have to append the emails, to your to variable ($to .= "...", not $to = "..."). 

this:

Code:

$emails = array('asdf@asdf.com', 'asdf@asdf2.com', 'asdf@asdf3.com');
$str = "";
foreach($emails as $email) {
    $str .= "$email, ";
}
$str = rtrim($str, ', ');
echo $str;

prints:

asdf@asdf.com, asdf@asdf2.com, asdf@asdf3.com

so I know it works as it should (as does trim, I finally got around to testing that too).

Offline

 

#47 05 Jun 2007 7:08 am

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: Sending mails

the problem with your original code (sorry I've been a bit distracted as of late) is that you're trying to use $to as both the iterator variable in your loop, and as your string to hold the value:

Code:

<?php
$check = $_POST['check']; 
foreach($check as $to) 
{
   $to .= "$to";
   $to .= ", ";
}
$to = trim($to, ', ');
echo $to;
?>

if you used it like this:

Code:

<?php
$check = $_POST['check']; 
$tostr = "";
foreach($check as $to) 
{
   $tostr .= $to;
   $tostr .= ", ";
}
$tostr = trim($tostr, ', ');
echo $tostr;
?>

does that make sense?

Offline

 

#48 05 Jun 2007 10:38 am

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

It actually does, on some twisted level. And it worked too, it finally seperates them correctly and removes the last comma. But, it says this:

Code:

Ran into problems sending Mail. Response: 501 : malformed address: , addr@addr.com, addr@ad may not follow ,

(Notice that it cut down on the addresses, didnt include the first one, and trunctuated the last one)

And the actual address line for recipients was: addr@addr.com, addr@addr.com, addr@addr.com, and I checked the code, I have no maxsize anywhere, and I don't think the mail system would add that. Something goes wrong when he tries to input the mail to the function as recipients. Any idea what might cause it?


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 

#49 05 Jun 2007 6:45 pm

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: Sending mails

post your code.

Offline

 

#50 06 Jun 2007 3:49 am

Butcher
Moderator
From: Norway
Registered: Jul 2006
Posts: 308

Re: Sending mails

Ok, here it is, page one, the new_mail.php, which allows you to select recipients:

Code:

<form name="address" action="select_new_mail.php" method="post" id="newmail">
<?php
include("../db_connect.php");
$result = mysql_query("SELECT * FROM mail ORDER BY ID DESC");
while($row = mysql_fetch_array($result))
{
$row['id'];
echo '<table width="800" border="0" cellspacing="0" cellpadding="0">';
echo '<tr>';
echo '<td width="50">&nbsp;<font color="#FFFFFF">ID:&nbsp;' . $row['id'] . '</font></td>';
echo '<td width="80">&nbsp;<font color="#FFFFFF">Select:&nbsp;<input type="checkbox" name="check[]" id="' . $row['id'] . '" value="' . $row['mail'] . '"></font></td>';
echo '<td width="270">&nbsp;<font color="#FFFFFF">Nick:&nbsp;' . $row['nick'] . '</font></td>';
echo '<td width="100">&nbsp;<font color="#FFFFFF">Level:&nbsp;' . $row['type'] . '</font></td>';
echo '<td width="300">&nbsp;<font color="#FFFFFF">Mail:&nbsp;' . $row['mail'] . '</font></td>';
echo '</tr>';
echo '</table>';
echo '<br>';
}
?>
<input type="checkbox" name="master" onclick="enableAll()"><font color="#FFFFFF"><b>Check All</b></font>
<br>
<br>
<input name="Submit" type="submit" id="Submit" value=" Next Page ">
&nbsp;&nbsp;&nbsp;&nbsp;
<input name="Reset" type="reset" id="Reset" value="Reset Page">
</form>

Then, the second page, which is the select_new_mail.php, where you input message and subject:

Code:

<form action="process_send_mail.php" method="post">
<table width="800" border="0" align="left">
        <tr>
          <td align="right"><font color="#FFFFFF"><b>Input Type:</b>&nbsp;</font></td>
          <td><font color="#FFFFFF"><b>&nbsp;Input:</b>&nbsp;</font></td>
          <td><font color="#FFFFFF"><b>Explanation:</b>&nbsp;</font></td>
        </tr>
        <tr>
          <td width="250" height="20" align="right"><font color="#FFFFFF">Subject:&nbsp;</font></td>
          <td width="250" height="20">&nbsp;
            <input type="text" name="subject" cols="30" maxlength="20" value="Subject"></td>
          <td width="300" height="20"><font color="#FFFFFF">Message Title</font></td>
        </tr>
        <tr>
          <td width="250" align="right"><font color="#FFFFFF">Message:&nbsp;</font></td>
          <td width="250">&nbsp;
            <textarea name="message" rows="10" cols="35" wrap=SOFT>Message</textarea></td>
          <td width="300"><font color="#FFFFFF">Message; should be precise and contain no typos! 
          <b>Please check that you have spelled everything correctly and that the message contains everything it should, without any irrelevant content!</b> 
          If this form is used for spam, you will loose access to it.
          <br>
          <br>
          This form uses html, but the recievers mail might not, try to keep it simple without needing codes.</font></td>
        </tr>
        <tr>
          <td width="250" height="20" align="right"><font color="#FFFFFF">Your Name :&nbsp;</font></td>
          <td width="250" height="20">&nbsp;
            <input type="text" name="from" cols="30" maxlength="20" value="Name"></td>
          <td width="300" height="20"><font color="#FFFFFF">Your name, for documentation purposes</font></td>
        </tr>
        <tr>
          <td width="250" height="20" align="right"><font color="#FFFFFF">Date:&nbsp;</font></td>
          <td width="250" height="20">&nbsp;
            <input type="text" name="date" cols="30" maxlength="50" value="<?php
echo date("d");
echo 'th of ';
echo date("F");
echo ', ';
echo date("Y");
?>" readonly></td>
          <td width="300" height="20"><font color="#FFFFFF">Todays Date, will be logged </font></td>
        </tr>
        <tr>
          <td width="250" height="20" align="right"><font color="#FFFFFF">Your IP :&nbsp;</font></td>
          <td width="250" height="20">&nbsp;
            <input type="text" name="ip" cols="30" maxlength="20" value="<?php $ip = $_SERVER['REMOTE_ADDR']; 
    echo "$ip"; ?>" readonly></td>
          <td width="300" height="20"><font color="#FFFFFF">Your IP, will be logged</font></td>
        </tr>
        <tr align="center">
          <td height="20" colspan="3"><input type="hidden" name="mail_to" value="<?php
$check = $_POST['check']; 
$tostr = "";
foreach($check as $to) 
{
   $tostr .= $to;
   $tostr .= ", ";
}
$tostr = trim($tostr, ', ');
echo $tostr;
?>"></td>
        </tr>
        <tr align="center">
          <td height="20" colspan="3"><font color="#FFFFFF"><?php
$check = $_POST['check']; 
$tostr = "";
foreach($check as $to) 
{
   $tostr .= $to;
   $tostr .= ", ";
}
$tostr = trim($tostr, ', ');
echo $tostr;
?></font></td>
        </tr>
        <tr align="center">
          <td height="20" colspan="3"><input name="Submit2" type="submit" id="Submit" value=" Send the Mail ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input name="Reset2" type="reset" id="Reset" value="Reset this form"></td>
          </tr>
      </table>
      </form>

Third page is the process_send_mail.php which sends the mail and adds a backup to a database:

Code:

<?php
include("../db_connect.php");
$ID = mysql_real_escape_string($_POST['ID']);
$subject = mysql_real_escape_string($_POST['subject']); 
$message = mysql_real_escape_string($_POST['message']); 
$from = mysql_real_escape_string($_POST['from']); 
$date = mysql_real_escape_string($_POST['date']); 
$ip = mysql_real_escape_string($_POST['ip']); 
$mail_to = $_POST['mail_to'];
$headers = "cc: $mail_to";
echo "<strong>Message was sent to: </strong>";
echo $mail_to;
echo "<br>";
echo "<br>";
mysql_query("INSERT INTO `sentmail` VALUES ('$ID', '$mail_to' , '$subject', '$message', '$from', '$date', '$ip')"); 

include("smtp.php");
if(($error = sendmail($_POST[mail_to], $_POST[subject], $_POST[message], $_POST[headers])) != false) {
echo 'Failed to send the email, and the error message was: <b>' . $error . '</b>, please forward this error to the system administrator.';
}

echo " A mail with this subject: <strong>" . $subject . " </strong>, has been sent:<br />";
echo " Message:  <strong>" . $message . " </strong><br />";
echo " Author:</strong>  <strong>" . $from . " </strong><br />";
echo " Date:</strong>  <strong>" . $date . " </strong><br />";
echo " the information was also added to the database, you will be redirected in 10 seconds."; 
?>

I included everything between <form> and </form>, and as seen, it goes over three pages, passing information from page to page.


http://bamboocommandos.com/butcher_img/butchersig7.jpg

Offline

 



© 2003 - 2024 NullFX
Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License