Bardzo często systemem, na którym pracują programiści webaplikacji (mam na myśli głównie pisane w  PHP) jest Windows.  Osobiście pracuję uzywając Linuxa (aktualnie OpenSuse v 11.2) i raczej staram się wymusić na pracodawcy tę praktykę, argumentując to tym, że mogę pracować na środowisku zbliżonym do tego, na jakim stoi produkcja, mogę chociażby uniknąć błędu związanego z nazwami plików (wielkie/małe litery plików – dla Windows to obojetne, a dla Linuxa to już znacząca różnica), czy też sprawdzić wysyłkę emaili (wystarczy mi ze zainstaluje jedynie postfixa, bądź sendmaila, ale raczej jestem za tym pierwszym).

Jeśli chodzi o test wysyłki emali naszej aplikacji to pod Windows jest troszke problematyczne. Osobiście nie znam żadnego darmowego serwera poczty dla Windows, pewnie mógłbym wygoooglać jakiś, ale niestety nie mam czasu.  Dla ludzi korzystajacych z Zend Framework i pracujących  na Windows (i nie tylko także pod Linux, jak kto woli) rozwiązanie jest proste.

Wystarczy stworzyć podklasę dla klasy Zend_Mail_Transport_Sendmail i w niej przeciążyc metodę _sendMail. Przykładowa klasa mogłaby wyglądać tak:

cclass Zextend_Mail_Transport_File extends Zend_Mail_Transport_Sendmail
{
   /**
    * Sciezka zapisu plików z email.
    * 
    * @var string
    */
   protected $_savePath;
 
   public function getSavePath()
   {
       return $this->_savePath;
   }
 
   public function setSavePath($path)
   {
       $this->_savePath = $path;
   }
   /**
    * Zapisuje cały email do plku.
    */
   function _sendMail()
   {
       $fileName = time() . '.eml';
       $data = 'Subject: ' . $this->_mail->getSubject() . "\n"
             . 'To: ' . $this->recipients . "\n"
             . $this->header . "\n"
             . $this->body;
       file_put_contents($this->getSavePath() . '/' . $fileName, $data);
   }
}

Aby utrzymać porządek w kodzie i nie zaburzyc prawidłowego działania naszej aplikacji można napisać nowy resource, np:

class Zextend_Application_Resource_MailTransport extends Zend_Application_Resource_ResourceAbstract
{
 
    public function init()
    {
       if ('development' === APPLICATION_ENV) {
            $transport = new Zextend_Mail_Transport_File();
            $transport->setSavePath(ROOT_PATH . '/temporary/mail');
        } else {
            $transport = new Zend_Mail_Transport_Sendmail();
        }
 
            Zend_Mail::setDefaultTransport($transport);
            Zend_Mail::setDefaultFrom('jarek@kielmas.com');
   }
}

Taki zasób bardzo łatwo wcielamy w życie przez dodanie linijki, obok juz istniejących (lub nie:) innych zasobów  w application.ini:

resources.types = „array()”
resources.view = „array()”
resources.mailtransport = „array()”
resources.navigation = „array()”
resources.acl = „array()”
resources.log = „array()”

Taka podmianka sposobu transportu emaili uodporni nas przed:

  1. nieposiadaniem serwera pocztowego, zainstalowanego na lokalnej maszynie,
  2. bałaganem w kodzie, wywołanym np. użyciem exit(), die() itd,
  3. dotykaniem wersji trunk w repozytorium (wystarczy tylko dodać wpis w pliku konfiguracyjnym, którego lokalna instancja i tak nie jest wersjonowana)