Как мне использовать компонент электронной почты CakePHP? - PullRequest
2 голосов
/ 05 января 2010

Я новичок в CakePHP и отчаянно пытаюсь учиться!

Моя самая последняя борьба с компонентом электронной почты.

У меня есть контракт. Когда я создаю договор, я добавляю пользователя. Когда я сохраняю новый контракт ... в первый раз, я хочу отправить электронное письмо пользователю в этом контракте, в котором он может щелкнуть ссылку обратно в контракт, а затем принять или отклонить контракт.

Как мне отправить это письмо?

Чем больше деталей я смогу получить, тем лучше. Все, что я прочитал там, удивительно запутанно. Нужно ли настраивать параметры smtp? Как получить пользователя в договоре после его сохранения и передать его и ссылку на договор на электронную почту? Как я узнаю, отправлено ли письмо, не посещая и не проверяя мою почту каждый раз?

Вот код, который у меня есть в моем contract_controller.php для функции отправки электронной почты: (Контракт принадлежит Пользователю, а Пользователь имеет Много Контрактов.)

function _sendContractEmail($id) {
        $this->Email->smtpOptions = array(
        'port'=>'465',
        'timeout'=>'30',
        'host'=>'ssl://smtp.gmail.com',
        'username'=>'username',
        'password'=>'password'
        );
        $this->Email->delivery = 'smtp';
        $User = $this->Contract->User->read(null,$id);
        $this->Email->to = 'jeremiah@jeremiahotis.com';
        $this->Email->subject = '';
        $this->Email->replyTo = 'no-reply@goodvaluation.com';
        $this->Email->from = 'Jeremiah Oits <jeremiah@jeremiaotis.com>';
        $this->Email->template = 'simple_message';
        $this->Email->sendAs = 'html';
        $this->set('User', $User);
        $this->Email->_debug = true;
        $this->Email->send('Test Email');
        $this->redirect(array('controller'=>'contracts', 'action'=>'index'));
    }

Вот код, который у меня есть в моей функции contract_controller.php add ():

function add() {
        if (!empty($this->data)) {
            $this->Contract->create();
            if ($this->Contract->save($this->data)) {
                $this->Session->setFlash(__('The Contract has been saved', true));
                $this->_sendContractEmail($this->Contract->User->id);
            } else {
                $this->Session->setFlash(__('The Contract could not be saved. Please, try again.', true));
            }

И это вверху моего файла contract_controller.php после $ name и $ helpers:

var $components = array('Email');

Полагаю, мне следует указать, что у меня возникли проблемы с шаблоном, поэтому для его проверки я включил тело письма непосредственно в send () и указал адрес электронной почты вместо использования переменной. Еще ничего! Нет ошибок, нет электронной почты.

Любая помощь будет принята с благодарностью! Я действительно понятия не имею, что я делаю неправильно!

Спасибо

Иеремия

Ответы [ 3 ]

2 голосов
/ 06 января 2010

http://book.cakephp.org/view/481/Sending-A-Message-Using-SMTP

Используйте пример кода со страницы, в частности, последний раздел, чтобы получать уведомления об ошибках

/* Check for SMTP errors. */
    $this->set('smtp-errors', $this->Email->smtpError);

Вы можете распечатать ошибки smtp, используя pr (smtp-errors) ваше мнение.

Макеты для электронных писем должны быть расположены под

/app/view/layout/email/html
/app/view/layout/email/text

Если вы хотите скопировать и изменить шаблоны по умолчанию, их можно найти в

/libs/view/layouts/email/html
/libs/view/layouts/email/text

Ваш код выглядит правильно. Возможно, проблема в том, что SMTP-сервер отклонил письмо.

Да, вам также следует проверить debug.log и error.log в / app / tmp / logs

0 голосов
/ 27 июля 2011

Возможно, эта проблема была решена, но для меня решение было установить почтовый сервер. Я выбрал постфикс; есть полезное руководство по установке на https://help.ubuntu.com/community/MailServer.

При этом вам не нужно устанавливать smtpOptions из экземпляра Mail, учтите, что сообщение может быть доставлено также как спам.

0 голосов
/ 05 января 2010

Я бы поставил это в комментарии, но это стало немного длиннее.

Вы пытались использовать только локальный почтовый сервер, а не подключаться к Gmail? Возможно, сервер gmail отклоняет вашу электронную почту, поскольку она генерируется из локального источника. Я бы порекомендовал попробовать что-то вроде MDaemon локально, чтобы посмотреть, сможете ли вы сначала сгенерировать письмо для себя. Обязательно разрешите открыть ретрансляцию, иначе ваша почта будет приходить локально.

Где вы сохранили шаблоны электронной почты? Они должны быть здесь, app/views/elements/email/html и app/views/elements/email/text также обязательно установите свой контент, и в шаблоне используйте echo $ content_for_layout согласно документам, http://book.cakephp.org/view/269/Sending-a-basic-message API также стоит посмотреть, чтобы убедиться, что у вас есть правильные параметры, http://api.cakephp.org/class/email-component

Чтобы передать детали в сообщение электронной почты, вы можете просто использовать $ this-> set в действии вашего контроллера, а затем в своем шаблоне электронной почты вы можете сделать echo $ var для его вывода. Электронная почта работает так же, как обычный просмотр, за исключением того, что она отправляется по электронной почте, а не в браузер.

Если вы хотите проверить, было ли отправлено письмо, вы можете заключить $ email-> Send () в оператор if.

if($email->Send()){ echo "Your contract has been dispatched!"; }

Что заставляет меня думать, что вы создали экземпляр компонента электронной почты? Я склонен использовать,

$email = new Email();

Затем установите переменные класса для этого. Я раньше не видел, чтобы он использовался как $ this-> Email, хотя это вполне может сработать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...