Magentoの注文確認メールは、標準ではHTML形式で送信されます。
ビジネス用途のメールでは、テキストメールが今でも主流ですが、Amazonなどは注文確認メールをHTML形式で送ってくることもあり、以前に比べるとHTMLメールに対する抵抗はなくなってきたのではないかと思います。

さて、今回のエントリではMagentoの注文確認メール(請求書や配送メールも含みます)をカスタマイズして、商品画像を掲載する方法をご紹介します。

Magentoのメールテンプレートの構成

2箇所に分かれているメールテンプレート

Magentoのメールテンプレートは2箇所にわかれています。

  • app/locale/<言語>/template/email/以下
  • app/design/<パッケージ>/<テーマ名>/template/email/以下
  • app/design/<パッケージ>/<テーマ名>/template/bundle/email
  • app/design/<パッケージ>/<テーマ名>/template/downloadable/email

localeの下にあるものは、管理画面の「取り引きメール管理」で編集することができます。
ですから管理者の方の希望に合わせて調整が可能です。

designの下にあるものはテンプレートの一部として扱われているため、管理画面から編集することができません。
都度ファイルを開いて編集する必要があります。

商品情報を出しているテンプレート

design配下にあるテンプレートは、以下のような構成になっています。

app/design/frontend/base/default/template/email/
├── order
│   ├── creditmemo
│   │    └── items.phtml
│   ├── invoice
│   │    └── items.phtml
│   ├── items
│   │    ├── creditmemo
│   │    │    └── default.phtml
│   │    ├── invoice
│   │    │    └── default.phtml
│   │    ├── order
│   │    │    └── default.phtml
│   │    └── shipment
│   │          └── default.phtml
│   ├── items.phtml
│   └── shipment
│         ├── items.phtml
│         └── track.phtml
└── productalert
      ├── price.phtml
      └── stock.phtml

このなかで、商品情報を表示するために使っているテンプレートは、

app/design/frontend/base/default/template/email/order/items/
├── creditmemo
│    └── default.phtml
├── invoice
│    └── default.phtml
├── order
│    └── default.phtml
└── shipment
      └── default.phtml

と、実は4つのテンプレートだけなのです。これはbundle以下とdownloadable以下もほぼ同じです。
これらのテンプレートに手を入れて、商品画像を表示できるようにしてみましょう。

商品情報を出しているテンプレートのカスタマイズ

では、商品画像をメール文面上に掲載するためのカスタマイズをしてみます。
一番使用するorder用のテンプレートを開くと、比較的先頭部分に以下のような記述があります。

<?php $_item = $this->getItem() ?>
<?php $_order = $this->getItem()->getOrder() ?>
<tr>
<td align="left" valign="top" style="font-size:11px; padding:3px 9px; border-bottom:1px dotted #CCCCCC;">
<strong style="font-size:11px;"><?php echo $this->escapeHtml($_item->getName()) ?></strong>

 商品名を出している箇所がstrongタグで書かれているので、その前辺りに埋め込むことにします。

$_itemを使って商品データを取得する

$_itemは一見商品オブジェクトのように見えますが、実は商品オブジェクトではありません。注文商品のオブジェクトなので、画像データを持っていません。
多少処理コストは掛かりますが、このオブジェクトから商品オブジェクトを取得し、そこから画像ファイル名を取得します。
それには次のように書きます。

<?php
$product = Mage::getModel('catalog/product')
->setStoreId($_item->getOrder()->getStoreId())
->load($_item->getProductId());
?>

こうすることで、$productに購入した商品のオブジェクトが読み込まれます。
あとはこのオブジェクトを使って、商品画像を取得すればOKです。

商品画像を表示する

商品画像を表示するには、商品一覧などのテンプレートを参考にするとよいでしょう。
記述例を以下に示します。 

<img src="<?php echo Mage::helper('catalog/image')->init($product, 'image')->resize(50); ?>" width="50" height="50" alt="" />

Mage_CatalogモジュールのHelperにある、Imageヘルパーを呼び出して、商品画像のリサイズを行います。
あとは画像と商品名がうまく出るようにHTMLとスタイル定義を追加しておきます。 

送信テスト

最後に送信テストを行います。
Magento1.8.1では1件の注文に対し、2回以上注文メールを送信できないため、テストがやや面倒です。
きちんと修正ができていれば、以下のようにメールが変わると思います。

修正後

まとめ

まとめると、

  • Magentoの注文メールは基本HTML形式
  • 商品画像をメールに記載するには、テンプレートのカスタマイズが必要
  • app/design/frontend/base/default/template/email/order/items/などにあるファイルを編集すれば対応可能
  • $_itemから商品データを取得し、画像を表示する必要あり

というようになります。
そんなに難しい修正でもないので、HTMLでメールを送信されている方はトライしてみてはいかがでしょうか?