Search code examples
localsendmailphp

Have php mail() function output to a local file instead of using SMTP


I'd like to create an alternative sendmail.php file where instead of having to go through a server, a php mail() call gets appended to a local file, so that we can verify a mail() call is made and that it goes to the appropriate e-mail addresses.

I'm working on an installation of MAMP, but I think this could be applied across multiple local installations, and that's my hope - we've got all types of operating systems in my group.

This site: http://www.drupal4hu.com/node/55makes me think it shouldn't be to difficult, but I think they were running the script from a live server, and it throws errors when I try it on my local machine. The most frequent error:

dyld: Symbol not found: __cg_jpeg_resync_to_restart

doesn't seem relevant - some other obscure problem may have been causing that.

I'm played around with editing the php.ini file, and I'm aware that I could direct everything through an SMTP server, but I'd rather not risk having someone (myself included) send e-mails to real people while we're testing.

Any ideas? Thanks!


Solution

  • If you've got a bunch of direct calls to the built-in mail(), you're unfortunately in a bad place. The best solution is probably to create some wrapper, and quickly replace all bare calls to mail() with calls to your wrapper.

    If that's somehow impossible, you could tweak the mail configuration to use a fake sendmail, of your own creation, which just writes stuff to disk. You'd just set mail.sendmail_path to your fake-sendmail, and have that fake-sendmail do its thing.

    But the best answer is to create an API for sending mail in your app, make sure it's always used, and the switch out back-ends from there. Then when you want to ditch mail() for something like SwiftMailer or Zend_Mail, you only need to change the implementation of your application-specific send_some_email() function.