【问题标题】:send email with link发送带有链接的电子邮件
【发布时间】:2012-08-10 07:01:12
【问题描述】:

此代码输出:

Call to a member function link() on a non-object 

我想要的是在电子邮件中发送一个链接。代码有什么问题?谢谢

class User extends AppModel {
    public $helpers = array('Html');
    public function sendEmail($email_user, $code) {
            $email = new CakeEmail();
            $email->config('smtp');

            $pwrurl = "http://xxx/users?se=check&mail=".$email_user."&code=".$code;
            $link = $this->Html->link('Link name', $pwrurl, array('target' => '_blank'));
            $email->from(array('xxxn@gmail.com' => 'xxxx'))
            ->to($email_user)
            ->emailFormat('html')
            ->send('My message:: '.$link);
            return true;
        }
}

docs

更新:我得到了同样的错误。

App::uses('CakeEmail', 'Network/Email');
App::uses('AppHelper', 'View/Helper');

class AppController extends Controller {
      public $helpers = array('Form', 'Html');

      public function sendEmail($email_user, $codeLink) {
             //same code.
      }

}

【问题讨论】:

  • $this->Html 可能是null
  • 你可以划掉“可能”;)我想知道人们是如何想到在模型中包含 helpers 数组的......
  • @mark,一个可能的解决方案是?
  • 对于初学者来说是蛋糕的方式。使用模板/布局并只传递值/数组,然后将其转换为视图 ctps 中的链接(那里有 html 帮助器可用)。
  • @ 标记,好的。所以要发送一个 html 链接,唯一的方法就是手工编写 html 代码?

标签: php cakephp html-email


【解决方案1】:

控制器中应该有这个:

class UsersController extends AppController {
   var $name = 'Users';
   var $helpers = array('Html');
   var $components = array('Email');

   function _email($email_user, $code){
      $pwrurl = "http://xxx/users?se=check&mail=".$email_user."&code=".$code;
      $this->Email->from = 'From: Someone';
      $this->Email->to = $email_user;
      $this->Email->subject  = 'Your Subject';
      $this->Email->sendAs = 'html';
      $this->Email->template = 'your_template';
      $this->set('pwrurl', $pwrurl);
      $this->Email->send();
   }
}

然后在views/elements/email/html 中创建一个电子邮件模板,其名称与上述代码中的模板名称相同。对于此示例 your_template.ctp。以您希望的方式编写消息以及您希望链接出现的任何位置使用:

$this->Html->link('Link name', $pwrurl, array('target' => '_blank'));

希望对您有所帮助。

【讨论】:

  • 我会得到一个未定义的变量:模板中的 pwrurl。我认为我只能在 view/users 文件夹中执行 $this->HTML->link...。
  • 如果你使用 $this->set('pwrurl', $pwrurl);该变量将在您指定的电子邮件模板中可用。我运行了上面的代码以确保它可以正常工作并且我能够发送和接收链接。
  • 你的例子是蛋糕 1.3 对吗?嗯,cake 2.2中的模板应该放在view/email/html/template.ctp中。我仍然遇到同样的错误。但是如果我使用用户文件夹的视图,那么我可以使用$this->Html->link('Link name', $pwrurl, array('target' => '_blank')); properly.
  • 是的,很抱歉,我使用的是 cake 1.3。 [Cake 2.0][cake] 显示设置$email->helpers(array('Html')); 并使用$email->viewVars(array('pwrurl' => $pwrurl)); 将变量发送到电子邮件视图[cake]:book.cakephp.org/2.0/en/core-utility-libraries/email.html
【解决方案2】:

来自here

$pwrurl = '<a href="http://' . $_SERVER['SERVER_NAME'] ."/users/otpregister/".$email_user."&code=".$codeLink.'"> Registration link</a>'; 

【讨论】:

    【解决方案3】:

    您可以尝试使用以下代码,而不是上面的代码:

    App::uses('HtmlHelper', 'View/Helper');
    class User extends AppModel {
    public function sendEmail($email_user, $code) {
            $email = new CakeEmail();
            $email->config('smtp');
    
            $pwrurl = "http://xxx/users?se=check&mail=".$email_user."&code=".$code;
            $link = $this->Html->link('Link name', $pwrurl, array('target' => '_blank'));
            $email->from(array('xxxn@gmail.com' => 'xxxx'))
            ->to($email_user)
            ->emailFormat('html')
            ->send('My message:: '.$link);
            return true;
        }
    }
    

    因为$helpers 是控制器的有效数据成员,而不是模型。在 AppController.php 中编写 sendEmail() 方法并使用 $this-&gt;sendEmail($user_email, $code); 将此方法调用到控制器的方法中也是一个不错的选择

    This documentation page 可能会帮助您实现同样的目标。

    希望它对你有用。

    【讨论】:

    • 我得到完全相同的错误,即使我把代码放在控制器中。
    猜你喜欢
    • 2016-01-08
    • 2016-07-05
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2013-08-17
    • 2013-09-21
    相关资源
    最近更新 更多