2013-01-21 7 views
4

Я использую CakePHP через некоторое время, и я хотел использовать компонент электронной почты. Но у меня проблемы с этим.Ошибка при отправке почты с помощью cakephp

В самом деле, когда я пытаюсь отправить по электронной почте, я получаю:

не удалось отправить электронную почту. Ошибка: произошла внутренняя ошибка.

Ну ... Но почему? ^^

Вот мой контроллер:

$this->Email->from = 'Email<[email protected]>'; 
$this->Email->to = '[email protected]'; 
$this->Email->subject = 'This is the email Subject'; 
if ($this->Email->send('This is the email message')) 
    $this->set('success', 'Email successfully sent !'); 

И мой email.php в приложении/Config:

public $smtp = array(
    'transport' => 'Smtp', 
    'from' => array('[email protected]' => 'myHost'), 
    'host' => '192.168.10.50', 
    'port' => 25, 
    'timeout' => 30, 
    'username' => 'user', 
    'password' => 'secret', 
    'client' => null, 
    'log' => false, 
    //'charset' => 'utf-8', 
    //'headerCharset' => 'utf-8', 

Я также хотел бы знать, если Cake использует бинарный файл для отправки электронной почты, как 'sendmail' или 'mail', потому что на моем Linux-сервере эти двоичные файлы не устанавливаются.

Любая идея?

ответ

0

EmailComponent устарел, так как CakePHP 2.x был заменен на CakeEmail library class. Я считаю, что только CakeEmail беспокоится, чтобы прочитать вашу конфигурацию от app/Config/Email.php, EmailComponent взял его варианты как свойство (smtpOptions).

Это довольно легко перейти на новый CakeEmail компонента, выше вашего определения класса контроллера, просто добавьте:

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

, а затем в контроллере, замените текущий код с этим:

// In the top of your controller, initialize the component variable first. 
private $__Email; 

// In your action... 
$this->__Email = new CakeEmail(); 
$this->__Email->from('[email protected]') 
    ->to('[email protected]') 
    ->subject('This is the email Subject') 
    ->send('This is the email message'); 

$this->set('success', 'Email successfully sent !'); 

Что касается вашего второго вопроса, да, вам нужно будет установить MTA (Агент почтового транспорта), например sendmail, на сервере, который вы используете для отправки почты. Под водой CakeEmail использует метод PHP mail(), который использует все, что вы установили как sendmail_path в вашем файле php.ini.

+0

Только я не использовал бы частные вещи здесь, в контексте рамки. – mark

+0

@mark Ничто из-за пределов текущего контроллера не имеет доступа к свойствам компонента. Поэтому имеет смысл назначить его частным в таких случаях, нет необходимости использовать широкую область. – Oldskool

+0

мусор. framework = вы всегда можете расширить существующий контроллер/компонент (даже из плагинов) и т. д., используя защищенный, не имеет большого масштаба. либо сделать его общедоступным, либо защищенным (= класс или его подклассы). Я лично не считаю, что «частный» должен когда-либо использоваться в таком проекте. нет абсолютно никакой необходимости в этом. – mark

0

1) Настройте приложение/Config/email.php:

public $gmail = array(
     'host' => 'ssl://smtp.gmail.com', 
     'port' => 465, 
     'username' => 'your qmail [email protected]', 
     'password' => 'password', 
     'transport' => 'Smtp' 
    ); 


2) Загрузка электронной почты компонент на верхней части контроллера

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

3) Отправить письмо

public function send_email(){ 
      $Email = new CakeEmail(); 
      $Email->config('gmail'); 
      $Email->from('[email protected]'); 
      $Email->to('[email protected]'); 
      $Email->subject('Expire Date Information '); 
      $Email->emailFormat('html'); 
      $Email->send(); 
    } 
Смежные вопросы