I am using magento for sending mail with condition,

My code:

<?php
class Gta_MerchantNotification_Model_Observer {
    public function merchantremainder($Observer) {
       $order = $Observer->getEvent()->getOrder();
       $order_details = $order->getAllVisibleItems();

       $itemData = array();
       foreach ($order_details as $list) {
          $incrementid = $order->getIncrementId();
          $sku = $list->getsku();
          $name = $list->getName();
          $price = $list->getPrice();
          $Qty = $list->getQtyOrdered();
          $extra = $order->getIncrementId();
          $message = 

          "
          <tr>
          <!-- <td>$incrementid</td> -->
          <td>$sku</td>
          <td>$name</td>
          <td>$price</td>
          <td>$Qty</td>
          </tr>";

          $itemData[$list->getId()] = $message;

      }

      $finalMessage =  "
      <p>Order Id : $incrementid</p>
      <table border='1'>

      <tr>
      <!-- <th>Id</th> -->
      <th>Sku</th>
      <th>Product name</th>
      <th>Price</th>
      <th>Qty Ordered</th>
      </tr>";
      if (!empty($itemData)) {
          foreach ($itemData as $data) {
             $finalMessage .= $data;
         }

         $finalMessage .= "</table>";
         $this->sendMail($finalMessage);
     }

 }

 public function sendMail($message) {
   $body ="$message";
   $emailTemplate = Mage::getModel('core/email');
   $emailTemplate->setFromName('abc');
   $emailTemplate->setBody($body);
   $emailTemplate->setSubject("Custom Email from observer");
   $emailTemplate->setType('html');
   $emailTemplate->setToEmail('abc@gmail.com');
   $emailTemplate->send();

}
}

?>

Output :

https://snipboard.io/encLQH.jpg

If order placed mail send to abc@gmail.com.
How to set email sender based on SKU $sku from order.

I want :

1) If SKU starts with 2, email should go to the mail id abc@gmail.com,
screenshot :

https://snipboard.io/2aiBze.jpg

2) If SKU starts with 3, email should go to the mail id xyz@gmail.com,
screenshot :

https://snipboard.io/tmWfEx.jpg

3) If SKU starts with 4, email should go to the mail id qwe@gmail.com,
screenshot :

https://snipboard.io/M5dGIn.jpg

FYI - If an order contains 10 items email should go separately based on SKU. But an order id the same must include all the emails.

Dani AI

Generated

Quick note: the runtime error shown in 's screenshot comes from using $sku inside sendMail() without it being defined (or the method signature not accepting the second argument). Also, passing a single SKU into sendMail() will not work correctly for orders that contain items for multiple recipients — the correct pattern is to group items by SKU prefix first, then send one email per recipient.

Recommended approach (high level)

  1. Build a small map of SKU-prefix => recipient email.
  2. Iterate all visible items and group them into buckets keyed by prefix.
  3. For each bucket build a single HTML body containing all rows for that recipient and send one email to that recipient.
  4. Use a Magento email template model and set the sender from store config so the email identity is consistent.

Example (illustrative, not a verbatim copy of forum code):

// build prefix=>email map and buckets
$map = ['2'=>'abc@example.com','3'=>'xyz@example.com','4'=>'qwe@example.com'];
$buckets = [];
foreach ($order->getAllVisibleItems() as $it) {
    preg_match('/^(\d)/', (string)$it->getSku(), $m);
    $k = $m[1] ?? 'default';
    $buckets[$k][] = $it;
}

// send one email per bucket
foreach ($buckets as $prefix => $items) {
    $to = $map[$prefix] ?? 'fallback@example.com';
    $html = '<p>Order: '.$order->getIncrementId().'</p><table>...'; // build rows from $items
    $template = Mage::getModel('core/email_template');
    $template->setSenderName('Store')->setSenderEmail(
        Mage::getStoreConfig('trans_email/ident_sales/email')
    );
    $template->send($to, null, ['body' => $html]);
}

Troubleshooting: log the $buckets to confirm grouping (Mage::log), ensure send / sendTransactional is given the recipient (do not rely on a $sku variable inside the mail method), and add a fallback email for unknown prefixes. This also avoids duplicate-mails and meets the requirement "same order id, separate emails per SKU group."

Recommended Answers

All 2 Replies

Pass the $sku to the sendMail function: $this->sendMail($finalMessage, $sku); then add the conditional around the email address, you could make it simple and make the $sku variable say 'lots_of_orders' if he has over 10:

$cut_sku = substr($sku, 0, 1);
if($sku == 'lots_of_orders'){
    $emailTemplate->setToEmail('xyz@gmail.com');
}elseif($cut_sku == '1'){
    $emailTemplate->setToEmail('abc@gmail.com');
}elseif($cut_sku == '2'){
     $emailTemplate->setToEmail('bcd@gmail.com');
}else....

My code :

<?php
class Gta_MerchantNotification_Model_Observer {
    public function merchantremainder($Observer) {

        $order = $Observer->getEvent()->getOrder();
        $order_details = $order->getAllVisibleItems();

        $itemData = array();
        foreach ($order_details as $list) {
            $incrementid = $order->getIncrementId();
            $sku = $list->getsku();
            $name = $list->getName();
            $price = $list->getPrice();
            $Qty = $list->getQtyOrdered();
            $extra = $order->getIncrementId();
            $message = 

            "
            <tr>
            <!-- <td>$incrementid</td> -->
            <td>$sku</td>
            <td>$name</td>
            <td>$price</td>
            <td>$Qty</td>
            </tr>";

            $itemData[$list->getId()] = $message;

        }

        $finalMessage =  
        "<p>Order Id : $incrementid</p>

        <table border='1'>
        <tr>
        <!-- <th>Id</th> -->
        <th>Sku</th>
        <th>Product name</th>
        <th>Price</th>
        <th>Qty Ordered</th>
        </tr>";

        if (!empty($itemData)) {
            foreach ($itemData as $data) {
                $finalMessage .= $data;
            }

            $finalMessage .= "</table>";

            $this->sendMail($finalMessage, $sku);
        }

    }

    public function sendMail($message) {
        $body ="$message";
        $emailTemplate = Mage::getModel('core/email');
        $emailTemplate->setFromName('abc');
        $emailTemplate->setBody($body);
        $emailTemplate->setSubject("Custom Email from observer");
        $emailTemplate->setType('html');

        // Multiple Email Recipients Condition

        $cut_sku = substr($sku, 0, 1);

        if($sku == 'lots_of_orders') {
            $emailTemplate->setToEmail('abc@gmail.com');
        }elseif ($cut_sku == '2') {
            $emailTemplate->setToEmail('xyz@gmail.com');
        }elseif ($cut_sku == '3') {
            $emailTemplate->setToEmail('qwe@gmail.com');
        }elseif ($cut_sku == '4') {
            $emailTemplate->setToEmail('ewq@gmail.com');
        }

        $emailTemplate->send();

    }
}

?>

Error output :

https://snipboard.io/f56vtu.jpg

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.