*.templateファイルへマクロを記述すると、QMAIL2からそのテンプレートファイルが呼び出された時(新規送信メール作成・返信・転送など)に実行され、その結果がクリップボード経由でエディタへ渡されます。
またmsg.templateの場合は、メールのプレビュー画面、メールビューウインドウへメールの内容が表示されるときに実行されその結果が反映されます。
テンプレートではマクロを実行単位毎に{ }で囲みます。
また、コメントはこのマクロ実行単位内、つまり'{'から'}'の間のみ有効です。
テンプレートでは、返信・転送やメールビューへの表示でその元になるメールからデータを取り込み表示する場合、テンプレートに書かれた内容をそのまま表示する場合、マクロにより生成したデータを表示する場合があります。
テンプレートの名前は、新規メール作成時はnew.template、返信時はreply.template、転送時はforward.templateです。
それ以外のテンプレートは[Mail]-[Select Template...]またはCキーで[Select Template]ダイアログを開き、そこから該当するテンプレートを選択して呼び出しますが、名前がreply_*.templateの場合は元メールのRepliedフラグが、forward_*.templateの場合は元メールのForwardedフラグがonになります。
また、メールビュー画面等でメールを表示させる場合は[View]-[Select Template...]で選択したテンプレートが利用されます。
また、同じ名前のテンプレートが複数存在する場合は下記の順に検索されます。
reply.templateの場合
1. アカウントのディレクトリのreply_[カレントのフォルダID].template
2. アカウントのディレクトリのreply.template
3. メールボックスディレクトリのreply.template
(*) このマニュアルではショートカットキーについてはデフォルトの.keymapファイルに合わせて表記します。
従って.keymapファイルを書き換えている方はご自分の設定に従って読み替えて下さい。
また、マニュアル上クリックと表現している部分はWindowsCE機等のタッチパネルではタップと読み替えて下さい。
[目次へ]
QMAIL2に付属のreply.templateとreply_all.templateのサンプルを例に説明します。(最新版のQMAIL2に付属のものとは多少異なる場合もあります)
サンプルのテンプレートで記述されているマクロの意味を理解した上で、ご自分の利用方法にあったテンプレートを作成してみて下さい。
(1) reply.template
To: {@If(@Exist('Reply-To'), Reply-To, @Decode(From))}
Toヘッダを生成します。返信元のメールにReply-Toヘッダが存在すればその内容が、無ければFromヘッダの内容が宛先にセットされます。
Subject: Re: {@Subject(@True(), @True())}
Subjectヘッダを生成します。相手のSubjectに'Re: 'を付加し、相手のSubjectから'Re:'とメーリングリスト名の[XXX:99999]を取り払らわれます。
{@If(@Or(@Exist('X-ML-Name'), @BeginWith(Subject, '[')), '',
@Concat('Bcc: ', @I(@Account(), X-QMAIL-SubAccountIdentity), '\n'))}Message-Id: {@Concat('<', @ProcessId(),
@FormatDate(@Date(), '%Y4%M0%D%h%m%s'), @Address(@Account(), X-QMAIL-SubAccountIdentity), '>')}
BccヘッダとMessage-Idヘッダを生成します。この時、元のメールにX-ML-Nameヘッダが存在するか、もしくはSubjectが'['で始まっている場合にはBccヘッダを生成せず(ここではこれでメーリングリストのメールかそうでないかを判断しています)、そうでない場合はBccフィールドに自分の名前とアドレスをセットして生成し、改行します。
Message-IdヘッダはプロセスIDとメール作成時の日付時刻と自分のメールアドレスを組み合わせて生成されます。(Identityを利用している場合元メールの受信Identityに対応したメールアドレスが利用されます)
In-Reply-To: {Message-Id}
In-Reply-Toヘッダを生成します。In-Reply-Toフィールドには元のメールのMessage-Idをセットされます。
元のメールの特定のフィールドを参照する場合は、このようにフィールド名を{ }で囲むことでフィールド値が文字列変換されます。
References: {@Progn(@Set('ref', References(4)), @Concat(@If($ref, @Concat ($ref, ' '), ''), Message-Id))}
Referencesヘッダを生成します。Referencesフィールドには、元のメールにReferencesヘッダがあればその内容を最高4つまでセットし、元のメールのMessage-Idを最後に付加します。
元のメールにReferencesヘッダが無ければ元のメールのMessage-Idのみをセットします。
Referencesヘッダが元のメールに存在するかどうかのチェックは、まず$refという変数にReferencesフィールドを代入し、$refが空なら無し、$refに文字列が代入されていれば有りと判断しています。
X-QMAIL-Quote: >
X-QMAIL-Quoteヘッダを生成します。
X-QMAIL-Account: {@Account()}{@If(X-QMAIL-SubAccountIdentity, @Concat('\nX-QMAIL-SubAccountIdentity: ', X-QMAIL-SubAccountIdentity), '')}
X-QMAIL-Accountヘッダを生成します。フィールド部には現在のアカウントがセットされます。
また、Identityを利用している場合、元メールに対応するX-QMAIL-SubAccountIdentityヘッダが生成されます。
At {@FormatDate(@Date(Date), '%Y4/%M0/%D %h:%m:%s')} {@Name(From)} wrote:
引用コメントを生成します。元のメールのDateヘッダの日時と相手の名前を表示します。
{@Body('> ', @True())}
元のメールの本文を引用します。テキスト部分のみ引用し、添付ファイルの存在は表示しません。
また、引用符として'> 'を各行の先頭に挿入します。
(2) reply_all.template
{@Progn(
@Set('val', @Progn(
@Set('from', @If(@Exist('Reply-To'), Reply-To, From)),
@Set('to', @Remove(To, @Address(@I(@Account(), X-QMAIL-SubAccountIdentity)), @Address($from))),
@Set('cc', @Remove(Cc, @Address(@I(@Account(), X-QMAIL-SubAccountIdentity)), @Address($from))),
@Concat($to, @If(@And($to, $cc), ', ', ''), $cc))),
@Concat('To: ', $from, '\n', @If($val, @Concat('Cc: ', $val, '\n'), '')))}Subject: Re: {@Subject(@True(), @True())}
まず、変数$fromに、元のメールにRelpy-Toヘッダがあればその内容が、無ければFromフィールドの内容がセットされます。
次に変数$toに元のメールのToヘッダから自分のアドレスと変数$Fromのアドレスを除いたアドレスがセットされます。
更に変数$ccに元のメールのCcヘッダから自分のアドレスと変数$Fromのアドレスを除いたアドレスがセットされます。
この場合、自分のメールアドレスとはIdentityを利用している場合、Identityに対応した自分のメールアドレス、Identityを利用していない場合アカウントに対応した自分のメールアドレスです。
その結果、変数$valに変数$toの内容と、もし変数$toと変数$ccが共に空でなければカンマで区切り、変数$ccの内容がセットされます。
そしてまずFromヘッダに変数$Fromの内容をセットし生成し、次に変数$valが空でなければCcヘッダに変数$valの内容をセットして生成します。
結果としてToヘッダには元のメールのReply-Toで指定されたアドレスかFromフィールドのアドレスが、Ccヘッダには元のメールのToヘッダ、CcヘッダのすべてのアドレスからこのメールのToヘッダのアドレスと自分自身のアドレスを除いたアドレスがセットされます。
次に元のメールのSubjectフィールドから先頭の'Re: 'とメーリングリスト名の[xxx:99999]を削除して、先頭に'Re: 'を付けてSubjectヘッダを生成します。
To・Ccヘッダ生成マクロと改行無しに続けて書かないと、To・Ccヘッダ生成時に'\n'を付けているので空行ができ、Subject以下がヘッダとみなされなくなるためです。
Bcc: {@I(@Account(), X-QMAIL-SubAccountIdentity)}
Bccヘッダに自分自身の名前とアドレスをセットし生成します。
Message-Id: {@Concat('<', @ProcessId(), @FormatDate(@Date(), '%Y4%M0%D%h%m%s'), @Address(@I(@Account(), X-QMAIL-SubAccountIdentity)), '>')}
In-Reply-To: {Message-Id}
References: {@Progn(@Set('ref', References(4)), @Concat(@If($ref, @Concat($ref, ' '), ''), Message-Id))}
X-QMAIL-Quote: >
X-QMAIL-Account: {@Account()}{@If(X-QMAIL-SubAccountIdentity, @Concat('\nX-QMAIL-SubAccountIdentity: ', X-QMAIL-SubAccountIdentity), '')}
At {@FormatDate(@Date(Date), '%Y4/%M0/%D %h:%m:%s')} {@Name(From)} wrote:
以上は(1)のreply.templateと同じなので説明を省略します。
{@Body(@Concat(@SubstringBefore(@Address(From), '@'), '> '), @True())}
元のメールの本文を引用します。テキスト部分のみ引用し、添付ファイルの存在は表示しません。
引用符として元のメールのFromフィールドのアドレスの'@'より前の部分に'> 'を付けたものを各行の先頭に挿入します。
元のメールのFromフィールドのアドレスが'hogehoge@fugafuga.ne.jp'であれば引用符は'hogehoge> 'となります。
さらにいろいろな使い方を例を挙げて説明します。
(1) Identityにより署名を切り替える(新規メール作成の場合)
{@Progn(@Set('id', @Identity()),@If(@Equal($id, 'ID1'), '署名1', '署名2'))}
現在のIdentityがID1ならば署名1を、そうでなければ署名2を付加します。
署名1・署名2は実際につける署名の文字列。複数行の場合'\n'で改行します。
この場合署名を切り替えていますが、他にもメールの書き出しの言葉や生成するヘッダをIdentityで切り替える場合などに利用できます。
(2) Identityにより署名を切り替える(返信などの場合)
{@Progn(@Set('id', X-QMAIL-SubAccountIdentity),@If(@Equal($id, 'ID1'), '署名1', '署名2'))}
(1)と違い、元のメールのX-QMAIL-SubAccountIdentityヘッダからIdentityを判断します。
(3) Toヘッダの有無をチェックして表示する
To: {@If(@Exist('To'), @Name(To), '')}
msg.templateで'To: {To}'としていると、Toヘッダの無いメールを見る場合にエラーになってしまいます。そこで無い場合も考えられるヘッダなどは存在をチェックしてから表示するようにします。
(4) サブアカウントでメールアカウントを管理している場合
new.templateの場合
X-QMAIL-SubAccountIdentity: {@Identity()}
reply*.template/forward.templateの場合
X-QMAIL-SubAccountIdentity: {X-QMAIL-SubAccountIdentity}
通常は複数のメールアカウントはアカウント毎に管理し、接続形態などの違いをサブアカウントに設定しますが、1つのアカウントで複数のメールアカウントをサブアカウント毎に管理する場合、Identityによりメールアカウントを切り替えることが可能です。
その場合、Identityでメールの送受信をコントロールしますのでテンプレートのヘッダ部分に上記設定を追加しておかないと作成したメールの送信が行えません。
上記設定で新規送信メールはカレントのIdentityで、返信・転送の場合は元のメールを受信したIdentityで作成され、そのIdentityのサブアカウントの送信時に送信されます。
尚、1.9.47以降QMAIL2のアーカイブに含まれるテンプレートはIdentityを考慮されたものになっており、このためにテンプレートを書き換える必要は無くなりました。
(5) @Load()を利用して署名やテンプレートを切り替える場合
署名ファイルを切り替える場合
{@Progn(@Set('id', @Identity()),@If(@Equal($id, 'ID1'), @Load('\Storage Card\mail\ID1.signature', @False()), @Load('\Storage Card\mail\ID2.signature', @False())))}
テンプレートを切り替える場合
{@Progn(@Set('id', @Identity()),@If(@Equal($id, 'ID1'), @Load('\Storage Card\mail\ID1.template', @True()), @Load('\Storage Card\mail\ID2.template', @True())))}
上記例ではIdentityによって、署名ファイルやテンプレートを切り替えています。
このようにサブアカウント毎に署名やテンプレートを切り替えたり、何らかの条件でファイルを挿入する場合に@Load()は便利に利用できます。
テンプレートはメールの作成・返信・転送・表示以外にも利用できます。
ここではちょっとした活用方法をご紹介します。
ここで紹介するテンプレートはこのマニュアルに同梱していますので自分用に変更するなどしてご自由にお使い下さい。
(1) HTMLメールからHTMLファイルを作る
次のようなテンプレートをhtml.templateとして作成します。
これで、QMAIL 1.1xのhtml.templateと同じようなことができます。
<html>
<head>
<title>{@If(@Exist('Subject'),@Subject(),'(No Subject)')}</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<body bgcolor="#ffffff">
<b>To: {@If(@Exist('To'),@Name(To),'')}</b><br>
<b>From: {@Name(From)}</b><br>
<b>Subject: {@If(@Exist('Subject'),@Subject(),'(No Subject)')}</b><br>
<b>Date: {@FormatDate(@Date(Date), '%Y4/%M0/%D %h:%m:%s')}</b><br>
<br>
{@Body('',@True())}
</body>
</html>
HTMLメールを選択し、[Mail]-[Select Template...]またはCキーで[Select Template]ダイアログを開き、html.templateを選択してEnterキーを押下、またはOKボタンをクリックするとエディタにHTMLファイルとして渡されますので、拡張子を.html等にして保存し、ブラウザで開きましょう。
(2) 選択範囲のみ引用して返信する
長文のメールに返信する場合、全文引用したものから必要な部分を残して削除するのは結構面倒ですが、このマクロ(reply_select.template)を利用すると、メッセージビューなどで、必要な部分をクリップボードにコピーしておけばその部分だけが引用されます。
ヘッダ部分は通常のreply.templateと同じなので、本文引用部分のみ掲載します。
{@Progn(
@Set('enddata', 4294967295),
@Set('body', @Clipboard()),
@Set('quote' ,'> '),
@Set('text', ''),
@Set('s', @Find($body, '\n', 0, @True())),
@While(
@Less($s, $enddata),
@Progn(
@Set('work', @Substring($body, 0, @Add($s, 1))),
@Set('body', @Substring($body, @Add($s, 1))),
@Set('text', @Concat($text, $quote, $work)),
@Set('s', @Find($body, '\n', 0, @True()))
)
),
@If(
@Length($body,@True()),
@Set('text', @Concat($text, $quote, $body, '\n')),
''
),
@Concat($text)
)
}
まず、返信するメールから引用したい部分を選択し、[Edit]-[Copy](Ctrl+C)でクリップボードにコピーし、[Mail]-[Select Template...]またはCキーで[Select Template]ダイアログを開き、reply_select.templateを選びます。
(3) MLのメールは必ずMLに返信する
メーリングリストのメールには通常Reply-ToヘッダにMLの投稿アドレスがセットされますのでそのまま返信するとメーリングリストへ投稿されますが、一部のメールソフトでは、設定により投稿者のアドレスがセットされている場合があります。
この場合、メーリングリストサーバはそのReply-Toヘッダを優先するため、そのままのReply-Toヘッダでメールが送られてきます。
これに気付かずに返信するとメーリングリストに投稿したつもりが、元メールの投稿者へ直接メールを送ってしまいます。
そこでこのマクロ(reply_ml.template)は、多くのメーリングリストがToヘッダを投稿時のまま配送しているために投稿アドレスがセットされていることを利用し、Reply-Toヘッダにどのアドレスがセットされていても無視してメーリングリスト宛に送信します。
他の部分は通常のreply.templateと同じですので、Toヘッダセット部分のみ掲載します。
To: {
@Progn(
@Set('ml_addr', @Load('ml_address.txt')),
@If(
@Contain($ml_addr, @Address(To)),
@Decode(To),
@If(@Exist('Reply-To'),@Decode(Reply-To),@Decode(From))
)
)
}
予めメーリングリストの投稿アドレスを羅列した'ml_address.txt'をメールボックスディレクトリに作成しておきます。(サンプルを参照して下さい)
あとは、そしてreply_ml.templateをreply.templateにリネームして置換えておけば、返信時にメーリングリストのメールかどうか自動でチェックしてメーリングリストのメールならばReply-Toヘッダを無視してメーリングリスト宛のメールを作成します。
新たにメーリングリストへ入会したときなどに'ml_address.txt'のメンテナンスを忘れないようにしましょう。
但し、複数のメーリングリストや個人のアドレスがToヘッダにある場合やメーリングリストへCcされた場合などはうまく動作しませんので、Reply-Toヘッダなどが優先されてしまいます。
それらも考慮するのであれば、一旦受信したメールをメーリングリスト毎のフォルダへ振り分け、reply_[フォルダID].templateをそのフォルダ毎に作成してToヘッダに直接メーリングリストの投稿アドレスをセットしてしまうのが一番いいでしょう。
(4) メールの各種情報表示
このマニュアルに同梱しているinfo.templateとinfo.txtを同じディレクトリに置きます。
尚、このサンプルは出来るだけ多くの関数を利用することを目的としていますのでほんとうはもっと簡単に記述できる部分がたくさんありますが、個々の関数の利用方法のサンプルとしてご覧ください。
info.template
{@Progn(@MessageBox('メールの情報を表示します')@Load('info.txt',@True()))}
info.txt
info.txtについては、実際のファイルをご覧下さい。
情報を表示させたいメールを選択し、[Mail]-[Select Template...]またはCキーで[Select Template]ダイアログを開き、info.templateを選択しEnterキーを押下、またはOKボタンをクリックするとメッセージボックスが表示され、更にEnterキーを押下すると以下のようなメールの情報がエディタに渡されます。
QMAIL2の標準のエディットビューでは[Tool]-[Raw Edit]を選択して下さい。しかし、間違えて送信しないようにテンプレート選択時にUse External Editorをチェックしたほうがいいでしょう。
表示される情報はヘッダ部分では、特にIn-Reply-To、References、Content-Typeヘッダについてはある程度見やすく編集しており、テキスト部分の最初の3行表示については改行のみの行は削除しています。また、添付ファイル名も1行に編集しています。
【Header Information】 Date: Mon, 01 Jan 2001 19:04:48 +0900 Subject: [Qs:99999] Re: こんにちは From: "Q太郎" <qtaro@hogehoge.ne.jp> To: Qs@tky.net Reply-To: Qs@tky.net Message-Id: <200101011904.FMLAAA99999.Qs@tky.net> In-Reply-To: <200101011456.FMLAAA88888..Qs@tky.net> References: <200012311400.FMLAAA66666.Qs@tky.net> <20012312020.FMLAAA77777.Qs@tky.net> <200101011456.FMLAAA88888.Qs@tky.net> Content-Type: multipart/mixed; boundary="--------------------9938044030453707" Content-Transfer-Encoding: 7bit 【Text Information】 [Text First 3 Lines([Qs:99999] Re: こんにちは)] |みなさん、こんにちは。Q太郎です。 |QMAIL2マクロのマニュアルの最新版を添付します。 |添削お願いします。 Attachment File : qmacro1.lzh, qmacro2.lzh 【Mail Status】 Seen : on Replied : on Forwarded : off Marked : on Multipart : on (3 Parts) Sent : off Draft : off Partial : off Deleted : off Folder : Inbox Mail Size : 37212 Byte Header Size : 1446 Byte Passed 7 Days : yes 【Account Information】 Current Account : HogeHoge (hogehoge@fugafuga.ne.jp) Current SubAccount : Private_LAN Current Identity : Private (hogehoge@fugafuga.ne.jp) Mail Account : 未設定 Mail Identity : Kaisya (hogehoge@harahara.co.jp) 【Other Information】 MUA : QMAIL 2.0.0 / Windows CE 3.00 / ARM Process-ID : 4294097391 Check Machine : SDOLPHIN OS : Windows 95 B Check Date : 2001/01/02 11:05:43 Checked by : Qtaro Nakamura <hogehoge@fugafuga.ne.jp> |
振り分けルールは各アカウントのディレクトリにある.rulesファイルに以下の書式で記述します。
検索式 <Tab> 振り分け先フォルダ名 [<Tab> オプション]
検索式を設定するために 2. 関数リファレンス に書かれている関数のうち@AddressBook()/@AddressBook2()/@Clipboard()/@ParseUrl()以外の関数が利用できます。
検索式の戻り値が真となった場合にそのメールを振り分け先フォルダへ移動します。
フォルダを階層化している場合、振り分け先フォルダ名は階層ごとに'/'で区切って記入します。
つまり、'親フォルダ名/子フォルダ名/孫フォルダ名/...'という感じです。
また、別のアカウントのフォルダへ振り分ける場合は、//アカウント名/を先頭に付加します。
つまり、'//アカウント名/親フォルダ名/子フォルダ名/孫フォルダ名/...'という感じです。また、'.'を指定すると現在のフォルダを指します。
オプションとしては以下のものがあります。
-c, --copy | : | コピー(デフォルトでは移動) |
-t <template name>, --template <template name> | : | 振り分けるときに通すテンプレート名 |
-p <name>=<value>, --param <name>=<value> | : | テンプレートに渡されるパラメータ(複数可) |
振り分けルールはフォルダ毎に設定可能で、その場合は[フォルダID].rulesという名前で作成し、振り分け時には[カレントのフォルダID].rulesがあればそちらを実行します。
この項では実際にメールの振り分けを行う際によく使うパターンを例示します。
(1) Subjectに特定の文字列が付加されているメールを振り分ける場合
@BeginWith(@Column('subject'), '[Qs:') <Tab> ml/Qs
Subjectが'[Qs:'で始っているメールをml/Qsというフォルダへ移動します。
(2) 特定のヘッダが存在するメールを振り分ける場合
@Exist('X-ML-Name') <Tab> Mailinglist
X-ML-NameヘッダがあるメールをMailinglistというフォルダへ移動します。
(3) 既読のメールを振り分ける場合
@Seen() <Tab> Trash
既読メールをTrashへ移動します。
(4) 特定のヘッダの内容で振り分ける場合
@Contain(To,@Address(@I())) <Tab> DM
Toヘッダに自分のアドレスが含まれているメールをDMというフォルダへ移動します。
(5) 経過日数で振り分ける場合
@Passed(7) <Tab> Trash
7日以上経過しているメールをTrashへ移動します。
(6) 特定の人からのメールを自動転送する場合
@Contain(From, 'hogehoge@abc.com') <Tab> Outbox <Tab> -c -t forward_auto -p addr=fugafuga@def.com
Fromが'hogehoge@abc.com'だったら、forward_autoテンプレート(QMAIL2に同梱)を通してコピーを'fugafuga@def.com'に転送出来るようにOutboxへ入れます。
(7) メールの余計なヘッダを取り除きコンパクトにする場合
@True() <Tab> . <Tab> -t compact
QMAIL2に同梱されているcompactテンプレートを通してメールの不要なヘッダを取り除きます。メールは同一フォルダへ保存されます。
(1) 既読かつSubjectに特定の文字列が付加されているメールを振り分ける場合
@And(@Seen(),@BeginWith(@Column('Subject'),'[Qs:')) <Tab> ml/Qs
既読かつSubjectが'[Qs:'で始っているメールをml/Qsというフォルダに移動します。
(2) 不要なメールをTrashへ振り分ける場合1
@Or(@And(@Seen(),@Not(@Marked())),@Sent()) <Tab> Trash
既読かつマークされていないメールと送信済みメールをTrashへ移動します。
(ほんとうにこれらのメールが不要かどうかはユーザによります。)
(3) 不要なメールをTrashへ振り分ける場合2
@If(@Equal(@Folder(@True()), 'Sentbox'),@Sent(),@And(@Seen(),@Not(@Marked()))) <Tab> Trash
そのメールがSentboxにありかつ送信済みメールか、そうでなければ既読かつマークされていないメールをTrashへ移動します。
(ほんとうにこれらのメールが不要かどうかはユーザによります。)
(4) 一定期間経過した既読メールをTrashへ振り分ける場合
@And(@Seen(), @Passed(14)) <Tab> Trash
そのメールが既読でかつ、14日以上経過している場合にTrashへ移動します
以上のように複数の検索式を@And()や@Or()で結合してしまうのが一般的な使い方ですが、ほとんどの関数が利用可能ですので必要であれば更に複雑な検索式を使うことも可能です。
[Edit]-[Search...](Ctrl+F)で[Search]ダイアログを開き、検索を行う際に'Macro'にチェックし、検索文字列の代わりにマクロを入力することでマクロを利用した検索が行えます。
この場合、マクロは振り分け時の検索式と同じように入力します。
本文に'QMAIL'という文字列を含むメールを取り出す場合は、
@Contain(@Body('',@True(), @True()),"QMAIL")
この程度であれば、わざわざマクロを利用する必要はないかもしれません。
ある日付の既読メールだけを取り出す場合は、
@And(@Seen(),@Or(@Contain(Date," 1 Jan 2001"),@Contain(Date,"01 Jan 2001")))
上記例だとDateヘッダが2001年1月1日の既読メールを検索します。
マクロを利用することで、より複雑でより細かな検索が可能になります。