Hello Guys/Gals,
it's friday (at least where I am it is) and I have an issue with a
script that I just started using again. The problem is, is that it uses
the built in PHP mail() function, and on my testing server, mail()
doesn't work. The other issue, is that I use SMTP Auth to connect to my
mail server, so that when mail sends out, it comes from my mail server
so that there is less of a chance for being marked as SPAM.
So, what I am looking to do, is use either the trust old Pear::Mail or
PHPMailer scripts (I am sure there are other ones out there, but those
are the 2 I am most familiar with).
So now to my actual question. How can I override the built-in PHP
mail() function, to let either of those 2 (or something else someone may
suggest) to act in the same manner as the mail() function?
Is this easy? I've googled, but haven't seen any reference to doing
what I am looking to do (maybe I just can't google)
Steve
You cannot "override" a function. You will have to write a new function,
"my_mail" or some such. Have it take the same arguments as the built in mail
function, but internally it uses phpmailer or the likes. Then, do a search and
replace for " mail(" with " my_mail("
One other possible option, which I had not contemplated until now, would be to
actually specify a replacement sendmail executable when setting up the sendmail
option in the php.ini. You could specify a php script that can run as though it
was sendmail, accept the same arguments, etc... but do all the phpmailer stuff
inside.
Jim Lucas
after posting this, and doing some more googleing, I found this:
http://ca.php.net/manual/en/function.override-function.php
it says you can override built-in php functions... I haven't tested to
see if i can do it, but it seems possible... has anyone used this
before? and will it do what I need? (this has been put on the back
burner for today, so tonight I will look more deeper into this unless
someone else has any luck in the mean time)
TIA!
Steve
In PHP versions < 5.3 you need something like runkit or apd. In PHP 5.3
and up you could use monkey patching
<?php
namespace somenamespace;
function mail() {
// do something!
}
You don't actually overwrite the core function but it's close.
<?php
use somenamespace;
mail() // will call the namespaced function
\mail() // will call the core function
The reason i was hoping to override the function, was because then if
the script has updates, then i would need to change all references of
mail() to my_mail() or if i am not using < 5.3 (and what is runkit or
apd??)
APD is the Advanced PHP Debugger. That reffers to the first link you
added. And runkit is a PHP extension which allows you to override
functions, classes, etc.
http://php.net/manual/en/book.runkit.php
refers :)
I would opt for using my_mail and not overriding a built-in function. Itseems to me that it would just cause confusion for the next developerwho takes care of your code. You know, that psychopathic programmer thatknows your address. =)
Yes, better to create your own function (or class) to abstract the mail()
API of your choosing is the better route. You'll have to retrofit the script
to use it, but you can then swap in different mail systems later without
changing the client. Even when you don't anticipate needing to switch to a
different provider, adding an abstraction layer from the start is often
cheap enough to warrant the risk of never needing to change the
implementation underneath.
David
I should have added.
Running APD or runkit in production is probably not a good idea. And
renaming a core function just the same. Monkey patching is a nice
solution. But can cause confusion as well.
Like Mike and David say. Better role your own function / class for this.