バージョン選択

フォーラム

メニュー

オンライン状況

66 人のユーザが現在オンラインです。 (59 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 66
もっと...

サイト内検索

質問 > 管理機能 > メルマガ配信予約ができるようにしたい

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
hihi
投稿日時: 2012/9/5 21:41
対応状況: −−−
一人前
登録日: 2012/8/14
居住地:
投稿: 72
メルマガ配信予約ができるようにしたい
[EC-CUBE]2.12.1
[PHP]5.3.1
[データベース]MySQL 5.1.43
________________

メルマガ管理機能から行うメルマガ配信は、送信ボタンを押したその場で配信されます。配信メールが多いと、配信中ずっとその画面で待っていなければならないですし、今は送りたくない時(特に夜間)もあるので時間を指定してメール配信ができるように配信予約をしたいです。

メルマガのバッチ配信機能は、ECCUBU2.12.1にはデフォルトでついてない状態なので、どうしたら良いかと困っています。

どのように実現したら良いのかを教えて頂ければと思います。

よろしくお願いします。
seasoft
投稿日時: 2012/9/5 22:30
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7367
Re: メルマガ配信予約ができるようにしたい
大雑把には、SC_Helper_Mail#sfSendMailmagazine の呼び出しをバッチに分離する事で実現できると思います。

GUI で配信日時指定をするような配信予約となりますと、もう少し考慮が必要かとは思いますが。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

hihi
投稿日時: 2012/9/7 9:54
対応状況: −−−
一人前
登録日: 2012/8/14
居住地:
投稿: 72
Re: メルマガ配信予約ができるようにしたい
もう少し具体的に教えて頂けると有難いのですが駄目でしょうか?
検討お願いします。

GUI で配信日時指定をするような配信予約となりますと、もう少し考慮が必要とありますが、何が必要と思われますか?

よろしくお願いします。
hihi
投稿日時: 2012/9/9 12:43
対応状況: −−−
一人前
登録日: 2012/8/14
居住地:
投稿: 72
Re: メルマガ配信予約ができるようにしたい
ECCUBU2.4以下にはGUIで配信日時指定がデフォルトでついているので、メルマガ機能だけをECCUBU2.12.1に埋め込みたいのですがそれは、可能なのでしょうか?
可能なのでしたら、対応方法などを教えて頂けると嬉しいです。
よろしくお願いいたします。
seasoft
投稿日時: 2012/9/9 19:58
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7367
Re: メルマガ配信予約ができるようにしたい
論理的には可能ですが、ページクラスの仕様変更・DB 定義の変更・定数の変更などもありますので、まんま上書きという訳にはいかず、いわゆる「移植」のような作業が必要だと思います。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

hihi
投稿日時: 2012/9/9 20:45
対応状況: 開発中
一人前
登録日: 2012/8/14
居住地:
投稿: 72
Re: メルマガ配信予約ができるようにしたい
ありがとうございます。

わかりました。
ちょっとやってみます。
hihi
投稿日時: 2012/9/11 14:23
対応状況: −−−
一人前
登録日: 2012/8/14
居住地:
投稿: 72
Re: メルマガ配信予約ができるようにしたい
いつもお世話になっております。
色々と試行錯誤をしているのですが、うまく行きません。

ページクラスの仕様変更・DB 定義の変更・定数の変更

以外にやらなくてはいけないことがあるのなら教えて頂けるとありがたいです。

どのファイルを変更なども具体的に教えて頂けると嬉しいです。

よろしくお願いします。
seasoft
投稿日時: 2012/9/11 14:37
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7367
Re: メルマガ配信予約ができるようにしたい
「うまく行きません」の具体的な状況によりましても、対処方法が変わってきます。ご参考まで。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

ゲスト
投稿日時: 2012/9/13 19:27
対応状況: −−−
Re: メルマガ配信予約ができるようにしたい
ちょっと、探ってみました。

1. 「2.4.4」での動作を再度確認
2. 「2.12-dev」でのメールマガジンの実装を調査
3. fml(メーリングソフト)の経験から、メールマガジン予約配信に必要な要件を想定
 1)bccでsmtpへ送信
 2)エラーリターンメールの管理
 3)メールマガジンの配信状況、管理
 2.4.4では、これらは実装されておらず、2.11-dev時に、これらを実装するリソースがなく、
 未実装によるリスクの回避として、リソース待ちとなっているのでは、と、推測します。

