How can I make email template in Zend Framework?

前端 未结 2 1322
误落风尘
误落风尘 2021-01-29 18:47

I want to make email templates in Zend Framework.

For example,



Dear {$username$},
This is a invitation email sent by
相关标签:
2条回答
  • 2021-01-29 19:18

    Hi this is realy common.

    Create an view script like : /views/emails/template.phtml

    <body>
    <?php echo $this->name; ?>
    <h1>Welcome</h1>
    <?php echo $this->mysite; ?>
    </body>
    

    and when creating the email :

    // create view object
    $html = new Zend_View();
    $html->setScriptPath(APPLICATION_PATH . '/modules/default/views/emails/');
    
    // assign valeues
    $html->assign('name', 'John Doe');
    $html->assign('site', 'limespace.de');
    
    // create mail object
    $mail = new Zend_Mail('utf-8');
    
    // render view
    $bodyText = $html->render('template.phtml');
    
    // configure base stuff
    $mail->addTo('john@doe.com');
    $mail->setSubject('Welcome to Limespace.de');
    $mail->setFrom('support@limespace.de','Limespace');
    $mail->setBodyHtml($bodyText);
    $mail->send();
    
    0 讨论(0)
  • 2021-01-29 19:37

    Just to complete ArneRie's answer here (which is already very relevant), I like to have in my projects a class to handle email sending and different templates at the same time.

    This class could be in your library for example (/library/My/Mail.php):

    class My_Mail
    {
        // templates name
        const SIGNUP_ACTIVATION          = "signup-activation";
        const JOIN_CLUB_CONFIRMATION     = "join-club-confirmation";
    
    
        protected $_viewSubject;
        protected $_viewContent;
        protected $templateVariables = array();
        protected $templateName;
        protected $_mail;
        protected $recipient;
    
        public function __construct()
        {
            $this->_mail = new Zend_Mail();
            $this->_viewSubject = new Zend_View();
            $this->_viewContent = new Zend_View();
        }
    
        /**
         * Set variables for use in the templates
         *
         * @param string $name  The name of the variable to be stored
         * @param mixed  $value The value of the variable
         */
        public function __set($name, $value)
        {
            $this->templateVariables[$name] = $value;
        }
    
        /**
         * Set the template file to use
         *
         * @param string $filename Template filename
         */
        public function setTemplate($filename)
        {
            $this->templateName = $filename;
        }
    
        /**
         * Set the recipient address for the email message
         * 
         * @param string $email Email address
         */
        public function setRecipient($email)
        {
            $this->recipient = $email;
        }
    
        /**
         * Send email
         *
         * @todo Add from name
         */
        public function send()
        {
            $config = Zend_Registry::get('config');
            $emailPath = $config->email->templatePath;
            $templateVars = $config->email->template->toArray();
    
            foreach ($templateVars as $key => $value)
            {
                if (!array_key_exists($key, $this->templateVariables)) {
                    $this->{$key} = $value;
                }
            }
    
    
            $viewSubject = $this->_viewSubject->setScriptPath($emailPath);
            foreach ($this->templateVariables as $key => $value) {
                $viewSubject->{$key} = $value;
            }
            $subject = $viewSubject->render($this->templateName . '.subj.tpl');
    
    
            $viewContent = $this->_viewContent->setScriptPath($emailPath);
            foreach ($this->templateVariables as $key => $value) {
                $viewContent->{$key} = $value;
            }
            $html = $viewContent->render($this->templateName . '.tpl');
    
            $this->_mail->addTo($this->recipient);
            $this->_mail->setSubject($subject);
            $this->_mail->setBodyHtml($html);
    
            $this->_mail->send();
        }
    }
    

    I like have some Zend_Mail options (such as transport, default sender name, etc.) set in my application.ini as follows:

    ;------------------------------------------------------------------------------
    ;; Email
    ;------------------------------------------------------------------------------
    resources.mail.transport.type       = smtp
    resources.mail.transport.host       = "192.168.1.8"
    ;resources.mail.transport.auth      = login
    ;resources.mail.transport.username  = username
    ;resources.mail.transport.password  = password
    ;resources.mail.transport.register  = true
    resources.mail.defaultFrom.email    = info@example.com
    resources.mail.defaultFrom.name     = "My Site Name"
    resources.mail.defaultReplyTo.email = info@example.com
    resources.mail.defaultReplyTo.name  = "My Site Name"
    
    email.templatePath = APPLICATION_PATH "/modules/default/views/scripts/emails"
    email.template.newsletter = "My Site Name - Newsletter" // default templates
    

    And now, from anywhere in my application, I can simply send an email using for instance:

        $mail = new My_Mail;
        $mail->setRecipient("name@example.com");
        $mail->setTemplate(My_Mail::SIGNUP_ACTIVATION);
        $mail->email = $user->email;
        $mail->token = $token; // generate token for activation link
        $mail->firstName = $user->firstName;
        $mail->lastName = $user->lastName;
        $mail->send();
    

    This will set the template, and template variables through a magic setter. At last, my templates are localized in APPLICATION_PATH "/modules/default/views/scripts/emails" (can be changed in the application.ini). A typical template would be:

    // in /views/scripts/emails/signup-activation.tpl
    <p> Hi,<br /><br /> You almost done, please finish your registration:<br />
    <a href="http://www.example.com
      <?= $this->url(array('controller' => 'account', 
                           'action'     => 'index', 
                           'e'          => $this->email, 
                           't'          => $this->token), 'default', true) ?>
      ">Click here</a>
    </p>
    
    // in /views/scripts/emails/signup-activation.subj.tpl
    My Site Name - Account Activation Link
    

    where $this->email and $this->token are the template variables.

    0 讨论(0)
提交回复
热议问题