M2 no viene listo para usar, sin embargo, es una característica integrada en el marco zend. Aquí hay una buena referencia sobre cómo agregar esta funcionalidad a magento: https://blog.bitexpert.de/blog/sending-mails-with-attachments-in-magento-2/
En caso de que el enlace se bloquee, cree lo siguiente
<?php
namespace Your\CustomModule\Magento\Mail\Template;
class TransportBuilder
extends \Magento\Framework\Mail\Template\TransportBuilder
{
public function addAttachment(
$body,
$mimeType = Zend_Mime::TYPE_OCTETSTREAM,
$disposition = Zend_Mime::DISPOSITION_ATTACHMENT,
$encoding = Zend_Mime::ENCODING_BASE64,
$filename = null
) {
$this->message->createAttachment($body, $mimeType, $disposition, $encoding, $filename);
return $this;
}
}
luego agregue a etc / di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="\Magento\Framework\Mail\Template\TransportBuilder"
type="\Your\CustomModule\Magento\Mail\Template\TransportBuilder" />
</config>
Ahora puede usarlo en addAttachment()
todo su sitio.
A partir de Magento 2.2.7, las soluciones descritas anteriormente ya no funcionan ya que
\Magento\Framework\Mail\Message
dejó de extenderse\Zend_Mail
.Para evitar la falta de una manera fácil de agregar archivos adjuntos a través del constructor de transporte (que actualmente parece ser el lugar correcto para tal función), es necesario crear un reemplazo para el TransportBuilder y utilizar
\Zend\Mime\Part
:No olvide reemplazar el original
\Magento\Framework\Mail\Template\TransportBuilder
por su implementación a través dedi.xml
.Tenga en cuenta que esta implementación probablemente se romperá con un próximo lanzamiento de Magento como
\Magento\Framework\Mail\MessageInterface::setBody()
está en desuso y puede eliminarse pronto.HTH
fuente
Correo electrónico personalizado de Magento 2 desde el módulo, no proporciona datos adjuntos
Si desea utilizar archivos adjuntos de imágenes con plantillas de correo electrónico en Magento 2, debe anular la clase, Magento \ Framework \ Mail \ Template \ TransportBuilder
Magento listo para usar no proporciona la función de archivo adjunto para correo electrónico. Puede referir blogs para enviar datos adjuntos de imágenes en detalles,
Necesitas agregar lógica como a continuación,
fuente
Aquí hay una respuesta perfecta para enviar pdf en correo electrónico en magetno 2.3
fuente
Compatible con Magento 2.3.x:
Esta fue mi respuesta para Magento 2.3 ya que esta era una pregunta importante en Google y parece que hay mucha gente mirando los comentarios.
Parece que hay muchas ganas en otras publicaciones sobre sobrescribir la
TransportBuilder
clase predeterminada a través deetc/di.xml
, sin embargo, el módulo en el que estoy trabajando es tan pequeño que no quiero que sea responsable de la clase predeterminadaTransportBuilder
así que construí una clase auxiliar (debería probablemente sea un modelo basado en qué tan acoplado está a la plantilla de correo electrónico declarada, pero estoy divagando).El
TransportBuilder
no tiene acceso público alTransportInterface
, sino que genera un clon cada vez y luego restablece el generador. Me resultó más fácil construir miTransportInterface
instancia y luego adjuntar misPart
objetos adjuntos al mensaje del transporte. Si considera necesario sobrescribir el valor predeterminadoTransportBuilder
mediante la preferencia de inyección de dependencia, tenga cuidado al actualizar los métodos públicos. ¡Recuerde practicar el O cuando mantenga su código SOLIDO !fuente
MessageInterface::getBody
firma del método muestra un tipo de retorno de cadena. Puede que tenga que cavar en suTransportInterface
objeto, pero puedo decirle que eladdPart
método existe en unZend\Mime\Message
objeto. Dado que magento probablemente extendió esa clase para su propiaMessage
clase, creo que sería inteligente intentarlo$transport->getMessage()->addpart($part);
Como se mencionó en las respuestas anteriores, magento2 no tiene una función lista para usar para enviar correos con archivos adjuntos.
No sé si es una mejor práctica, pero podría llamar directamente a la
Zend_Mail
clase para hacerlo, sin crear una función personalizada y anularMagento\Framework\Mail\Template\TransportBuilder
, como se muestra a continuaciónfuente