source: branches/version-2_12-dev/data/class/helper/SC_Helper_Mail.php @ 21684

Revision 21684, 18.3 KB checked in by Seasoft, 12 years ago (diff)

#1613 (typo修正・ソース整形・ソースコメントの改善)

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24/**
25 * メール関連 のヘルパークラス.
26 *
27 * @package Helper
28 * @author LOCKON CO.,LTD.
29 * @version $Id$
30 */
31class SC_Helper_Mail {
32
33    /** メールテンプレートのパス */
34    var $arrMAILTPLPATH;
35
36    /**
37     * コンストラクタ.
38     */
39    function SC_Helper_Mail() {
40        $masterData = new SC_DB_MasterData_Ex();
41        $this->arrMAILTPLPATH =  $masterData->getMasterData('mtb_mail_tpl_path');
42        $this->arrPref = $masterData->getMasterData('mtb_pref');
43    }
44
45    /* DBに登録されたテンプレートメールの送信 */
46    function sfSendTemplateMail($to, $to_name, $template_id, &$objPage, $from_address = '', $from_name = '', $reply_to = '', $bcc = '') {
47
48        $objQuery = new SC_Query_Ex();
49        // メールテンプレート情報の取得
50        $where = 'template_id = ?';
51        $arrRet = $objQuery->select('subject, header, footer', 'dtb_mailtemplate', $where, array($template_id));
52        $objPage->tpl_header = $arrRet[0]['header'];
53        $objPage->tpl_footer = $arrRet[0]['footer'];
54        $tmp_subject = $arrRet[0]['subject'];
55
56        $arrInfo = SC_Helper_DB_Ex::sfGetBasisData();
57
58        $objMailView = new SC_SiteView_Ex();
59        // メール本文の取得
60        $objMailView->assignobj($objPage);
61        $body = $objMailView->fetch($this->arrMAILTPLPATH[$template_id]);
62
63        // メール送信処理
64        $objSendMail = new SC_SendMail_Ex();
65        if ($from_address == '') $from_address = $arrInfo['email03'];
66        if ($from_name == '') $from_name = $arrInfo['shop_name'];
67        if ($reply_to == '') $reply_to = $arrInfo['email03'];
68        $error = $arrInfo['email04'];
69        $tosubject = $this->sfMakeSubject($tmp_subject, $objMailView);
70
71        $objSendMail->setItem('', $tosubject, $body, $from_address, $from_name, $reply_to, $error, $error, $bcc);
72        $objSendMail->setTo($to, $to_name);
73        $objSendMail->sendMail();    // メール送信
74    }
75
76    /* 受注完了メール送信 */
77    function sfSendOrderMail($order_id, $template_id, $subject = '', $header = '', $footer = '', $send = true) {
78
79        $arrTplVar = new stdClass();
80        $arrInfo = SC_Helper_DB_Ex::sfGetBasisData();
81        $arrTplVar->arrInfo = $arrInfo;
82
83        $objQuery = new SC_Query_Ex();
84
85        if ($subject == '' && $header == '' && $footer == '') {
86            // メールテンプレート情報の取得
87            $where = 'template_id = ?';
88            $arrRet = $objQuery->select('subject, header, footer', 'dtb_mailtemplate', $where, array($template_id));
89            $arrTplVar->tpl_header = $arrRet[0]['header'];
90            $arrTplVar->tpl_footer = $arrRet[0]['footer'];
91            $tmp_subject = $arrRet[0]['subject'];
92        } else {
93            $arrTplVar->tpl_header = $header;
94            $arrTplVar->tpl_footer = $footer;
95            $tmp_subject = $subject;
96        }
97
98        // 受注情報の取得
99        $where = 'order_id = ?';
100        $arrRet = $objQuery->select('*', 'dtb_order', $where, array($order_id));
101        $arrOrder = $arrRet[0];
102        $objQuery->setOrder('order_detail_id');
103        $arrTplVar->arrOrderDetail = $objQuery->select('*', 'dtb_order_detail', $where, array($order_id));
104
105        $objProduct = new SC_Product_Ex();
106        $objQuery->setOrder('shipping_id');
107        $arrRet = $objQuery->select('*', 'dtb_shipping', 'order_id = ?', array($order_id));
108        foreach (array_keys($arrRet) as $key) {
109            $objQuery->setOrder('shipping_id');
110            $arrItems = $objQuery->select('*', 'dtb_shipment_item', 'order_id = ? AND shipping_id = ?',
111                                          array($order_id, $arrRet[$key]['shipping_id']));
112            foreach ($arrItems as $itemKey => $arrDetail) {
113                foreach ($arrDetail as $detailKey => $detailVal) {
114                    $arrRet[$key]['shipment_item'][$arrDetail['product_class_id']][$detailKey] = $detailVal;
115                }
116
117                $arrRet[$key]['shipment_item'][$arrDetail['product_class_id']]['productsClass'] =& $objProduct->getDetailAndProductsClass($arrDetail['product_class_id']);
118            }
119        }
120        $arrTplVar->arrShipping = $arrRet;
121
122        $arrTplVar->Message_tmp = $arrOrder['message'];
123
124        // 会員情報の取得
125        $customer_id = $arrOrder['customer_id'];
126        $objQuery->setOrder('customer_id');
127        $arrRet = $objQuery->select('point', 'dtb_customer', 'customer_id = ?', array($customer_id));
128        $arrCustomer = isset($arrRet[0]) ? $arrRet[0] : '';
129
130        $arrTplVar->arrCustomer = $arrCustomer;
131        $arrTplVar->arrOrder = $arrOrder;
132
133        //その他決済情報
134        if ($arrOrder['memo02'] != '') {
135            $arrOther = unserialize($arrOrder['memo02']);
136
137            foreach ($arrOther as $other_key => $other_val) {
138                if (SC_Utils_Ex::sfTrim($other_val['value']) == '') {
139                    $arrOther[$other_key]['value'] = '';
140                }
141            }
142
143            $arrTplVar->arrOther = $arrOther;
144        }
145
146        // 都道府県変換
147        $arrTplVar->arrPref = $this->arrPref;
148
149        $objCustomer = new SC_Customer_Ex();
150        $arrTplVar->tpl_user_point = $objCustomer->getValue('point');
151
152        if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE) {
153            $objMailView = new SC_MobileView_Ex();
154        } else {
155            $objMailView = new SC_SiteView_Ex();
156        }
157        // メール本文の取得
158        $objMailView->assignobj($arrTplVar);
159        $body = $objMailView->fetch($this->arrMAILTPLPATH[$template_id]);
160
161        // メール送信処理
162        $objSendMail = new SC_SendMail_Ex();
163        $bcc = $arrInfo['email01'];
164        $from = $arrInfo['email03'];
165        $error = $arrInfo['email04'];
166        $tosubject = $this->sfMakeSubject($tmp_subject, $objMailView);
167
168        $objSendMail->setItem('', $tosubject, $body, $from, $arrInfo['shop_name'], $from, $error, $error, $bcc);
169        $objSendMail->setTo($arrOrder['order_email'], $arrOrder['order_name01'] . ' '. $arrOrder['order_name02'] .' 様');
170
171        // 送信フラグ:trueの場合は、送信する。
172        if ($send) {
173            if ($objSendMail->sendMail()) {
174                $this->sfSaveMailHistory($order_id, $template_id, $tosubject, $body);
175            }
176        }
177
178        return $objSendMail;
179    }
180
181    // テンプレートを使用したメールの送信
182    function sfSendTplMail($to, $tmp_subject, $tplpath, &$objPage) {
183        $objMailView = new SC_SiteView_Ex();
184        $arrInfo = SC_Helper_DB_Ex::sfGetBasisData();
185        // メール本文の取得
186        $objPage->tpl_shopname=$arrInfo['shop_name'];
187        $objPage->tpl_infoemail = $arrInfo['email02'];
188        $objMailView->assignobj($objPage);
189        $body = $objMailView->fetch($tplpath);
190        // メール送信処理
191        $objSendMail = new SC_SendMail_Ex();
192        $bcc = $arrInfo['email01'];
193        $from = $arrInfo['email03'];
194        $error = $arrInfo['email04'];
195        $tosubject = $this->sfMakeSubject($tmp_subject, $objMailView);
196
197        $objSendMail->setItem($to, $tosubject, $body, $from, $arrInfo['shop_name'], $from, $error, $error, $bcc);
198        $objSendMail->sendMail();
199    }
200
201    // 通常のメール送信
202    function sfSendMail($to, $tmp_subject, $body) {
203        $arrInfo = SC_Helper_DB_Ex::sfGetBasisData();
204        // メール送信処理
205        $objSendMail = new SC_SendMail_Ex();
206        $bcc = $arrInfo['email01'];
207        $from = $arrInfo['email03'];
208        $error = $arrInfo['email04'];
209        $tosubject = $this->sfMakeSubject($tmp_subject);
210
211        $objSendMail->setItem($to, $tosubject, $body, $from, $arrInfo['shop_name'], $from, $error, $error, $bcc);
212        $objSendMail->sendMail();
213    }
214
215    //件名にテンプレートを用いる
216    function sfMakeSubject($subject, &$objMailView) {
217        if (empty($objMailView)) {
218            $objMailView = new SC_SiteView_Ex();
219        }
220        $objTplAssign = new stdClass;
221
222        $arrInfo = SC_Helper_DB_Ex::sfGetBasisData();
223        $objTplAssign->tpl_shopname=$arrInfo['shop_name'];
224        $objTplAssign->tpl_infoemail=$subject; // 従来互換
225        $objTplAssign->tpl_mailtitle=$subject;
226        $objMailView->assignobj($objTplAssign);
227        $subject = $objMailView->fetch('mail_templates/mail_title.tpl');
228        return $subject;
229    }
230
231    // メール配信履歴への登録
232    function sfSaveMailHistory($order_id, $template_id, $subject, $body) {
233        $sqlval['subject'] = $subject;
234        $sqlval['order_id'] = $order_id;
235        $sqlval['template_id'] = $template_id;
236        $sqlval['send_date'] = 'CURRENT_TIMESTAMP';
237        if (!isset($_SESSION['member_id'])) $_SESSION['member_id'] = '';
238        if ($_SESSION['member_id'] != '') {
239            $sqlval['creator_id'] = $_SESSION['member_id'];
240        } else {
241            $sqlval['creator_id'] = '0';
242        }
243        $sqlval['mail_body'] = $body;
244
245        $objQuery = new SC_Query_Ex();
246        $sqlval['send_id'] = $objQuery->nextVal('dtb_mail_history_send_id');
247        $objQuery->insert('dtb_mail_history', $sqlval);
248    }
249
250    /* 会員登録があるかどうかのチェック(仮会員を含まない) */
251    function sfCheckCustomerMailMaga($email) {
252        $col = 'email, mailmaga_flg, customer_id';
253        $from = 'dtb_customer';
254        $where = '(email = ? OR email_mobile = ?) AND status = 2 AND del_flg = 0';
255        $objQuery = new SC_Query_Ex();
256        $arrRet = $objQuery->select($col, $from, $where, array($email));
257        // 会員のメールアドレスが登録されている
258        if (!empty($arrRet[0]['customer_id'])) {
259            return true;
260        }
261        return false;
262    }
263
264    /**
265     * 登録メールを送信する。
266     *
267     * @param string $secret_key 会員固有キー
268     * @param integer $customer_id 会員ID
269     * @param boolean $is_mobile false(default):PCアドレスにメールを送る true:携帯アドレスにメールを送る
270     * @return boolean true:成功 false:失敗
271     */
272    function sfSendRegistMail($secret_key, $customer_id = '', $is_mobile = false) {
273        // 会員データの取得
274        if (SC_Utils_Ex::sfIsInt($customer_id)) {
275            $arrCustomerData = SC_Helper_Customer_Ex::sfGetCustomerDataFromId($customer_id);
276        } else {
277            $arrCustomerData = SC_Helper_Customer_Ex::sfGetCustomerDataFromId('', 'secret_key = ?', array($secret_key));
278        }
279        if (SC_Utils_Ex::isBlank($arrCustomerData)) {
280            return false;
281        }
282
283        $CONF = SC_Helper_DB_Ex::sfGetBasisData();
284
285        $objMailText = new SC_SiteView_Ex();
286        $objMailText->assign('CONF', $CONF);
287        $objMailText->assign('name01', $arrCustomerData['name01']);
288        $objMailText->assign('name02', $arrCustomerData['name02']);
289        $objMailText->assign('uniqid', $arrCustomerData['secret_key']);
290        $objMailText->assignobj($arrCustomerData);
291        $objMailText->assignobj($this);
292
293        $objHelperMail  = new SC_Helper_Mail_Ex();
294
295        // 仮会員が有効の場合
296        if (CUSTOMER_CONFIRM_MAIL == true and $arrCustomerData['status'] == 1) {
297            $subject        = $objHelperMail->sfMakeSubject('会員登録のご確認', $objMailText);
298            $toCustomerMail = $objMailText->fetch('mail_templates/customer_mail.tpl');
299        } else {
300            $subject        = $objHelperMail->sfMakeSubject('会員登録のご完了', $objMailText);
301            $toCustomerMail = $objMailText->fetch('mail_templates/customer_regist_mail.tpl');
302        }
303
304        $objMail = new SC_SendMail();
305        $objMail->setItem(
306            ''                    // 宛先
307            , $subject              // サブジェクト
308            , $toCustomerMail       // 本文
309            , $CONF['email03']      // 配送元アドレス
310            , $CONF['shop_name']    // 配送元 名前
311            , $CONF['email03']      // reply_to
312            , $CONF['email04']      // return_path
313            , $CONF['email04']      // Errors_to
314            , $CONF['email01']      // Bcc
315        );
316        // 宛先の設定
317        if ($is_mobile) {
318            $to_addr = $arrCustomerData['email_mobile'];
319        } else {
320            $to_addr = $arrCustomerData['email'];
321        }
322        $objMail->setTo($to_addr, $arrCustomerData['name01'] . $arrCustomerData['name02'] .' 様');
323
324        $objMail->sendMail();
325        return true;
326    }
327
328    /**
329     * 保存されているメルマガテンプレートの取得
330     * @param integer 特定IDのテンプレートを取り出したい時はtemplate_idを指定。未指定時は全件取得
331     * @return array メールテンプレート情報を格納した配列
332     * @todo   表示順も引数で変更できるように
333     */
334    function sfGetMailmagaTemplate($template_id = null) {
335        // 初期化
336        $where = '';
337        $objQuery =& SC_Query_Ex::getSingletonInstance();
338
339        // 条件文
340        $where = 'del_flg = ?';
341        $arrValues[] = 0;
342        //template_id指定時
343        if (SC_Utils_Ex::sfIsInt($template_id) === true) {
344            $where .= ' AND template_id = ?';
345            $arrValues[] = $template_id;
346        }
347
348        // 表示順
349        $objQuery->setOrder('create_date DESC');
350
351        $arrResults = $objQuery->select('*', 'dtb_mailmaga_template', $where, $arrValues);
352        return $arrResults;
353    }
354
355    /**
356     * 保存されているメルマガ送信履歴の取得
357     * @param integer 特定の送信履歴を取り出したい時はsend_idを指定。未指定時は全件取得
358     * @return array 送信履歴情報を格納した配列
359     */
360    function sfGetSendHistory($send_id = null) {
361        // 初期化
362        $where = '';
363        $objQuery =& SC_Query_Ex::getSingletonInstance();
364
365        // 条件文
366        $where = 'del_flg = ?';
367        $arrValues[] = 0;
368
369        //send_id指定時
370        if (SC_Utils_Ex::sfIsInt($send_id) === true) {
371            $where .= ' AND send_id = ?';
372            $arrValues[] = $send_id;
373        }
374
375        // 表示順
376        $objQuery->setOrder('create_date DESC');
377
378        $arrResults = $objQuery->select('*', 'dtb_send_history', $where, $arrValues);
379        return $arrResults;
380    }
381
382    /**
383     * 指定したIDのメルマガ配送を行う
384     *
385     * @param integer $send_id dtb_send_history の情報
386     * @return void
387     */
388    function sfSendMailmagazine($send_id) {
389        $objQuery =& SC_Query_Ex::getSingletonInstance();
390        $objDb = new SC_Helper_DB_Ex();
391        $objSite = $objDb->sfGetBasisData();
392        $objMail = new SC_SendMail_Ex();
393
394        $where = 'del_flg = 0 AND send_id = ?';
395        $arrMail = $objQuery->getRow('*', 'dtb_send_history', $where, array($send_id));
396
397        // 対象となる$send_idが見つからない
398        if (SC_Utils_Ex::isBlank($arrMail)) return;
399
400        // 送信先リストの取得
401        $arrDestinationList = $objQuery->select(
402            '*',
403            'dtb_send_customer',
404            'send_id = ? AND (send_flag = 2 OR send_flag IS NULL)',
405            array($send_id)
406        );
407
408        // 現在の配信数
409        $complete_count = $arrMail['complete_count'];
410        if (SC_Utils_Ex::isBlank($arrMail)) {
411            $complete_count = 0;
412        }
413
414        foreach ($arrDestinationList as $arrDestination) {
415
416            // お名前の変換
417            $customerName = trim($arrDestination['name']);
418            $subjectBody = preg_replace('/{name}/', $customerName, $arrMail['subject']);
419            $mailBody = preg_replace('/{name}/', $customerName, $arrMail['body']);
420
421            $objMail->setItem(
422                $arrDestination['email'],
423                $subjectBody,
424                $mailBody,
425                $objSite['email03'],      // 送信元メールアドレス
426                $objSite['shop_name'],    // 送信元名
427                $objSite['email03'],      // reply_to
428                $objSite['email04'],      // return_path
429                $objSite['email04']       // errors_to
430            );
431
432            // テキストメール配信の場合
433            if ($arrMail['mail_method'] == 2) {
434                $sendResut = $objMail->sendMail();
435            // HTMLメール配信の場合
436            } else {
437                $sendResut = $objMail->sendHtmlMail();
438            }
439
440            // 送信完了なら1、失敗なら2をメール送信結果フラグとしてDBに挿入
441            if (!$sendResut) {
442                $sendFlag = '2';
443            } else {
444                // 完了を 1 増やす
445                $sendFlag = '1';
446                $complete_count++;
447            }
448
449            // 送信結果情報を更新
450            $objQuery->update('dtb_send_customer',
451                              array('send_flag'=>$sendFlag),
452                              'send_id = ? AND customer_id = ?',
453                              array($send_id,$arrDestination['customer_id']));
454        }
455
456        // メール全件送信完了後の処理
457        $objQuery->update('dtb_send_history',
458                          array('end_date'=>'CURRENT_TIMESTAMP', 'complete_count'=>$complete_count),
459                          'send_id = ?',
460                          array($send_id));
461
462        // 送信完了 報告メール
463        $compSubject = date('Y年m月d日H時i分') . '  下記メールの配信が完了しました。';
464        // 管理者宛に変更
465        $objMail->setTo($objSite['email03']);
466        $objMail->setSubject($compSubject);
467
468        // テキストメール配信の場合
469        if ($arrMail['mail_method'] == 2) {
470            $sendResut = $objMail->sendMail();
471        // HTMLメール配信の場合
472        } else {
473            $sendResut = $objMail->sendHtmlMail();
474        }
475        return;
476    }
477}
Note: See TracBrowser for help on using the repository browser.