Magento: envie anexos de arquivo em emails


9

em um módulo personalizado, eu uso esta função para enviar e-mails:

public function sendMail($errorCod, $errorMsg) {

    $mail = Mage::getModel('core/email');

    $recipients = array(
            Mage::getStoreConfig('trans_email/ident_custom1/name') => Mage::getStoreConfig('trans_email/ident_custom1/email'),  
            Mage::getStoreConfig('trans_email/ident_custom2/name') => Mage::getStoreConfig('trans_email/ident_custom2/email')
    );

    foreach ($recipients as $recipient):
        $mail->setToEmail($recipient);

        $mailBody  = "<b>Error Code: </b>".$errorCod."<br />";
        $mailBody .= "<b>Error Massage: </b>".$errorMsg."<br />";

        $mail->setBody($mailBody);
        $mail->setSubject('Lorem Ipsum');
        $mail->setFromEmail(Mage::getStoreConfig('trans_email/ident_general/email'));
        $mail->setFromName("Lorem Ipsum");
        $mail->setType('html');

        try {
            $mail->send();
        }
        catch (Exception $e) {
    }

    endforeach;

}

Eu tento enviar 2 arquivos de anexos no mesmo email.

Como posso fazer isso, sem usar o modelo Mage_Core_Model_Email_Template.

Muito obrigado pela ajuda.

Respostas:


14

Tente usar o Zend_Mail. Vejo:

public function sendMail($errorCod = "", $errorMsg = "")
{

    $mail = new Zend_Mail('utf-8');

    $recipients = array(
        Mage::getStoreConfig('trans_email/ident_custom1/name') => Mage::getStoreConfig('trans_email/ident_custom1/email'),
        Mage::getStoreConfig('trans_email/ident_custom2/name') => Mage::getStoreConfig('trans_email/ident_custom2/email'),
    );
    $mailBody   = "<b>Error Code: </b>" . $errorCod . "<br />";
    $mailBody .= "<b>Error Massage: </b>" . $errorMsg . "<br />";
    $mail->setBodyHtml($mailBody)
        ->setSubject('Lorem Ipsum')
        ->addTo($recipients)
        ->setFrom(Mage::getStoreConfig('trans_email/ident_general/email'), "FromName");

    //file content is attached
    $file       = Mage::getBaseDir('var') . DS . 'log' . DS . 'exception.log';
    $attachment = file_get_contents($file);
    $mail->createAttachment(
        $attachment,
        Zend_Mime::TYPE_OCTETSTREAM,
        Zend_Mime::DISPOSITION_ATTACHMENT,
        Zend_Mime::ENCODING_BASE64,
        'attachment_1.log'
    );
    $file       = Mage::getBaseDir('var') . DS . 'log' . DS . 'system.log';
    $attachment = file_get_contents($file);
    $mail->createAttachment(
        $attachment,
        Zend_Mime::TYPE_OCTETSTREAM,
        Zend_Mime::DISPOSITION_ATTACHMENT,
        Zend_Mime::ENCODING_BASE64,
        'attachment_2.log'
    );

    try {
        $mail->send();
    } catch (Exception $e) {
        Mage::logException($e);
    }
}

Exatamente, eu também implementei essa funcionalidade com o Zend_Mail há algum tempo.
Anna Völkl

O único problema que tenho com isso é se você estiver em um servidor de hospedagem compartilhada, independentemente de definir um remetente, ele não é o remetente permitido do próprio servidor (se você olhar os cabeçalhos de e-mail paraReceived-SPF:
Moose

Magento já lida com o envio de e-mails com anexos, eu não encontrá-lo relevante para o desvio de suas funções
DependencyHell

6

Apenas para obter outra resposta aqui, você também pode reescrever Mage/Core/Model/Email/Template.phpe criar uma addAttachmentfunção. Este exemplo adicionará um pdf, mas você pode estendê-lo para fazê-lo funcionar com qualquer tipo de arquivo.

public function addAttachment(Zend_Pdf $pdf){
    $file = $pdf->render();
    $attachment = $this->getMail()->createAttachment($file);
    $attachment->type = 'application/pdf';
    $attachment->filename = 'yourfile.pdf';
}

3

Copie este código em qualquer phtml ou controlador para enviar email com arquivo de anexo:

  $mailTemplate = Mage::getModel('core/email_template');
  $mailTemplate->setSenderName('Sender Name'); 
  $mailTemplate->setSenderEmail('sender@sender.email');
  $mailTemplate->setTemplateSubject('Subject Title');
  $mailTemplate->setTemplateText('Body Text');
  // add attachment
  $mailTemplate->getMail()->createAttachment(
          file_get_contents(Mage::getBaseDir('base') . '/media/file/file.pdf'), //location of file
          Zend_Mime::TYPE_OCTETSTREAM,
          Zend_Mime::DISPOSITION_ATTACHMENT,
          Zend_Mime::ENCODING_BASE64,
          'file.pdf'
  );
  $mailTemplate->send('toemail@email.com','subject','set message');

obrigado está funcionando. Mas qual é o uso de 'assunto' e 'definir mensagem' na última linha porque, como posso ver, o assunto já está definido na linha 4 e a mensagem está na linha 5?
Sarvagya 13/08/1918

graças @prince seu código utilizado para mim no observador :)
Rakesh Donga