取り敢えず、2.12-devに対して<<<以下>>>の処置にて、動作確認(試運転)したところ、
SC_Helper_Mail_Ex::sfSendMailmagazine_retry($send_id)の$send_idの狙い撃ちでの
cronでの送信は出来ました。
 
 <<<以下>>>
「regist_complete」で待機させ、cronで
  →sendmail.php
   →LC_Page_Admin_Mail_Sendmail_Ex.php
    →LC_Page_Admin_Mail_Sendmail.php
     →「retry」で、送信。。。

試運転としても、
1.$send_id
  dtb_send_customer,dtb_send_historyから未送信の$send_idを取出し、
  LC_Page_Admin_Mail_Sendmail.phpでの
  SC_Helper_Mail_Ex::sfSendMailmagazine_retry($send_id);
  を$send_id分繰り返す。
2.送信時間
 1)dtb_send_historyの「start_date」に配送希望時間を設定する様に変更。
 2)配送希望時間設定画面を追加
3.送信
 1)LC_Page_Admin_Mail_Sendmail.php実行時刻が「start_date」を超えていたら「retry」実行
 2)retryのretryは行わない、、、ステータスを3として、3は配信しない。
 の実装が必要、、、といったところでしょうか。。。
 
 基本部分の変更
 

 data/class/pages/admin/mail/LC_Page_Admin_Mail.php
 
     function action() {
            case 'regist_complete':
                $this->tpl_mainpage = 'mail/input.tpl';
                $this->lfAddParamSelectTemplate($objFormParam);
                $objFormParam->setParam($_POST);
                $this->arrErr = $objFormParam->checkError();
                if (SC_Utils_Ex::isBlank($this->arrErr)) {
                    $this->tpl_mainpage = 'mail/index.tpl';
                    
                    // ここでは、送信を止め「配信失敗」、つまりは「配信待ち」、、、とする。
                    SC_Helper_Mail_Ex::sfSendMailmagazine($this->lfRegisterData($objFormParam));  // DB登録・送信

                    SC_Response_Ex::sendRedirect('./history.php');
                }
                break;
            case 'retry':
                if (SC_Utils_Ex::sfIsInt($_GET['send_id'])) {
                
                    // 「再試行」での送信化
                    SC_Helper_Mail_Ex::sfSendMailmagazine_retry($_GET['send_id']);  // DB登録・送信

                    SC_Response_Ex::sendRedirect('./history.php');
                } else {
                    $this->tpl_onload = "window.alert('メール送信IDが正しくありません');";
                }
                break;

・本来のfunction sfSendMailmagazine($send_id) {}をfunction sfSendMailmagazine_retry($send_id) {}として複製する。
・直接送信時に「配信失敗」、つまりは「配信待ち」、、、とする。

data/class/helper/SC_Helper_Mail.php
    function sfSendMailmagazine($send_id) {
//            // テキストメール配信の場合
//            if ($arrMail['mail_method'] == 2) {
//                $sendResut = $objMail->sendMail();
//            // HTMLメール配信の場合
//            } else {
//                $sendResut = $objMail->sendHtmlMail();
//            }

            // 送信完了なら1、失敗なら2をメール送信結果フラグとしてDBに挿入
            if (!$sendResut) {
                $sendFlag = '2';
            } else {
                // 完了を 1 増やす
                $sendFlag = '1';
                $complete_count++;
            }

            // 送信結果情報を更新
            $objQuery->update('dtb_send_customer',
                              array('send_flag'=>$sendFlag),
                              'send_id = ? AND customer_id = ?',
                              array($send_id,$arrDestination['customer_id']));
        }

//        // メール全件送信完了後の処理
//        $objQuery->update('dtb_send_history',
//                          array('end_date'=>'CURRENT_TIMESTAMP', 'complete_count'=>$complete_count),
//                          'send_id = ?',
//                          array($send_id));
//
//        // 送信完了 報告メール
//        $compSubject = date('Y年m月d日H時i分') . '  下記メールの配信が完了しました。';
//        // 管理者宛に変更
//        $objMail->setTo($objSite['email03']);
//        $objMail->setSubject($compSubject);
//
//        // テキストメール配信の場合
//        if ($arrMail['mail_method'] == 2) {
//            $sendResut = $objMail->sendMail();
//        // HTMLメール配信の場合
//        } else {
//            $sendResut = $objMail->sendHtmlMail();
//        }
        return;
    }
    /**
     * retry メルマガ配送を行う
     *
     * @param integer $send_id dtb_send_history の情報
     * @return void
     */
    function sfSendMailmagazine_retry($send_id) {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $objDb = new SC_Helper_DB_Ex();
        $objSite = $objDb->sfGetBasisData();
        $objMail = new SC_SendMail_Ex();

        $where = 'del_flg = 0 AND send_id = ?';
        $arrMail = $objQuery->getRow('*', 'dtb_send_history', $where, array($send_id));

        // 対象となる$send_idが見つからない
        if (SC_Utils_Ex::isBlank($arrMail)) return;

        // 送信先リストの取得
        $arrDestinationList = $objQuery->select(
            '*',
            'dtb_send_customer',
            'send_id = ? AND (send_flag = 2 OR send_flag IS NULL)',
            array($send_id)
        );

        // 現在の配信数
        $complete_count = $arrMail['complete_count'];
        if (SC_Utils_Ex::isBlank($arrMail)) {
            $complete_count = 0;
        }

        foreach ($arrDestinationList as $arrDestination) {

            // お名前の変換
            $customerName = trim($arrDestination['name']);
            $subjectBody = preg_replace('/{name}/', $customerName, $arrMail['subject']);
            $mailBody = preg_replace('/{name}/', $customerName, $arrMail['body']);

            $objMail->setItem(
                $arrDestination['email'],
                $subjectBody,
                $mailBody,
                $objSite['email03'],      // 送信元メールアドレス
                $objSite['shop_name'],    // 送信元名
                $objSite['email03'],      // reply_to
                $objSite['email04'],      // return_path
                $objSite['email04']       // errors_to
            );

            // テキストメール配信の場合
           if ($arrMail['mail_method'] == 2) {
                $sendResut = $objMail->sendMail();
            // HTMLメール配信の場合
            } else {
                $sendResut = $objMail->sendHtmlMail();
            }

            // 送信完了なら1、失敗なら2をメール送信結果フラグとしてDBに挿入
            if (!$sendResut) {
                $sendFlag = '2';
            } else {
                // 完了を 1 増やす
                $sendFlag = '1';
                $complete_count++;
            }

            // 送信結果情報を更新
            $objQuery->update('dtb_send_customer',
                              array('send_flag'=>$sendFlag),
                              'send_id = ? AND customer_id = ?',
                              array($send_id,$arrDestination['customer_id']));
        }

        // メール全件送信完了後の処理
        $objQuery->update('dtb_send_history',
                          array('end_date'=>'CURRENT_TIMESTAMP', 'complete_count'=>$complete_count),
                          'send_id = ?',
                          array($send_id));

        // 送信完了 報告メール
        $compSubject = date('Y年m月d日H時i分') . '  下記メールの配信が完了しました。';
        // 管理者宛に変更
        $objMail->setTo($objSite['email03']);
        $objMail->setSubject($compSubject);

        // テキストメール配信の場合
        if ($arrMail['mail_method'] == 2) {
            $sendResut = $objMail->sendMail();
        // HTMLメール配信の場合
        } else {
            $sendResut = $objMail->sendHtmlMail();
        }
        return;
    }

