スポンサーサイト

  • このエントリーを含むはてなブックマーク
  • Yahoo!ブックマークに登録
    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    eticket文字化け   問合せ管理 FreeTicket

  • このエントリーを含むはてなブックマーク
  • Yahoo!ブックマークに登録
    ※4/9追記eTicketは、FreeTicketに移行しました。
     FreeTicketのカテゴリをあわせてご参照ください。

    eticketに関して一部画面で文字化けが発生するという
    ご報告を頂きました。

    確認したところ、IEの特定バージョンなどで再現しました。
    ブラウザからソース表示を行うとCONTENTを括る「"」が欠けていました。

    eticketディレクトリ内のthemes/eticket/theme.php
    内で下記の様に「"」を加えて頂くことで改善します。
    今後のファイルなどには、反映させて行きます。


    line:10
    //~?php echo $db_settings['charset']; ?>>
                             ↓
    //~?php echo $db_settings['charset']; ?>">



    スポンサーサイト

    theme : Linux
    genre : コンピュータ

    eticket受信メールpipe.php日本語処理  FreeTicket

  • このエントリーを含むはてなブックマーク
  • Yahoo!ブックマークに登録
    ※4/9追記eTicketは、FreeTicketに移行しました。
     FreeTicketのカテゴリをあわせてご参照ください。

    ここ5日間全く前に進めませんでした。
    はまった、はまった。

    eticketのpip.phpですが、なるべく簡潔に修正した気持ちとは
    大きくかけ離れ、だいぶオリジナルになってしまいました。

    受信メールをpop3でなく、pipeで直接処理するソースがようやく
    できたので、postします。

    ちなみに今回のソースは、phplistの空メールでも参考にさせて頂いた
    こちらを参考にさせて頂き、さらには、ラッパーを利用させて頂いているので、
    ファイルとしてまとめて公開するのは、ご許可を頂いてからと考えています。

    前置きはいりましたが、下記ソースです。
    今回、chdirのせいか、postfixのchrootが関係あるのか、切り分けていませんが、
    init.phpの読み込みにより、動かないことだけは切り分けできていたので、
    init.phpとsetting.phpからソースに必要になる箇所だけinit2.phpとしてまとめました。

    設置方法としましては、
    下記、pipe.phpとinit2.phpをeticketのディレクトリに配置し、
    ReceiptMailDecoder.class.phpを同じディレクトリに準備してください。

    /etc/aliasesへ


    support: "| /usr/bin/php /var/www/html/eticket/pipe.php"


    といった形で設定してください。
    また、init2.phpの中身も自分の環境に合わせて書き換える必要があります。

    まだまだソースをきれいにできるかと思いますが、ひとまずこれで許してください。

    pipe.php



    #!/usr/bin/php
    /**********************************************************************************
    * eTicket ・http://www.eticketsupport.com *
    * by Digital Frontiers, UTO *
    **********************************************************************************
    * Software Version: eTicket 1.7.2 *
    * Software by: Digital Frontiers, UTO (http://www.eticketsupport.com) *
    * Copyright 2008 by: Digital Frontiers, UTO (http://www.eticketsupport.com) *
    * Support, News, Updates at: http://www.eticketsupport.com *
    ***********************************************************************************
    * This program is free software; you may redistribute it and/or modify it under *
    * the terms of the provided license as published by Digital Frontiers, UTO. *
    * *
    * This program is distributed in the hope that it is and will be useful, but *
    * WITHOUT ANY WARRANTIES; without even any implied warranty of MERCHANTABILITY *
    * or FITNESS FOR A PARTICULAR PURPOSE. *
    * *
    * See the "license.txt" file for details of the eTicket license. *
    * The latest version can always be found at http://www.eticketsupport.com. *
    **********************************************************************************/
    ob_start();

    mb_language("japanese");
    mb_internal_encoding("UTF-8");

    require_once dirname(__FILE__) . '/init2.php';
    require_once dirname(__FILE__) . '/inc/class.ticket.php';

    $incoming = file_get_contents("php://stdin");
    if(!$incoming){
    exit();
    }
    require_once dirname(__FILE__) . '/ReceiptMailDecoder.class.php';

    $decoder =& new ReceiptMailDecoder($incoming);

    if ($istart = mb_strpos($incoming, "Content-Type:")) {
    if ($istart = mb_strpos($incoming, "boundary=\"", $istart)) {
    $istart+= mb_strlen("boundary=\"");
    $iend = mb_strpos($incoming, "\"", $istart);
    $boundary = mb_substr($incoming, $istart, $iend-$istart);
    }
    }
    if (!$boundary) {
    $boundary = "\r\n";
    }
    $part_header = mb_split($boundary, $incoming);
    $header1 = array_shift($part_header);
    $header2 = array_shift($part_header);
    $header = $header1 . $header2;

    if ($decoder->body['html']) {
    $body = mb_convert_encoding($decoder->body['html'],$db_setting['charset'],auto);;
    $body = strip_tags($body);
    $body = html_entity_decode($body);
    } elseif ($decoder->body['text']) {
    $body = mb_convert_encoding($decoder->body['text'],$db_setting['charset'],auto);
    } else {
    $body = mb_convert_encoding($decoder->body['text'],$db_setting['charset'],auto);
    }

    $banlist = array();
    $ban_res = mysql_query("SELECT * FROM " . $db_table['banlist']);
    while ($ban_row = mysql_fetch_array($ban_res)) {
    $banlist[] = $ban_row['value'];
    }
    $email = str_replace("'", "", $decoder->getDecodedHeader( 'from' ));
    $name = '';
    if (mb_strpos($email, '<')) {
    $email = mb_eregi_replace('.*<(.*)>.*', '\\1', $email);
    }
    if (preg_match("/^(?:(.*?)[ ]?)?<(.*?)>|(.*?)$/", $decoder->getDecodedHeader( 'from' ), $matches)) {
    if ($email == '') $email = $matches[2] . $matches[3];
    $name = $matches[1];
    if (preg_match("/^\".+\"$/i", $name)) $name = mb_substr($name, 1, -1);
    }
    if (preg_match("/^(?:(.*?)[ ]?)?<(.*?)>|(.*?)$/", $decoder->getDecodedHeader( 'to' ), $matches)) {
    if ($toemail == '') $toemail = $matches[2] . $matches[3];
    $toname = $matches[1];
    }
    if ($name == '') {
    $name = $email;
    }

    $banned = 0;
    foreach($banlist as $banline) {
    if (!empty($banline)) {
    if (stristr($decoder->getDecodedHeader( 'from' ), $banline)) {
    $banned = 1;
    }
    if (stristr($decoder->getDecodedHeader( 'subject' ), $banline)) {
    $banned = 1;
    }
    if (stristr($body, $banline)) {
    $banned = 1;
    }
    }
    }


    if (mb_eregi('^Yes', $decoder->getDecodedHeader( 'x-spam-flag' ))) {
    $stopmessage = 1;
    }

    if ($decoder->getDecodedHeader( 'return-path' ) == "<>") {
    $stopmessage = 1;
    }

    if ($decoder->getDecodedHeader( 'x-auto-generated' )) {
    $stopmessage = 1;
    } elseif ($decoder->getDecodedHeader( 'x-auto-replied' )) {
    $stopmessage = 1;
    }

    if ($stopmessage == 1 or $banned == 1) {
    ob_clean();
    die(0);
    }

    if ($decoder->getDecodedHeader( 'x-importance' ) == "high") {
    $pri = 3;
    } elseif ($decoder->getDecodedHeader( 'x-importance' ) == "low") {
    $pri = 1;
    } elseif ($decoder->getDecodedHeader( 'x-priority' ) == "1" or $decoder->getDecodedHeader( 'x-priority' ) == "2") {
    $pri = 1;
    } elseif ($decoder->getDecodedHeader( 'x-priority' ) == "4" or $decoder->getDecodedHeader( 'x-priority' ) == "5") {
    $pri = 3;
    } else {
    $pri = 2;
    }

    if ($db_settings['remove_original'] && $db_settings['remove_tag'] && mb_strpos($body, $db_settings['remove_tag'])) {
    preg_match('/(.+?)>? ?' . $db_settings['remove_tag'] . '.+/s', $body, $matches);
    if (!empty($matches[1])) $body = $matches[1];
    }
    $body = trim($body);

    $c = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS `cnt` FROM `$db_table_tickets` WHERE `email`='$email' AND `status`!='closed';"));
    if ($c['cnt'] >= $db_settings['ticket_max']) {
    $limit_msg = str_replace('%url', $db_settings['root_url'], $db_settings['limit_msg']);
    $limit_msg = str_replace('%local_email', $cat_row['email'], $limit_msg);
    $limit_msg = str_replace('%user_email', $email, $limit_msg);
    $limit_msg = str_replace('%ticket_max', $db_settings['ticket_max'], $limit_msg);
    if ($db_settings['limit_response']) {
    mb_send_mail($email, $db_settings['limit_subj'], $limit_msg, $db_settings['limit_email'], FALSE, $pri);
    }
    ob_clean();
    die(0);
    }
    unset($ticket_id);
    unset($send_notice);
    if (preg_match("/$db_settings[ticket_format]/", $decoder->getDecodedHeader( 'subject' ), $matches)) {
    $id = trim($matches[1]);
    if (ValidID($id)) {
    $ticket_id = $id;
    }
    $send_notice = TRUE;
    }
    $cat_res = mysql_query("SELECT * FROM " . $db_table['categories'] . " WHERE email='" . $toemail . "'");
    $cat_row = mysql_fetch_array($cat_res);
    if ($cat_row['email'] != $email) {
    if (empty($ticket_id)) {
    $ticket_id = CreateTicket($decoder->getDecodedHeader( 'subject' ), $name, $email, $cat_row['ID'], '', $pri, $ip, $body);
    $send_notice = FALSE; //a notice is already sent by CreateTicket
    $iid = PostMessage($ticket_id, $body, $header, $send_notice, 'new');
    } else {
    $iid = PostMessage($ticket_id, $body, $header, $send_notice, 'custreplied');
    }
    }
    if (is_dir($db_settings['attachment_dir']) && $db_settings['accept_attachments']) {

    if ( $decoder->isMultipart() ) {
    $filetypes = explode(';', $db_settings['filetypes']);
    $tempFiles = array();
    $num_of_attaches = $decoder->getNumOfAttach();
    for ( $i=0 ; $i < $num_of_attaches ; ++$i ) {
    foreach($filetype as $ext)
    $file_name_ext = $decoder->attachments[$i]['filename'];
    if (strstr($file_name_ext, '.')) {
    $file_name_ext = mb_substr($file, mb_strrpos($file, '.'));
    if ($ext == $file_name_ext){
    if (!$db_settings['attachment_size'] || (mb_strlen($decoder->attachments[$i]['binary']) <= $db_settings['attachment_size'])) {
    mt_srand(time());
    $rand = mt_rand(100000, 999999); //six chars.
    $basename_ext = explode(".", $decoder->attachments[$i]['filename']);
    $base_name = array_shift($basename_ext);
    $destfile = $rand . '_' . $base_name . "." . $ext;
    $dest = $db_settings['attachment_dir'] . $destfile;
    echo $dest;
    $ifp = fopen($dest, "wb");
    fwrite($ifp, $decoder->attachments[$i]['binary']);
    fclose($ifp);
    $sql = "INSERT INTO " . $db_table['attachments'] . " (ticket, ref, filename, type) VALUES (" . $ticket_id . ", " . $iid . ", '" . $rand . "_" . $base_name . "." . $ext . "', 'q')";
    mysql_query($sql);
    }
    }
    }
    }
    }
    }
    ob_clean();
    die(0);
    ?>




    init2.php




    #version
    $version = '1.7.2';
    #database settings
    $db_type = 'mysql';
    $db_host = 'localhost';
    $db_name = 'eticket';
    $db_user = 'root';
    $db_pass = '';
    $db_table_prefix = 'ticket_';
    $db_table_tickets = 'tickets';
    #path to where eTicket is installed
    $rootpath_dir = '/var/www/html/eticket/';
    #have you run the installer?
    $installed = 1;


    //require_once dirname(__FILE__)."/lang.php"; // include the language file
    // create tables array
    $db_table = array();
    $db_table['answers'] = $db_table_prefix . 'answers';
    $db_table['attachments'] = $db_table_prefix . 'attachments';
    $db_table['banlist'] = $db_table_prefix . 'banlist';
    $db_table['categories'] = $db_table_prefix . 'categories';
    $db_table['groups'] = $db_table_prefix . 'groups';
    $db_table['messages'] = $db_table_prefix . 'messages';
    $db_table['privmsg'] = $db_table_prefix . 'privmsg';
    $db_table['reps'] = $db_table_prefix . 'reps';
    $db_table['settings'] = $db_table_prefix . 'settings';
    $db_table['tickets'] = $db_table_tickets ? $db_table_tickets : 'tickets';
    /* Core variables */
    //files, directories and table vars
    $themes_dir = $rootpath_dir . 'themes'; //directory of themes
    $image_dir = $rootpath_dir . 'images'; //directory of images in themes
    $buttons_dir = $rootpath_dir . 'buttons'; //directory of button images in themes
    $install_dir = $rootpath_dir . 'install'; //directory of installer
    $inc_dir = $rootpath_dir . 'inc'; //directory of includes
    $header_file = $rootpath_dir . 'header.php'; //part of the theme
    $footer_file = $rootpath_dir . 'footer.php'; //part of the theme
    $errors_file = $rootpath_dir . 'errors.php'; //displays errors
    //defines - must be loaded BEFORE INC files are included
    if (substr($inc_dir, -1) != DIRECTORY_SEPARATOR) {
    $inc_dir = $inc_dir . DIRECTORY_SEPARATOR;
    } //just a quick fix...
    define('INC_DIR', $inc_dir); //full path of include directory
    define('ADMIN', 1); //this is the numerical value of the Administrator's group as per the database
    define('ISINC', TRUE); //used to check if this file has been run
    // headers/footers/errors
    $site_header = INC_DIR . $header_file;
    $site_footer = INC_DIR . $footer_file;
    $site_errors = INC_DIR . $errors_file;

    //This is the timezone data, used in inc/pref.php
    $gmoffset = date('O');
    $timezones = array('' => LANG_SYSTEM_TIMEZONE . " (GMT $gmoffset)", -12 => "GMT -12:00 (Eniwetok, Kwajalein)", -11 => "GMT -11:00 (Midway Island, Samoa)", -10 => "GMT -10:00 (Hawaii)", -9 => "GMT -09:00 (Alaska)", -8 => "GMT -08:00 (Pacific Time)", -7 => "GMT -07:00 (Mountain Time)", -6 => "GMT -06:00 (Central Time)", -5 => "GMT -05:00 (Eastern Time)", -4 => "GMT -04:00 (Atlantic Time)", -3 => "GMT -03:00 (Greenland)", -2 => "GMT -02:00 (Mid-Atlantic)", -1 => "GMT -01:00 (Azores)", 0 => "GMT (Greenwich Mean Time)", 1 => "GMT +01:00 (West Central Africa)", 2 => "GMT +02:00 (Jerusalem)", 3 => "GMT +03:00 (Baghdad)", 4 => "GMT +04:00 (Kabul)", 5 => "GMT +05:00 (New Delhi)", 6 => "GMT +06:00 (Kathmandu)", 7 => "GMT +07:00 (Bangkok)", 8 => "GMT +08:00 (Hong Kong)", 9 => "GMT +09:00 (Tokyo)", 10 => "GMT +10:00 (Sydney)", 11 => "GMT +11:00 (Solomon Islands)", 12 => "GMT +12:00 (Fiji)", 13 => "GMT +13:00 (Nuku'alofa)");

    //connect to database
    if ($db_con = @mysql_pconnect($db_host, $db_user, $db_pass)) {
    $db_sel = mysql_select_db($db_name, $db_con);
    }
    //check for errors
    if (mysql_error()) {
    die('' . LANG_FATAL_ERROR . ': ' . LANG_DB_COULD_NOT_CONNECT . '
    ' . mysql_error() . '
    ' . $help_link);
    }
    //Disable strict mode in MySQL 5... Bug #1793730
    mysql_query("SET @@session.sql_mode='MYSQL40'");

    //Ensure database is using correct charset - Bug #1963216
    if ($db_settings['charset']) {
    $mysqlcharset = str_replace(strtolower($db_settings['charset']), '-', '');
    }

    if ($mysqlcharset) @mysql_query("SET NAMES '" . $mysqlcharset . "'");

    /* Load settings from database */
    $sql = @mysql_fetch_array(mysql_query("SHOW TABLES LIKE '" . $db_table['settings'] . "'"));
    if ($sql) {
    $query = mysql_query("SELECT * FROM " . $db_table['settings']);
    $db_settings = array();
    while ($setting = mysql_fetch_array($query)) {
    if (!empty($setting['group'])) {
    $db_settings[$setting['group']][$setting['key']] = $setting['value'];
    } else {
    $db_settings[$setting['key']] = $setting['value'];
    }
    }
    }
    //Ensure database is using correct charset - Bug #1908635
    if ($db_settings['charset']) $mysqlcharset = str_replace(strtolower($db_settings['charset']), '-', '');
    if ($mysqlcharset) @mysql_query("SET NAMES '" . $mysqlcharset . "'");
    /* fix some vars */
    //tickets_per_page
    $db_settings['timezone'] = ($db_settings['timezone'] == '') ? date('Z') /3600 : $db_settings['timezone'];
    //set attachment dir to ensure it has a trailing slash
    $db_settings['attachment_dir'] = $rootpath_dir . $db_settings['attachment_dir'];
    //if the attachment dir isn't writable, we'll just disable attachments by removing the variable
    if (!(is_writable($db_settings['attachment_dir'])) && (file_exists($db_settings['attachment_dir']))) {
    unset($db_settings['accept_attachments']);
    }
    ?>


    theme : Linux
    genre : コンピュータ

    eticketのautomail.phpサブジェクト文字化けについて FreeTicket

  • このエントリーを含むはてなブックマーク
  • Yahoo!ブックマークに登録
    ※4/9追記eTicketは、FreeTicketに移行しました。
     FreeTicketのカテゴリをあわせてご参照ください。

    eticketのpop3からのメール取得プログラムautomail.phpに
    関してですが、非常に単純に文字化けが解消しました。

    難航すると勝手に決め付けて、
    手をつけていなかっただけでした。すみません。



    automail.php 
    line:102
    $str = mb_convert_encoding($str, $db_settings['charset']);

    $str = mb_convert_encoding($str, $db_settings['charset'], $decoded[$i]->charset);



    これだけです。。。

    拍子抜けしてしまいますが、単純に変換前のコードを明示的にしてあげることで
    OKのようです。

    pipe.phpに関してひと段落したら、全体を更新して公開したいと思います。


    theme : Linux
    genre : コンピュータ

    eticketメール受信処理に関して FreeTicket

  • このエントリーを含むはてなブックマーク
  • Yahoo!ブックマークに登録
    ※4/9追記eTicketは、FreeTicketに移行しました。
     FreeTicketのカテゴリをあわせてご参照ください。

    時間が空いてしまいました。
    サボっていたわけではなく、受信メール処理関連で
    ずっとはまっていました。

    eticketでのメールの処理ですが、
    以前、記載したように、pipeとpop3の二つの手段があります。

    pipeに関しては、うまくいっていないことを報告していましたが、
    pop3に関しても運用によっては問題がおおありということがわかったので、
    手をつけ始めました。

    pop3での運用の場合でも、システム側からお問い合わせ番号を発行し、
    顧客との間でUTF8のメールをやり取りしていれば問題ありませんが、
    基本的に、メーラーで新規にメールを作成するとやはり日本語の場合は、

    「iso-2022-jp」

    であることが多いので、このままでは問題があります。

    pipe.phpに関しては、class.parse.phpという独自のクラスがマルチバイトを
    考慮していないためだと思われます。

    pipe.phpと、日本語対応させた、parse部分を混合してソース編集しています。
    なるべく、元ソースのステップを維持して編集していますが、
    若干苦労しています。

    近いうちに公開できる様に準備したいと思います。


    theme : Linux
    genre : コンピュータ

    eticketのデモ  FreeTciket

  • このエントリーを含むはてなブックマーク
  • Yahoo!ブックマークに登録
    ※4/9追記eTicketは、FreeTicketに移行しました。
     FreeTicketのカテゴリをあわせてご参照ください。

    eticketのデモ環境つくりました。

    管理画面こちら
    お問い合わせ画面こちら
    ※お問い合わせフォームを使用しない場合はこちらは使用しません。

    デモアカウントは demo/demo です。

    theme : Linux
    genre : コンピュータ

    ご案内
    google検索
    カスタム検索
    カテゴリ
    最新記事
    Amazon
    カテゴリー&RSS
    RSS新着情報

    plugin by F.B

    検索フォーム
    最近のコメント(コンパクト)
    データ取得中...
    リンク
    フリーエリア
    RSSリンクの表示
    カレンダー
    07 | 2017/08 | 09
    - - 1 2 3 4 5
    6 7 8 9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30 31 - -
    ブックマーク
    Yahoo!ブックマークに登録
  • | このエントリーを含むはてなブックマーク
  • 月別アーカイブ
    最新トラックバック
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。