如何在 Zend Framework 中制作电子邮件模板?

Posted

技术标签:

【中文标题】如何在 Zend Framework 中制作电子邮件模板?【英文标题】:How can I make email template in Zend Framework? 【发布时间】:2010-11-16 03:13:02 【问题描述】:

我想在 Zend Framework 中制作电子邮件模板。

例如,

<html>
<body>
Dear $username$,<br>
This is a invitation email sent by your $friend$.<br>
Regards,<br>
Admin
</body>
</html>

我想制作这个文件,在 Zend 框架中获取它,设置这些参数(用户名、朋友),然后发送电子邮件。

我该怎么做? Zend 支持吗?

【问题讨论】:

亲爱的 Robert Jones,这是您的 John Smith 发出的邀请。问候,管理员。 :) 【参考方案1】:

只是为了在这里完成 ArneRie 的回答(这已经非常相关),我喜欢在我的项目中设置一个类来同时处理电子邮件发送和不同的模板。

这个类可能在你的库中,例如 (/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();
    

我喜欢在我的 application.ini 中设置一些 Zend_Mail 选项(例如传输、默认发件人名称等),如下所示:

;------------------------------------------------------------------------------
;; 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

现在,我可以在我的应用程序的任何地方发送一封电子邮件,例如:

    $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();

这将通过 magic setter 设置模板和模板变量。 最后,我的模板在 APPLICATION_PATH "/modules/default/views/scripts/emails" 中本地化(可以在 application.ini 中更改)。一个典型的模板是:

// 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

其中$this-&gt;email$this-&gt;token 是模板变量。

【讨论】:

+1,以类似的方式执行此操作,但我正在扩展 Zend_Mail 而不是穷人的 DI【参考方案2】:

您好,这很常见。

创建一个视图脚本,例如:/views/emails/template.phtml

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

在创建电子邮件时:

// 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();

【讨论】:

值得注意的是,如果你在一个控制器动作中,并且你没有偏离默认的 MVC 架构太远,你可以简单地利用现有的视图实例,而不是创建一个新的视图实例一个(如果您不担心变量范围)。 $bodyText = $this-&gt;view-&gt;render('template.phtml') 在大多数情况下就足够了。

以上是关于如何在 Zend Framework 中制作电子邮件模板?的主要内容,如果未能解决你的问题,请参考以下文章

在 Zend Framework 2 中使用 Zend_Mail + Zend_Mime 创建 HTML 电子邮件

Zend Framework 2 发送电子邮件模板

Zend Framework:如何阅读电子邮件附件(并保存到磁盘)?

如何在控制器或视图之外使用 Zend Framework 部分视图助手?

Zend Framework 中的动态菜单

Zend framework 1.11 订购单