tags:

views:

78

answers:

2

Hi all,

In one of my personal project I am developing a basic SMTP server in php. It's ready and working when I launch it on its own from the command line; I access it correctly through telnet and it is responding correctly to SMTP commands and I access it correctly also from a php script sending an email using this server.

Now I have an issue when I launch the server from a php script and not from the command line (I do it using exec function). The server is responding correctly when I access it through telnet but not anymore from a php script sending an email.

Could anyone help me?

Note

To send emails from php scripts I use Mail PEAR extension. When I launch the server from within a script and try to send an email in the same process I get this error:

SMTP: Failed to connect socket: Connection refused (code: -1, response: )

Summary

My server implementation is in server.php and the script sending an email is in mail-test.php.

1) If I launch the server on the command line this way: php server.php and then launch php mail-test.php the script is processed normally and the email is sent. I can also access the server via telnet 127.0.0.1 3535 and communicating with the server normally.

2) Using an another script called test.php I wanted to wrap the server management, launching the server via exec("php server.php > /dev/null 2>&1 &"); and then doing the mail sending from that script in one shot. Doing that way, the server is correctly launched (I can access it via telnet) but emails sent from test.php thus after the server launch raise an error. If I send emails from an another script before killing the test.php process the email is correctly sent however...

I hope I am enough explicit.

A: 

Now I have an issue when I launch the server from a php script and not from the command line (I do it using exec function). The server is responding correctly when I access it through telnet but not anymore from a php script sending an email.

It's impossible to tell. Maybe there are different configuration php.ini (though I'm not sure what could influence this) files, maybe the PHP executable you're calling is another one (check the PATH environment variable in both cases)...

Try running netstat to check if there any differences in the listening socket.

Artefacto
I am using the same PHP binary in both situations. Thus the same configuration too.
Valentin Jacquemin
@Val Not necessarily. The `php.ini` file may be different. Anyway, you didn't see any difference on the output of `netstat`?
Artefacto
@Artefacto I get the exact same response: `tcp4 0 0 127.0.0.1.3535 *.* LISTEN`. How the `php.ini` could be different using the same command line?
Valentin Jacquemin
@Val You're listening only on the loopback address, therefore you can access it from the same machine, but not from others.
Artefacto
@Artefacto in this case I do all on the same machine.
Valentin Jacquemin
A: 

Strangely, I resolved this issue by setting SO_RCVTIMEO this way:

socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 0, 'usec' => 500))

The error message I got was not really meaningful.

I hope that it help others facing similar issue.

Valentin Jacquemin