OTRSがIMAPアカウントから電子メールをフェッチするとき、元の送信日を忘れて、これをフェッチ(!)日付に置き換えます。
通常、これは問題ではありませんが、多くのメールが含まれる既存のIMAPフォルダをOTRS
にインポートする場合、すべての日付がインポートデータに設定されます。
これはクールではありません。OTRSに電子メールヘッダーを読み取らせ、それを使用してarticle
テーブルのcreate_time
フィールドを置き換える方法があるかどうかを知りたいと思います。ポストマスターのフィルターモジュール(または同様のもの)を使用することを考えていました。
OTRSに電子メールのdate
ヘッダーを読み取らせ、create_time
にthat dateを使用させるにはどうすればよいですか?
私が見つけた解決策は、次のようにMySQLにトリガーを追加することです。
オン article_attachement
CREATE TRIGGER bi_article_attachement_each BEFORE INSERT ON article_attachment
FOR EACH ROW
BEGIN
DECLARE newdate datetime;
SET newdate = null;
SELECT create_time INTO newdate FROM article_plain ap WHERE ap.article_id = new.article_id LIMIT 1;
IF newdate IS NOT NULL THEN
SET new.create_time = newdate;
SET new.change_time = newdate;
END IF;
END
オン article_plain
CREATE TRIGGER bi_article_plain_each BEFORE INSERT ON article_plain
FOR EACH ROW
BEGIN
DECLARE datestr CHAR(40);
DECLARE newdate DATETIME;
DECLARE mindate DATETIME;
DECLARE myticket BIGINT;
SET datestr = mid(new.body,locate('Date: ',new.body)+6,40);
SET newdate = coalesce(str_to_date(datestr,'%a, %e %M %Y %k:%i:%s'),str_to_date(datestr,'%e %M %Y %k:%i:%s'),new.create_time);
SET new.create_time = newdate;
UPDATE article a SET a.create_time = newdate WHERE a.id = new.article_id;
SELECT a.ticket_id INTO myticket FROM article a WHERE a.id = new.article_id LIMIT 1;
SELECT least(min(a.create_time),new.create_time) INTO mindate FROM article a WHERE a.ticket_id = myticket;
UPDATE ticket t
SET t.create_time = least(t.create_time, mindate)
, t.create_time_unix = unix_timestamp(least(t.create_time, mindate))
WHERE t.id = myticket;
END
同じテーブルですが、更新後
CREATE TRIGGER ua_article_plain_each AFTER UPDATE ON article_plain
FOR EACH ROW
BEGIN
IF old.create_time <> new.create_time THEN BEGIN
UPDATE article a SET a.create_time = new.create_time, a.change_time = new.create_time WHERE a.id = new.article_id;
END; END IF;
END
最後に、ticket
のトリガー:
CREATE TRIGGER bu_ticket_each BEFORE UPDATE ON ticket
FOR EACH ROW
BEGIN
DECLARE newtn varchar(50);
DECLARE newdate varchar(12);
DECLARE filter varchar(13);
SET newdate = date_format(old.create_time,'%Y%m%d%H%i');
SET filter = concat(newdate,'%');
SELECT concat(newdate,ifnull(right(concat('0000',right(max(tn),4)+1),4),'0001')) INTO newtn
FROM ticket
WHERE tn LIKE filter;
SET new.tn = newtn;
END
簡単に言えば、これは不可能です。長い答えは次のとおりです。これを行う場合は、TicketCreate()メソッドを変更する必要があります。これは、現在、新しいチケットの作成日として現在の時刻のみが使用されるためです。
私も同じ問題を抱えていました。このヘルプをありがとうございました。手順がうまくいかなかったので、手順を変更して一時テーブルで作業しました。
CREATE TABLE `article_plain_date` (
`article_plain_FK` INT(11) NOT NULL,
`atricle_ID` INT(11) DEFAULT NULL,
`ticket_ID` INT(11) DEFAULT NULL,
`create_date` DATETIME DEFAULT NULL,
PRIMARY KEY (`article_plain_FK`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO article_plain_date
SELECT p.id,a.id,t.id,IF(STR_TO_DATE(MID(body,LOCATE('Date: ',body)+6,25),'%a, %e %M %Y %k:%i:%s'),STR_TO_DATE(MID(body,LOCATE('Date: ',body)+6,25),'%a, %e %M %Y %k:%i:%s'),p.create_time) AS create_date FROM otrs.article_plain p
JOIN article a ON (p.`article_id` = a.id)
JOIN ticket t ON (a.`ticket_id` = t.id);
UPDATE article_plain p
JOIN article_plain_date d ON (p.`article_id` = d.`atricle_ID`)
SET p.`create_time` = d.`create_date`;
UPDATE article a
JOIN article_plain_date d ON (a.id = d.`atricle_ID`)
SET a.`create_time` = d.`create_date`;
UPDATE ticket t
JOIN article_plain_date d ON (t.id = d.`ticket_ID`)
SET t.`create_time` = d.`create_date`, t.`create_time_unix` = UNIX_TIMESTAMP(d.`create_date`);