Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-11-2012 11:38:22

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Zend/Mail...

Je tombe des nues. Et je suis un peu coincé.

Je rencontre effectivement plusieurs problèmes avec le package Zend\Mail :

- Si je souhaite envoyer un mail, je dois faire un utf8_decode sur le body !
- Si je souhaite envoyer un mail en HTML, des entêtes (subject...) se retrouvent dans le body (apparemment un saut de ligne qui pose problème) !!
- La fonction send des transports disponibles ne retourne aucune variable pour tester le résultat !!!

Est-ce bien sérieux ?

Parallèlement j'ai essayé d'utiliser swift mailer que j'utilise habituellement et qui est vraiment très complet.
Et bien il ne fonctionne pas "nativement". Pas d'espaces de noms et l'autoloader ne trouve pas les classes nécessaires.

Si vous avez une idée pour résoudre mon problème, je suis preneur.


22914720

Hors ligne

 

#2 09-11-2012 11:47:45

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Zend/Mail...

Salut, voici ce que j'utilise pour l'envoi de mail je sais pas si ça pourra t'aider

Classe service :

Code:

[lang=php]
<?php

namespace Application\Service;

use Zend\Mail\Message;
use Zend\Mime\Message as MimeMessage;
use Zend\Mime\Part as MimePart;
use Zend\View\Renderer\RendererInterface;

/**
 * This class is a simple service to simplify the creation and sending of mails
 */
class MailerService extends AbstractService {

    /**
     * @var RendererInterface
     */
    protected $renderer;

    /**
     * Return a HTML message ready to be sent
     *
     * @param  array|string                           $to          An array containing the recipients of the mail
     * @param  string                                 $subject     Subject of the mail
     * @param  string|\Zend\View\Model\ModelInterface $nameOrModel Either the template to use, or a ViewModel
     * @param  null|array                             $values      Values to use when the template is rendered
     * @return Message
     * @deprecated
     */
    public function createHtmlMessage($to, $subject, $nameOrModel, $values = array()) {
        $renderer = $this->getRenderer();
        $content = $renderer->render($nameOrModel, $values);
        $text = new MimePart('');
        $text->type = "text/plain";
        $html = new MimePart($content);
        $html->type = "text/html";
        $body = new MimeMessage();
        $body->setParts(array($text, $html));
        $message = $this->getDefaultMessage();
        $message->setSubject($subject)
                ->setBody($body)
                ->setTo($to);

        return $message;
    }

    /**
     * Return a text message ready to be sent
     *
     * @param  array|string                           $to          An array containing the recipients of the mail
     * @param  string                                 $subject     Subject of the mail
     * @param  string|\Zend\View\Model\ModelInterface $nameOrModel Either the template to use, or a ViewModel
     * @param  null|array                             $values      Values to use when the template is rendered
     * @return Message
     * @deprecated
     */
    public function createTextMessage($to, $subject, $nameOrModel, $values = array()) {
        $renderer = $this->getRenderer();
        $content = $renderer->render($nameOrModel, $values);
        $message = $this->getDefaultMessage();
        $message->setSubject($subject)
                ->setBody($content)
                ->setTo($to);
        return $message;
    }

    /**
     * Create a new message
     *
     * @param string $to email
     * @param string $subject Subject of the mail
     * @param array $templates An array of templates (containing the key "text" and/or "html")
     * @param array $values Values to pass to the templates
     * @return Message
     */
    public function createMessage($to, $subject, $templates, $values = array()) {
        $message = $this->getDefaultMessage();
        $message
                //->setBcc($bcc)
                ->setTo($to)
                ->setSubject($subject)
                ->setBody(new MimeMessage());

        // We make sure that the plain text message is always sent (as this is a good practice)
        if (!isset($templates['text'])) {
            new \RuntimeException(sprintf(
                                    'Plain text template has not been defined for the email %s', $subject
                    ));
        }

        $textContent = $this->render($templates['text'], $values);
        $this->addMimePart($message, $textContent, 'text/plain');

        if (isset($templates['html'])) {
            $htmlContent = $this->render($templates['html'], $values);
            var_dump($htmlContent);
            die();
            $this->addMimePart($message, $htmlContent, 'text/html');

            $message->getHeaders()->get('ContentType')->setType('multipart/alternative');
        }

        return $message;
    }

