ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/trunk/webapp/lib/mail/sns.php @ 6448

Last change on this file since 6448 was 6448, checked in by ebihara, 12 years ago

#2179:merged r6244, r6403 (thanks to toraneko)

File size: 22.1 KB
Line 
1<?php
2/**
3 * @copyright 2005-2008 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7class mail_sns
8{
9    var $decoder;
10    var $from;
11    var $to;
12
13    var $c_member_id;
14
15    function mail_sns(&$decoder)
16    {
17        $this->decoder =& $decoder;
18        $this->from = $decoder->get_from();
19        $this->to = $decoder->get_to();
20
21        $this->c_member_id = do_common_c_member_id4ktai_address($this->from);
22
23        // メンバーIDが見つからない場合は、ローカルパートに二重引用符を付加してリトライ
24        if (!$this->c_member_id) {
25            list($local, $domain) = explode('@', $this->from, 2);
26            $this->c_member_id = do_common_c_member_id4ktai_address('"' . $local . '"' . '@' . $domain);
27        }
28    }
29
30    function main()
31    {
32        $matches = array();
33        list($from_user, $from_host) = explode('@', $this->from, 2);
34        list($to_user, $to_host) = explode('@', $this->to, 2);
35
36        // メンテナンスモード
37        if (OPENPNE_UNDER_MAINTENANCE) {
38            $this->error_mail('現在メンテナンス中のため、メール投稿はおこなえません。しばらく時間を空けて再度送信してください。');
39            m_debug_log('mail_sns::main() maintenance mode');
40            return false;
41        }
42
43        // from_host が携帯ドメイン以外はエラー
44        if (!is_ktai_mail_address($this->from)) {
45            m_debug_log('mail_sns::main() from wrong host');
46            return false;
47        }
48
49        if (MAIL_ADDRESS_PREFIX) {
50            if (strpos($to_user, MAIL_ADDRESS_PREFIX) === 0) {
51                $to_user = substr($to_user, strlen(MAIL_ADDRESS_PREFIX));
52            }
53        }
54
55        if (!$this->c_member_id) {
56            // 送信者がSNSメンバーでない場合
57
58            if (!IS_CLOSED_SNS) {
59                // get 新規登録
60                if ($to_user == 'get') {
61                    // アフィリエイトIDが付いている場合
62                    $body = $this->decoder->get_text_body();
63
64                    m_debug_log('mail_sns::regist_get()', PEAR_LOG_INFO);
65                    return $this->regist_get($body);
66                }
67            }
68
69            m_debug_log('mail_sns::main() action not found');
70            return false;
71        }
72
73        //---
74
75        // ログインURL通知
76        if ($to_user == 'get') {
77            m_debug_log('mail_sns::login_get()', PEAR_LOG_INFO);
78            return $this->login_get();
79        }
80
81        //---
82
83        // コミュニティ掲示板投稿
84        elseif (
85            preg_match('/^t(\d+)$/', $to_user, $matches) ||
86            preg_match('/^t(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
87        ) {
88
89            // トピックIDのチェック
90            if (!$c_commu_topic_id = $matches[1]) {
91                return false;
92            }
93
94            if (MAIL_ADDRESS_HASHED) {
95                if (empty($matches[2])) return false;
96
97                // メンバーハッシュのチェック
98                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
99                    return false;
100                }
101            }
102
103            m_debug_log('mail_sns::add_commu_topic_comment()', PEAR_LOG_INFO);
104            return $this->add_commu_topic_comment($c_commu_topic_id);
105        }
106
107        //---
108
109        // 日記投稿
110        elseif (
111            $to_user == 'blog' ||
112            preg_match('/^b(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
113        ) {
114
115            if (MAIL_ADDRESS_HASHED) {
116                if (empty($matches[1]) || empty($matches[2])) return false;
117
118                // メンバーIDのチェック
119                if ($matches[1] != $this->c_member_id) {
120                    return false;
121                }
122                // メンバーハッシュのチェック
123                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
124                    return false;
125                }
126            }
127
128            m_debug_log('mail_sns::add_diary()', PEAR_LOG_INFO);
129            return $this->add_diary();
130        }
131
132        //---
133
134        // 日記コメント投稿
135        elseif (
136            preg_match('/^bc(\d+)$/', $to_user, $matches) ||
137            preg_match('/^bc(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
138        ) {
139
140            // 日記IDのチェック
141            if (!$c_diary_id = $matches[1]) {
142                return false;
143            }
144
145            if (MAIL_ADDRESS_HASHED) {
146                if (empty($matches[2])) return false;
147
148                // メンバーハッシュのチェック
149                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
150                    return false;
151                }
152            }
153
154            m_debug_log('mail_sns::add_diary_comment()', PEAR_LOG_INFO);
155            return $this->add_diary_comment($c_diary_id);
156        }
157
158        //---
159
160        //プロフィール写真変更
161        elseif (
162            preg_match('/^p(\d+)$/', $to_user, $matches) ||
163            preg_match('/^p(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
164        ) {
165
166            // メンバーIDのチェック
167            if ($matches[1] != $this->c_member_id) {
168                return false;
169            }
170
171            if (MAIL_ADDRESS_HASHED) {
172                if (empty($matches[2])) return false;
173
174                // メンバーハッシュのチェック
175                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
176                    return false;
177                }
178            }
179
180            m_debug_log('mail_sns::add_member_image()', PEAR_LOG_INFO);
181            return $this->add_member_image();
182        }
183
184        //---
185
186        // 日記写真変更
187        elseif (
188            preg_match('/^bi(\d+)$/', $to_user, $matches) ||
189            preg_match('/^bi(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
190        ) {
191            // 日記IDのチェック
192            if (!$c_diary_id = $matches[1]) {
193                return false;
194            }
195
196            if (MAIL_ADDRESS_HASHED) {
197                if (empty($matches[2])) return false;
198
199                // メンバーハッシュのチェック
200                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
201                    return false;
202                }
203            }
204
205            m_debug_log('mail_sns::add_diary_image()', PEAR_LOG_INFO);
206            return $this->add_diary_image($c_diary_id);
207        }
208
209        //---
210
211        // コミュニティ写真変更
212        elseif (
213            preg_match('/^ci(\d+)$/', $to_user, $matches) ||
214            preg_match('/^ci(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
215        ) {
216            // コミュニティIDのチェック
217            if (!$c_commu_id = $matches[1]) {
218                return false;
219            }
220
221            if (MAIL_ADDRESS_HASHED) {
222                if (empty($matches[2])) return false;
223
224                // メンバーハッシュのチェック
225                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
226                    return false;
227                }
228            }
229
230            m_debug_log('mail_sns::add_commu_image()', PEAR_LOG_INFO);
231            return $this->add_commu_image($c_commu_id);
232        }
233
234        //---
235
236        // トピック・イベント写真変更
237        elseif (
238            preg_match('/^ti(\d+)$/', $to_user, $matches) ||
239            preg_match('/^ti(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
240        ) {
241            // トピックIDのチェック
242            if (!$c_commu_topic_id = $matches[1]) {
243                return false;
244            }
245
246            if (MAIL_ADDRESS_HASHED) {
247                if (empty($matches[2])) return false;
248
249                // メンバーハッシュのチェック
250                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
251                    return false;
252                }
253            }
254
255            m_debug_log('mail_sns::add_topic_image()', PEAR_LOG_INFO);
256            return $this->add_topic_image($c_commu_topic_id);
257        }
258
259        m_debug_log('mail_sns::main() action not found(member)');
260        return false;
261    }
262
263    /**
264     * 新規登録のURL取得
265     */
266    function regist_get($aff_id)
267    {
268        // 招待者は c_member_id = 1 (固定)
269        $c_member_id_invite = 1;
270
271        // _pre に追加
272        $session = create_hash();
273        mail_insert_c_member_ktai_pre($session, $this->from, $c_member_id_invite);
274
275        do_common_send_mail_regist_get($session, $this->from, $aff_id);
276        return true;
277    }
278
279    /**
280     * ログインページのURL取得
281     */
282    function login_get()
283    {
284        do_mail_sns_login_get_mail_send($this->c_member_id, $this->from);
285        return true;
286    }
287
288    /**
289     * コミュニティ掲示板投稿
290     */
291    function add_commu_topic_comment($c_commu_topic_id)
292    {
293        if (!$topic = mail_c_commu_topic4c_commu_topic_id($c_commu_topic_id)) {
294            return false;
295        }
296
297        $c_commu_id = $topic['c_commu_id'];
298        if (!_db_is_c_commu_member($c_commu_id, $this->c_member_id)) {
299            $this->error_mail(WORD_COMMUNITY . 'に参加していないため投稿できませんでした。');
300            m_debug_log('mail_sns::add_commu_topic_comment() not a member');
301            return false;
302        }
303
304        $body = $this->decoder->get_text_body();
305        if ($body === '') {
306            $this->error_mail('本文が空のため投稿できませんでした。');
307            m_debug_log('mail_sns::add_commu_topic_comment() body is empty');
308            return false;
309        }
310
311        // 書き込みをDBに追加
312        $ins_id = db_commu_insert_c_commu_topic_comment($c_commu_id, $topic['c_commu_topic_id'], $this->c_member_id, $body);
313
314        // 写真登録
315        $images = $this->decoder->get_images();
316        $image_num = 1;
317        foreach ($images as $image) {
318            $image_ext = $image['ext'];
319            $image_data = $image['data'];
320            $filename = 'tc_' . $ins_id . '_' . $image_num . '_' . time() . '.' . $image_ext;
321
322            db_image_insert_c_image($filename, $image_data);
323            mail_update_c_commu_topic_comment_image($ins_id, $filename, $image_num);
324            $image_num++;
325            if ($image_num > 3) {
326                break;
327            }
328        }
329
330        //お知らせメール送信(携帯へ)
331        send_bbs_info_mail($ins_id, $this->c_member_id);
332        //お知らせメール送信(PCへ)
333        send_bbs_info_mail_pc($ins_id, $this->c_member_id);
334
335        if (OPENPNE_USE_POINT_RANK) {
336            //トピック・イベントにコメントした人にポイント付与
337            $point = db_action_get_point4c_action_id(11);
338            db_point_add_point($this->c_member_id, $point);
339        }
340
341        return true;
342    }
343
344    /**
345     * 日記投稿
346     */
347    function add_diary()
348    {
349        $subject = $this->decoder->get_subject();
350        $body    = $this->decoder->get_text_body();
351
352        if ($subject === '') {
353            $subject = '無題';
354        }
355        if ($body === '') {
356            $this->error_mail('本文が空のため投稿できませんでした');
357            m_debug_log('mail_sns::add_diary() body is empty');
358            return false;
359        }
360
361        $c_member = db_common_c_member4c_member_id($this->c_member_id);
362        if (!$ins_id = db_diary_insert_c_diary($this->c_member_id, $subject, $body, $c_member['public_flag_diary'])) {
363            return false;
364        }
365
366        // 写真登録
367        $images = $this->decoder->get_images();
368        $image_num = 1;
369        foreach ($images as $image) {
370            $image_ext = $image['ext'];
371            $image_data = $image['data'];
372            $filename = 'd_' . $ins_id . '_' . $image_num . '_' . time() . '.' . $image_ext;
373
374            db_image_insert_c_image($filename, $image_data);
375            db_diary_update_c_diary_image_filename($ins_id, $filename, $image_num);
376            $image_num++;
377            if ($image_num > 3) {
378                break;
379            }
380        }
381
382        if (OPENPNE_USE_POINT_RANK) {
383            //日記を書いた人にポイント付与
384            $point = db_action_get_point4c_action_id(4);
385            db_point_add_point($this->c_member_id, $point);
386        }
387
388        return true;
389    }
390
391    /**
392     * 日記コメント投稿
393     */
394    function add_diary_comment($c_diary_id)
395    {
396        //--- 権限チェック
397
398        $c_diary = db_diary_get_c_diary4id($c_diary_id);
399        $target_c_member_id = $c_diary['c_member_id'];
400        $target_c_member = db_member_c_member4c_member_id($target_c_member_id);
401
402        if ($this->c_member_id != $target_c_member_id) {
403            // check public_flag
404            if (!pne_check_diary_public_flag($c_diary_id, $this->c_member_id)) {
405                $this->error_mail(WORD_DIARY . 'にアクセスできないため投稿できませんでした。');
406                m_debug_log('mail_sns::add_diary_comment() not a member');
407                return false;
408            }
409            //アクセスブロック設定
410            if (db_member_is_access_block($this->c_member_id, $target_c_member_id)) {
411                $this->error_mail(WORD_DIARY . 'にアクセスできないため投稿できませんでした。');
412                m_debug_log('mail_sns::add_diary_comment() access block');
413                return false;
414            }
415        }
416        //---
417
418        $body = $this->decoder->get_text_body();
419        if ($body === '') {
420            $this->error_mail('本文が空のため投稿できませんでした。');
421            m_debug_log('mail_sns::add_diary_comment() body is empty');
422            return false;
423        }
424
425        //日記コメント書き込み
426        $ins_id = db_diary_insert_c_diary_comment($this->c_member_id, $c_diary_id, $body);
427
428        // 写真登録
429        $images = $this->decoder->get_images();
430        $image_num = 1;
431        $filenames = array(1 => '', 2 => '', 3 => '');
432        foreach ($images as $image) {
433            $image_ext = $image['ext'];
434            $image_data = $image['data'];
435            $filename = 'dc_' . $ins_id . '_' . $image_num . '_' . time() . '.' . $image_ext;
436
437            db_image_insert_c_image($filename, $image_data);
438            $filenames[$image_num] = $filename;
439            $image_num++;
440            if ($image_num > 3) {
441                break;
442            }
443        }
444        db_diary_insert_c_diary_comment_images($ins_id, $filenames[1], $filenames[2], $filenames[3]);
445
446        //お知らせメール送信(携帯へ)
447        if ($this->c_member_id != $target_c_member_id) {
448            send_diary_comment_info_mail($ins_id, $this->c_member_id);
449        }
450
451        //日記コメントが書き込まれたので日記自体を未読扱いにする
452        if ($this->c_member_id != $target_c_member_id) {
453            db_diary_update_c_diary_is_checked($c_diary_id, 0);
454        }
455
456        if (OPENPNE_USE_POINT_RANK) {
457            // コメント者と被コメント者が違う場合にポイント加算
458            if ($this->c_member_id != $target_c_member_id) {
459                //書いた人にポイント付与
460                $point = db_action_get_point4c_action_id(3);
461                db_point_add_point($this->c_member_id, $point);
462
463                //書かれた人にポイント付与
464                $point = db_action_get_point4c_action_id(2);
465                db_point_add_point($target_c_member_id, $point);
466            }
467        }
468
469        return true;
470    }
471
472    /**
473     * プロフィール写真変更
474     */
475    function add_member_image()
476    {
477        $c_member = db_common_c_member4c_member_id($this->c_member_id);
478
479        // 登録する写真番号(1-3)を決める
480        $target_number = 0;
481        if ($c_member['image_filename']) {
482            if (!$c_member['image_filename_1']) {
483                $target_number = 1;
484            } elseif (!$c_member['image_filename_2']) {
485                $target_number = 2;
486            } elseif (!$c_member['image_filename_3']) {
487                $target_number = 3;
488            } else {
489                $this->error_mail('プロフィール写真の登録は最大3枚までです。');
490                m_debug_log('mail_sns::add_diary() image is full');
491                return false;
492            }
493        } else {
494            $target_number = 1;
495        }
496
497        // 写真登録
498        if ($images = $this->decoder->get_images()) {
499            $image = $images[0];
500            $image_ext = $image['ext'];
501            $image_data = $image['data'];
502            $filename = 'm_' . $this->c_member_id . '_' . time() . '.' . $image_ext;
503
504            db_image_insert_c_image($filename, $image_data);
505            mail_update_c_member_image($this->c_member_id, $filename, $target_number);
506            return true;
507        } else {
508            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
509            m_debug_log('mail_sns::add_member_image() no images');
510            return false;
511        }
512    }
513
514    /**
515     * 日記写真変更
516     */
517    function add_diary_image($c_diary_id)
518    {
519        if (!$c_diary = db_diary_get_c_diary4id($c_diary_id)) {
520            return false;
521        }
522
523        if ($c_diary['c_member_id'] != $this->c_member_id) {
524            return false;
525        }
526
527        // 登録する写真番号(1-3)を決める
528        $target_number = 0;
529        if ($c_diary['image_filename_1'] || $c_diary['image_filename_2'] || $c_diary['image_filename_3']) {
530            if (!$c_diary['image_filename_1']) {
531                $target_number = 1;
532            } elseif (!$c_diary['image_filename_2']) {
533                $target_number = 2;
534            } elseif (!$c_diary['image_filename_3']) {
535                $target_number = 3;
536            } else {
537                $this->error_mail(WORD_DIARY . '写真の登録は最大3枚までです。');
538                m_debug_log('mail_sns::add_diary_image() image is full');
539                return false;
540            }
541        } else {
542            $target_number = 1;
543        }
544
545        // 写真登録
546        if ($images = $this->decoder->get_images()) {
547            $image = $images[0];
548            $image_ext = $image['ext'];
549            $image_data = $image['data'];
550            $filename = 'd_' . $c_diary_id . '_' . $target_number . '_' . time() . '.' . $image_ext;
551            db_image_insert_c_image($filename, $image_data);
552            db_diary_update_c_diary_image_filename($c_diary_id, $filename, $target_number);
553            return true;
554        } else {
555            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
556            m_debug_log('mail_sns::add_diary_image() no images');
557            return false;
558        }
559    }
560
561    /**
562     * コミュニティ写真変更
563     */
564    function add_commu_image($c_commu_id)
565    {
566        if (!$c_commu = db_commu_c_commu4c_commu_id($c_commu_id)) {
567            return false;
568        }
569
570        if ($c_commu['c_member_id_admin'] != $this->c_member_id && $c_commu['c_member_id_sub_admin'] != $this->c_member_id ) {
571            return false;
572        }
573
574        if ($c_commu['image_filename']) {
575            $this->error_mail(WORD_COMMUNITY . '写真の登録は最大1枚までです。');
576            m_debug_log('mail_sns::add_commu_image() image is full');
577            return false;
578        }
579
580        // 写真登録
581        if ($images = $this->decoder->get_images()) {
582            $image = $images[0];
583            $image_ext = $image['ext'];
584            $image_data = $image['data'];
585            $filename = 'c_' . $c_commu_id . '_' .  time() . '.' . $image_ext;
586            db_image_insert_c_image($filename, $image_data);
587            db_commu_update_c_commu_image_filename($c_commu_id, $filename);
588            return true;
589        } else {
590            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
591            m_debug_log('mail_sns::add_commu_image() no images');
592            return false;
593        }
594    }
595
596    /**
597     * トピック・イベント写真変更
598     */
599    function add_topic_image($c_commu_topic_id)
600    {
601        if (!$c_topic = db_commu_c_topic4c_commu_topic_id($c_commu_topic_id)) {
602            return false;
603        }
604
605        $c_commu_id = $c_topic['c_commu_id'];
606
607        if (!db_commu_is_c_topic_admin($c_commu_topic_id, $this->c_member_id) &&
608            !db_commu_is_c_commu_admin($c_commu_id, $this->c_member_id)) {
609            return false;
610        }
611
612        // 登録する写真番号(1-3)を決める
613        $target_number = 0;
614        if ($c_topic['image_filename1'] || $c_topic['image_filename2'] || $c_topic['image_filename3']) {
615            if (!$c_topic['image_filename1']) {
616                $target_number = 1;
617            } elseif (!$c_topic['image_filename2']) {
618                $target_number = 2;
619            } elseif (!$c_topic['image_filename3']) {
620                $target_number = 3;
621            } else {
622                $this->error_mail('トピック・イベント写真の登録は最大3枚までです。');
623                m_debug_log('mail_sns::add_topic_image() image is full');
624                return false;
625            }
626        } else {
627            $target_number = 1;
628        }
629
630        // 写真登録
631        if ($images = $this->decoder->get_images()) {
632            $image = $images[0];
633            $image_ext = $image['ext'];
634            $image_data = $image['data'];
635            $filename = 't_' . $c_commu_topic_id . '_' . $target_number . '_' . time() . '.' . $image_ext;
636
637            $c_topic['image_filename' . $target_number] = $filename;
638            db_image_insert_c_image($filename, $image_data);
639            db_commu_update_c_commu_topic_comment_images($c_topic['c_commu_topic_comment_id'], $c_topic['image_filename1'], $c_topic['image_filename2'], $c_topic['image_filename3']);
640            return true;
641        } else {
642            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
643            m_debug_log('mail_sns::add_topic_image() no images');
644            return false;
645        }
646       
647    }
648
649    /**
650     * エラーメールをメール送信者へ返信
651     */
652    function error_mail($body)
653    {
654        $subject = '['.SNS_NAME.']メール投稿エラー';
655        t_send_email($this->from, $subject, $body);
656    }
657}
658
659?>
Note: See TracBrowser for help on using the repository browser.