Sim, não há necessidade de usar Zend_Mail diretamente
DependencyHell

2

// 1 Usei uma pasta de cotação de solicitação como requestquote no diretório de mídia para salvar // imagens carregadas

// 2 Existe uma matriz de variáveis ​​personalizadas a serem passadas para o email transacional // o modelo de email foi criado no magento admin e seu ID de modelo 3

// O código foi testado no Magento 1.9.1.0

// O código começa logo abaixo

$uploadfilename = '';

if( !empty($_FILES["rfloorplanattachment"]["name"])  )
{

    $image_ext = end(explode('.',$_FILES["rfloorplanattachment"]["name"]));
    $allowed_ext =  array('gif','png' ,'jpg','jpeg','pdf','doc','docx','rtf','odt');

    $uploadfilename = md5(substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, rand(1,100).rand(1,100))).str_replace(" ","_",$_FILES["rfloorplanattachment"]["name"]); 
    $source_upl         = $_FILES["rfloorplanattachment"]["tmp_name"];
    $target_path_upl = Mage::getBaseDir('media').DS.'requestquote'.DS.$uploadfilename;  
    if(in_array($image_ext ,$allowed_ext ) ) {
        @move_uploaded_file($source_upl, $target_path_upl);
    }
}


$senderName = Mage::getStoreConfig('trans_email/ident_general/name');
$senderEmail = Mage::getStoreConfig('trans_email/ident_general/email');

$templateId = 3;
$sender = Array('name' => $senderName,'email' => $senderEmail);


$requestquotesvars = array(
            'firmname'     =>  $customer->getFirstname()
        );


$emaiName = 'Request Quote Firms';

$storeId = Mage::app()->getStore()->getId();

$translate = Mage::getSingleton('core/translate');
$transactionalEmail = Mage::getModel('core/email_template');
if(file_exists(Mage::getBaseDir('media').DS.'requestquote'.DS.$uploadfilename) )
{
$transactionalEmail->getMail()
                ->createAttachment(
        file_get_contents(Mage::getBaseDir('media').DS.'requestquote'.DS.$uploadfilename),
        Zend_Mime::TYPE_OCTETSTREAM,
        Zend_Mime::DISPOSITION_ATTACHMENT,
        Zend_Mime::ENCODING_BASE64,
        basename($uploadfilename)
    );
}
$transactionalEmail->sendTransactional($templateId, $sender, $companymail, $emailName, $requestquotesvars, $storeId);
$translate->setTranslateInline(true);

   unlink(Mage::getBaseDir('media').DS.'requestquote'.DS.$uploadfilename);

2

Desfrute: Exemplo de trabalho

$mail = new Zend_Mail();
$mail->setType(Zend_Mime::MULTIPART_RELATED);
$mail->setBodyHtml($html_body);
$mail->setFrom('support@example.com', 'Example');
$mail->addTo('your_email@gmail.com', 'Arslan');
$mail->setSubject('Sending email using Zend Framework');
$dir = Mage::getBaseDir();
$path = "test.html";  // any file named test.html at root
$file = $mail->createAttachment(file_get_contents($path));
$file ->type        = 'text/csv';
$file ->disposition = Zend_Mime::DISPOSITION_INLINE;
$file ->encoding    = Zend_Mime::ENCODING_BASE64;
$file ->filename    = 'test.html';
try {
    //Confimation E-Mail Send
    $mail->send();
}
catch(Exception $error) {
    Mage::getSingleton('core/session')->addError($error->getMessage());
    return false;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.