    /**
     * Add a Mime part to an existing message
     *
     * @param Message $message
     * @param mixed $content
     * @param string $mimeType
     * @throws \RuntimeException
     * @return Message
     */
    public function addMimePart(Message $message, $content, $mimeType) {
        $body = $message->getBody();
        if (!$body instanceof MimeMessage) {
            throw new \RuntimeException(sprintf(
                            'Message body must be an instance of MimeMessage, %s given', get_class($body)
                    )
            );
        }

        $mimePart = new MimePart($content);
        $mimePart->type = $mimeType;
        $body->addPart($mimePart);

        $message->setBody($body); // Refresh the body, may be a bug in Zend

        return $message;
    }

    /**
     * Send the message
     *
     * @param Message $message
     */
    public function send(Message $message) {
        $this->getSmtpTransport()->send($message);
    }

    /**
     * Render a template
     *
     * @param string $templateName
     * @param array $values
     * @return string
     */
    protected function render($templateName, $values) {
        return $this->getRenderer()->render($templateName, $values);
    }

    /**
     * Get the renderer
     *
     * @return \Zend\View\Renderer\RendererInterface
     */
    protected function getRenderer() {
        if ($this->renderer === null) {
            $this->renderer = $this->getServiceManager()->get('ViewRenderer');
        }
        return $this->renderer;
    }

    /**
     * Get the transport
     *
     * @return \Zend\Mail\Transport\Sendmail
     */
    protected function getSendmailTransport() {
        if ($this->sendmailTransport === null) {
            $this->sendmailTransport = $this->getServiceManager()->get('common.mailer.sendmail_transport');
        }
        return $this->sendmailTransport;
    }

    /**
     * Get the transport
     *
     * @return \Zend\Mail\Transport\Smtp
     */
    protected function getSmtpTransport() {
        if ($this->smtpTransport === null) {
            $this->smtpTransport = $this->getServiceManager()->get('common.mailer.smtp_transport');
        }
        return $this->smtpTransport;
    }

    /**
     * @return Message
     */
    protected function getDefaultMessage() {
        return $this->getServiceManager()->get('application.mailer.default_message');
    }

}

MessageFactory :

Code:

[lang=php]
class MessageFactory implements FactoryInterface {

    /**
     * @param  ServiceLocatorInterface $serviceLocator
     * @return Message
     */
    public function createService(ServiceLocatorInterface $serviceLocator) {
        $config = $serviceLocator->get('Configuration');
        $options = $config['mailer']['default_message'];
        $from = $options['from'];
        $message = new Message();
        $message->addFrom($from['email'], $from['name'])
                ->setEncoding($options['encoding']);

        return $message;
    }

}

SmtpTransportFactory

Code:

[lang=php]class SmtpTransportFactory implements FactoryInterface
{
    /**
     * @param  ServiceLocatorInterface $serviceLocator
     * @return Smtp
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $config  = $serviceLocator->get('Configuration');
        $options = new SmtpOptions($config['mailer']['smtp_options']);
        $smtpTransport = new Smtp($options);
        return $smtpTransport;
    }
}

Le fichier module.common.local.php à mettre dans le dossier autoload de ton application

Code:

[lang=php]return array(
    'mailer' => array(
        'default_message' => array(
            'from' => array(
                'email' => 'emailfrom',
                'name' => 'emailname',
            ),
            'encoding' => 'utf-8',
        ),
        'smtp_options' => array(
            'host' => 'hostsmtp',
            'port' => smtpport,
            'connection_class' => 'login', // Type d'authentification si je me souviens bien
            'connection_config' => array(
                'username' => 'username',
                'password' => 'password',
                //'ssl' => 'ssl'
            )
        )
    ),
);

Par contre je n'ai rien non plus pour tester si le mail est bien parti ou non. Ce code fonctionne avec mailjet.
Au passage j'en profite pour remercier Bakura qui est l'auteur de ce bout de code.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages