mentby.com
Blog | Jobs | Help | Signup | Login

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


Steven Staples Fri, 04 Feb 2011 05:38:07 -0800

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


Jim Lucas Fri, 04 Feb 2011 07:52:09 -0800

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


Steven Staples Fri, 04 Feb 2011 08:00:23 -0800

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


Thijs Lensselink Fri, 04 Feb 2011 11:25:34 -0800

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??)


Steven Staples Fri, 04 Feb 2011 11:39:08 -0800

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


Thijs Lensselink Fri, 04 Feb 2011 11:45:39 -0800

refers :)


Thijs Lensselink Fri, 04 Feb 2011 11:48:15 -0800

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. =)


Mike Hansen Fri, 04 Feb 2011 12:43:06 -0800

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


David Harkness Fri, 04 Feb 2011 12:50:15 -0800

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.


Thijs Lensselink Fri, 04 Feb 2011 14:11:00 -0800



Related Topics

Post a Comment