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

source: OpenPNE/branches/stable-2.10.x/webapp/lib/mail/sns.php @ 6930

Last change on this file since 6930 was 6930, checked in by ebihara, 13 years ago

#2030:日記・トピックコメントを添付画像付きでメール投稿する際に、ファイルサイズがIMAGE_MAX_FILESIZEを超過しているか、GIF,JPEG,PNGに正しく変換できない場合にエラーメールを送信して日記・トピックコメントへの投稿をおこなわないようにした

File size: 18.2 KB
Line 
1<?php
2/**
3 * @copyright 2005-2007 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        // from_host が携帯ドメイン以外はエラー
37        if (!is_ktai_mail_address($this->from)) {
38            m_debug_log('mail_sns::main() from wrong host');
39            return false;
40        }
41
42        if (MAIL_ADDRESS_PREFIX) {
43            if (strpos($to_user, MAIL_ADDRESS_PREFIX) === 0) {
44                $to_user = substr($to_user, strlen(MAIL_ADDRESS_PREFIX));
45            }
46        }
47
48        if (!$this->c_member_id) {
49            // 送信者がSNSメンバーでない場合
50
51            if (!IS_CLOSED_SNS) {
52                // get 新規登録
53                if ($to_user == 'get') {
54                    // アフィリエイトIDが付いている場合
55                    $body = $this->decoder->get_text_body();
56
57                    m_debug_log('mail_sns::regist_get()', PEAR_LOG_INFO);
58                    return $this->regist_get($body);
59                }
60            }
61
62            m_debug_log('mail_sns::main() action not found');
63            return false;
64        }
65
66        //---
67
68        // ログインURL通知
69        if ($to_user == 'get') {
70            m_debug_log('mail_sns::login_get()', PEAR_LOG_INFO);
71            return $this->login_get();
72        }
73
74        //---
75
76        // コミュニティ掲示板投稿
77        elseif (
78            preg_match('/^t(\d+)$/', $to_user, $matches) ||
79            preg_match('/^t(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
80        ) {
81
82            // トピックIDのチェック
83            if (!$c_commu_topic_id = $matches[1]) {
84                return false;
85            }
86
87            if (MAIL_ADDRESS_HASHED) {
88                if (empty($matches[2])) return false;
89
90                // メンバーハッシュのチェック
91                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
92                    return false;
93                }
94            }
95
96            m_debug_log('mail_sns::add_commu_topic_comment()', PEAR_LOG_INFO);
97            return $this->add_commu_topic_comment($c_commu_topic_id);
98        }
99
100        //---
101
102        // 日記投稿
103        elseif (
104            $to_user == 'blog' ||
105            preg_match('/^b(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
106        ) {
107
108            if (MAIL_ADDRESS_HASHED) {
109                if (empty($matches[1]) || empty($matches[2])) return false;
110
111                // メンバーIDのチェック
112                if ($matches[1] != $this->c_member_id) {
113                    return false;
114                }
115                // メンバーハッシュのチェック
116                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
117                    return false;
118                }
119            }
120
121            m_debug_log('mail_sns::add_diary()', PEAR_LOG_INFO);
122            return $this->add_diary();
123        }
124
125        //---
126
127        //プロフィール写真変更
128        elseif (
129            preg_match('/^p(\d+)$/', $to_user, $matches) ||
130            preg_match('/^p(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
131        ) {
132
133            // メンバーIDのチェック
134            if ($matches[1] != $this->c_member_id) {
135                return false;
136            }
137
138            if (MAIL_ADDRESS_HASHED) {
139                if (empty($matches[2])) return false;
140
141                // メンバーハッシュのチェック
142                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
143                    return false;
144                }
145            }
146
147            m_debug_log('mail_sns::add_member_image()', PEAR_LOG_INFO);
148            return $this->add_member_image();
149        }
150
151        //---
152
153        // 日記写真変更
154        elseif (
155            preg_match('/^bi(\d+)$/', $to_user, $matches) ||
156            preg_match('/^bi(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
157        ) {
158            // 日記IDのチェック
159            if (!$c_diary_id = $matches[1]) {
160                return false;
161            }
162
163            if (MAIL_ADDRESS_HASHED) {
164                if (empty($matches[2])) return false;
165
166                // メンバーハッシュのチェック
167                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
168                    return false;
169                }
170            }
171
172            m_debug_log('mail_sns::add_diary_image()', PEAR_LOG_INFO);
173            return $this->add_diary_image($c_diary_id);
174        }
175
176        //---
177
178        // コミュニティ写真変更
179        elseif (
180            preg_match('/^ci(\d+)$/', $to_user, $matches) ||
181            preg_match('/^ci(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
182        ) {
183            // コミュニティIDのチェック
184            if (!$c_commu_id = $matches[1]) {
185                return false;
186            }
187
188            if (MAIL_ADDRESS_HASHED) {
189                if (empty($matches[2])) return false;
190
191                // メンバーハッシュのチェック
192                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
193                    return false;
194                }
195            }
196
197            m_debug_log('mail_sns::add_commu_image()', PEAR_LOG_INFO);
198            return $this->add_commu_image($c_commu_id);
199        }
200
201        //---
202
203        // トピック・イベント写真変更
204        elseif (
205            preg_match('/^ti(\d+)$/', $to_user, $matches) ||
206            preg_match('/^ti(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
207        ) {
208            // トピックIDのチェック
209            if (!$c_commu_topic_id = $matches[1]) {
210                return false;
211            }
212
213            if (MAIL_ADDRESS_HASHED) {
214                if (empty($matches[2])) return false;
215
216                // メンバーハッシュのチェック
217                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
218                    return false;
219                }
220            }
221
222            m_debug_log('mail_sns::add_topic_image()', PEAR_LOG_INFO);
223            return $this->add_topic_image($c_commu_topic_id);
224        }
225
226        m_debug_log('mail_sns::main() action not found(member)');
227        return false;
228    }
229
230    /**
231     * 新規登録のURL取得
232     */
233    function regist_get($aff_id)
234    {
235        // 招待者は c_member_id = 1 (固定)
236        $c_member_id_invite = 1;
237
238        // _pre に追加
239        $session = create_hash();
240        mail_insert_c_member_ktai_pre($session, $this->from, $c_member_id_invite);
241
242        do_common_send_mail_regist_get($session, $this->from, $aff_id);
243        return true;
244    }
245
246    /**
247     * ログインページのURL取得
248     */
249    function login_get()
250    {
251        do_mail_sns_login_get_mail_send($this->c_member_id, $this->from);
252        return true;
253    }
254
255    /**
256     * コミュニティ掲示板投稿
257     */
258    function add_commu_topic_comment($c_commu_topic_id)
259    {
260        if (!$topic = mail_c_commu_topic4c_commu_topic_id($c_commu_topic_id)) {
261            return false;
262        }
263
264        $c_commu_id = $topic['c_commu_id'];
265        if (!_db_is_c_commu_member($c_commu_id, $this->c_member_id)) {
266            $this->error_mail('コミュニティに参加していないため投稿できませんでした。');
267            m_debug_log('mail_sns::add_commu_topic_comment() not a member');
268            return false;
269        }
270
271        $body = $this->decoder->get_text_body();
272        if ($body === '') {
273            $this->error_mail('本文が空のため投稿できませんでした。');
274            m_debug_log('mail_sns::add_commu_topic_comment() body is empty');
275            return false;
276        }
277
278        // 書き込みをDBに追加
279        $ins_id = db_commu_insert_c_commu_topic_comment($c_commu_id, $topic['c_commu_topic_id'], $this->c_member_id, $body);
280
281        // 写真登録
282        $images = $this->decoder->get_images();
283        if ($images === false) {
284            $this->error_mail('画像は' . IMAGE_MAX_FILESIZE . 'KB以内のGIF・JPEG・PNGにしてください。');
285            return false;
286        }
287        $image_num = 1;
288        foreach ($images as $image) {
289            $image_ext = $image['ext'];
290            $image_data = $image['data'];
291            $filename = 'tc_' . $ins_id . '_' . $image_num . '_' . time() . '.' . $image_ext;
292
293            db_image_insert_c_image($filename, $image_data);
294            mail_update_c_commu_topic_comment_image($ins_id, $filename, $image_num);
295            $image_num++;
296            if ($image_num > 3) {
297                break;
298            }
299        }
300
301        //お知らせメール送信(携帯へ)
302        send_bbs_info_mail($ins_id, $this->c_member_id);
303        //お知らせメール送信(PCへ)
304        send_bbs_info_mail_pc($ins_id, $this->c_member_id);
305
306        if (OPENPNE_USE_POINT_RANK) {
307            //トピック・イベントにコメントした人にポイント付与
308            $point = db_action_get_point4c_action_id(11);
309            db_point_add_point($this->c_member_id, $point);
310        }
311
312        return true;
313    }
314
315    /**
316     * 日記投稿
317     */
318    function add_diary()
319    {
320        $subject = $this->decoder->get_subject();
321        $body    = $this->decoder->get_text_body();
322
323        if ($subject === '') {
324            $subject = '無題';
325        }
326        if ($body === '') {
327            $this->error_mail('本文が空のため投稿できませんでした');
328            m_debug_log('mail_sns::add_diary() body is empty');
329            return false;
330        }
331
332        $c_member = db_common_c_member4c_member_id($this->c_member_id);
333        if (!$ins_id = db_diary_insert_c_diary($this->c_member_id, $subject, $body, $c_member['public_flag_diary'])) {
334            return false;
335        }
336
337        // 写真登録
338        $images = $this->decoder->get_images();
339        if ($images === false) {
340            $this->error_mail('画像は' . IMAGE_MAX_FILESIZE . 'KB以内のGIF・JPEG・PNGにしてください。');
341            return false;
342        }
343        $image_num = 1;
344        foreach ($images as $image) {
345            $image_ext = $image['ext'];
346            $image_data = $image['data'];
347            $filename = 'd_' . $ins_id . '_' . $image_num . '_' . time() . '.' . $image_ext;
348
349            db_image_insert_c_image($filename, $image_data);
350            db_diary_update_c_diary_image_filename($ins_id, $filename, $image_num);
351            $image_num++;
352            if ($image_num > 3) {
353                break;
354            }
355        }
356
357        if (OPENPNE_USE_POINT_RANK) {
358            //日記を書いた人にポイント付与
359            $point = db_action_get_point4c_action_id(4);
360            db_point_add_point($this->c_member_id, $point);
361        }
362
363        return true;
364    }
365
366    /**
367     * プロフィール写真変更
368     */
369    function add_member_image()
370    {
371        $c_member = db_common_c_member4c_member_id($this->c_member_id);
372
373        // 登録する写真番号(1-3)を決める
374        $target_number = 0;
375        if ($c_member['image_filename']) {
376            if (!$c_member['image_filename_1']) {
377                $target_number = 1;
378            } elseif (!$c_member['image_filename_2']) {
379                $target_number = 2;
380            } elseif (!$c_member['image_filename_3']) {
381                $target_number = 3;
382            } else {
383                $this->error_mail('プロフィール写真の登録は最大3枚までです。');
384                m_debug_log('mail_sns::add_diary() image is full');
385                return false;
386            }
387        } else {
388            $target_number = 1;
389        }
390
391        // 写真登録
392        if ($images = $this->decoder->get_images()) {
393            $image = $images[0];
394            $image_ext = $image['ext'];
395            $image_data = $image['data'];
396            $filename = 'm_' . $this->c_member_id . '_' . time() . '.' . $image_ext;
397
398            db_image_insert_c_image($filename, $image_data);
399            mail_update_c_member_image($this->c_member_id, $filename, $target_number);
400            return true;
401        } else {
402            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
403            m_debug_log('mail_sns::add_member_image() no images');
404            return false;
405        }
406    }
407
408    /**
409     * 日記写真変更
410     */
411    function add_diary_image($c_diary_id)
412    {
413        if (!$c_diary = db_diary_get_c_diary4id($c_diary_id)) {
414            return false;
415        }
416
417        if ($c_diary['c_member_id'] != $this->c_member_id) {
418            return false;
419        }
420
421        // 登録する写真番号(1-3)を決める
422        $target_number = 0;
423        if ($c_diary['image_filename_1'] || $c_diary['image_filename_2'] || $c_diary['image_filename_3']) {
424            if (!$c_diary['image_filename_1']) {
425                $target_number = 1;
426            } elseif (!$c_diary['image_filename_2']) {
427                $target_number = 2;
428            } elseif (!$c_diary['image_filename_3']) {
429                $target_number = 3;
430            } else {
431                $this->error_mail('日記写真の登録は最大3枚までです。');
432                m_debug_log('mail_sns::add_diary_image() image is full');
433                return false;
434            }
435        } else {
436            $target_number = 1;
437        }
438
439        // 写真登録
440        if ($images = $this->decoder->get_images()) {
441            $image = $images[0];
442            $image_ext = $image['ext'];
443            $image_data = $image['data'];
444            $filename = 'd_' . $c_diary_id . '_' . $target_number . '_' . time() . '.' . $image_ext;
445            db_image_insert_c_image($filename, $image_data);
446            db_diary_update_c_diary_image_filename($c_diary_id, $filename, $target_number);
447            return true;
448        } else {
449            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
450            m_debug_log('mail_sns::add_diary_image() no images');
451            return false;
452        }
453    }
454
455    /**
456     * コミュニティ写真変更
457     */
458    function add_commu_image($c_commu_id)
459    {
460        if (!$c_commu = db_commu_c_commu4c_commu_id($c_commu_id)) {
461            return false;
462        }
463
464        if ($c_commu['c_member_id_admin'] != $this->c_member_id && $c_commu['c_member_id_sub_admin'] != $this->c_member_id ) {
465            return false;
466        }
467
468        if ($c_commu['image_filename']) {
469            $this->error_mail('コミュニティ写真の登録は最大1枚までです。');
470            m_debug_log('mail_sns::add_commu_image() image is full');
471            return false;
472        }
473
474        // 写真登録
475        if ($images = $this->decoder->get_images()) {
476            $image = $images[0];
477            $image_ext = $image['ext'];
478            $image_data = $image['data'];
479            $filename = 'c_' . $c_commu_id . '_' .  time() . '.' . $image_ext;
480            db_image_insert_c_image($filename, $image_data);
481            db_commu_update_c_commu_image_filename($c_commu_id, $filename);
482            return true;
483        } else {
484            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
485            m_debug_log('mail_sns::add_commu_image() no images');
486            return false;
487        }
488    }
489
490    /**
491     * トピック・イベント写真変更
492     */
493    function add_topic_image($c_commu_topic_id)
494    {
495        if (!$c_topic = db_commu_c_topic4c_commu_topic_id($c_commu_topic_id)) {
496            return false;
497        }
498
499        $c_commu_id = $c_topic['c_commu_id'];
500
501        if (!db_commu_is_c_topic_admin($c_commu_topic_id, $this->c_member_id) &&
502            !db_commu_is_c_commu_admin($c_commu_id, $this->c_member_id)) {
503            return false;
504        }
505
506        // 登録する写真番号(1-3)を決める
507        $target_number = 0;
508        if ($c_topic['image_filename1'] || $c_topic['image_filename2'] || $c_topic['image_filename3']) {
509            if (!$c_topic['image_filename1']) {
510                $target_number = 1;
511            } elseif (!$c_topic['image_filename2']) {
512                $target_number = 2;
513            } elseif (!$c_topic['image_filename3']) {
514                $target_number = 3;
515            } else {
516                $this->error_mail('トピック・イベント写真の登録は最大3枚までです。');
517                m_debug_log('mail_sns::add_topic_image() image is full');
518                return false;
519            }
520        } else {
521            $target_number = 1;
522        }
523
524        // 写真登録
525        if ($images = $this->decoder->get_images()) {
526            $image = $images[0];
527            $image_ext = $image['ext'];
528            $image_data = $image['data'];
529            $filename = 't_' . $c_commu_topic_id . '_' . $target_number . '_' . time() . '.' . $image_ext;
530
531            $c_topic['image_filename' . $target_number] = $filename;
532            db_image_insert_c_image($filename, $image_data);
533            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']);
534            return true;
535        } else {
536            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
537            m_debug_log('mail_sns::add_topic_image() no images');
538            return false;
539        }
540       
541    }
542
543    /**
544     * エラーメールをメール送信者へ返信
545     */
546    function error_mail($body)
547    {
548        $subject = '['.SNS_NAME.']メール投稿エラー';
549        t_send_email($this->from, $subject, $body);
550    }
551}
552
553?>
Note: See TracBrowser for help on using the repository browser.