data/class/pages/admin/mail/LC_Page_Admin_Mail.php

data/class/pages/admin/mail/LC_Page_Admin_Mail_Sendmail.phpとして複製した後

data/class/pages/admin/mail/LC_Page_Admin_Mail_Sendmail.php

        ...
        // モードによる処理切り替え
        //switch ($this->getMode()) {
        $mode = 'retry';
        switch ($mode) {
        ...
        
        ...
        case 'retry':
        //if (SC_Utils_Ex::sfIsInt($_GET['send_id'])) {
        //SC_Helper_Mail_Ex::sfSendMailmagazine_retry($_GET['send_id']);  // DB登録・送信

        // 未送信の$send_id分繰り返す必要がある。
        SC_Helper_Mail_Ex::sfSendMailmagazine_retry($send_id);

        // SC_Response_Ex::sendRedirect('./history.php');
        //} else {
        // $this->tpl_onload = "window.alert('メール送信IDが正しくありません');";
        //}
        break;
        ...


hihi
投稿日時: 2012/9/14 11:43
対応状況: −−−
一人前
登録日: 2012/8/14
居住地:
投稿: 72
Re: メルマガ配信予約ができるようにしたい
ありがとうございます。
この方法で再度挑戦してみます。
本当にありがとうございます。
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,852名です
総投稿数は109,989件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1291
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.