Bonjour,
en ce moment je fais un site avec CakePHP 3 où pour confirmer l'inscription il faut confirmer son compte par mais.
Donc j'ai essayé d'envoyer un mail en SMTP sur Maildev :

app.php

'EmailTransport' => [
        'default' => [
            'className' => 'Mail',
            // The following keys are used in SMTP transports
            'host' => 'maildev',
            'port' => 25,
            'timeout' => 30,
            'username' => '',
            'password' => '',
            'client' => null,
            'tls' => null,
        ],
    ],

    'Email' => [
        'default' => [
            'transport' => 'default',
            'from' => 'local@dev.fr',
            'charset' => 'utf-8',
            'headerCharset' => 'utf-8',
        ],
    ],

UsersController.php

<?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\Network\Email\Email;

class UsersController extends AppController{
  public function register(){
        $user = $this->Users->newEntity();
        if ($this->request->is('post')) {
            $token = hash('sha512', sha1(rand() . uniqid() . time()));
            $user = $this->Users->patchEntity($user, $this->request->data);
            $user->verification_token = $token;
            $email = new Email(['EmailTransport' => 'default']);
            $email
                ->emailFormat('text')
                ->to('olivier.dupuy74@htomail.fr')
                ->from('contact@kreatik-stduio.com')
                ->subject('Confirmation LifeStucker');
            $email->send('Test');
            if($his->Users->save($user){
                // Bien inscrit
            } else {
                // Erreur
            }
        }
    }
}

Et j'ai l'erreur Cannot send email, transport was not defined. Did you call transport() or define a transport in the set profile?

Merci d'avance

3 réponses


connected
Réponse acceptée

Salut,

Le soucis se trouve dans ta config notament sur le block EmailTransport et Email. Garde la configuration de default, du block EmailTransport, telle quelle et crée toi une config pour le dev :

config/app.php :

'EmailTransport' => [
        'default' => [
            'className' => 'Mail',
            // The following keys are used in SMTP transports
            'host' => 'localhost',
            'port' => 25,
            'timeout' => 30,
            'username' => '',
            'password' => '',
            'client' => null,
            'tls' => null,
        ],
    'dev' => [
      'className' => 'Smtp',
      // The following keys are used in SMTP transports
      'host' => '127.0.0.1',
      'port' => 1025,
      'timeout' => 30,
      'client' => null,
      'tls' => null,
    ],
],

'Email' => [
        'default' => [
            'transport' => 'dev',
            'from' => 'no-reply@tonmail.fr',
            //'charset' => 'utf-8',
            //'headerCharset' => 'utf-8',
        ],
    ],

Ensuite dans le block Email, tu choisis ton transport ici c'est dev. Il ne te reste plus qu'a envoyer un mail :

$email = new Email('default');
$email->from(['test@test.com' => 'Nom exp'])
    ->to('bibi@test.com')
    ->subject('Coucou')
    ->send('ça fonctionne');

Pense juste à switcher la config du transport quand tu passes en prod, si non tu auras des erreurs...

Bon courage.

Bonsoir.

new Email(['EmailTransport' => 'default']);

Pourrais-tu me dire où tu as vu cette syntaxe ?
J'ai eu beau regardé dans la doc, je ne l'ai pas vue.
Si tu veux utiliser une configuration de transport précis, il te suffit de faire comme-ça :

$email = new Email();
$email
    ->transport('default')
    /* etc... */

Ensuite, tu parles de SMTP, mais tu configures un className Mail au lieu d'un className Smtp.

Imillix
Auteur

@Lartak je ne sais pas mais je crois que je l'ai inventé ^^
@connected merci, ca merche nickel !