// ==UserScript== // @name tr GMail Auto Fill Bcc Field by From Address // @version 1.3 // @author HOSHINO Ken'ichi @ 0stage (http://0stage.jp/) // @description This script insert a mail address into bcc field. // @namespace http://0stage.jp/ // @include http*://mail.google.com/mail/* // ==/UserScript== // trGmailAutoBcc.user.js ver.1.3 // // 0stage HOSHINO Ken'ichi // http://blog.0stage.jp/article/168637046.html // // chrome ブラウザ上で GMail サイトから送信メールを作成する際に // BccフィールドにFromフィールドのアドレスを自動挿入するスクリプトです // // 利用、改変は自由に行っていただいて構いませんが // 公開する際は、参照した元のスクリプトとして // 本スクリプトの掲載ページURLと合わせてご紹介ください // // 更新履歴 // 2011/01/09 使用メールアドレスが1つのみの時にメールアドレスが挿入されない不具合を修正 // 2011/01/10 ユーザが直接bccアドレスを指定するための変数用意 // 2011/06/18 Chrome ver.12 あたりから bcc フィールドにメールアドレスが入らなくなった不具合を修正 // ただしbccフィールドは編集できないという仕様になります // 使用言語に合わせて修正 const BCC_SPAN_INNER_TEXT = 'Bcc を追加'; // bccに入れるアドレスを直接指定したい場合はこの変数に入れてください var fixed_address = ""; // var fixed_address = "foo@example.com"; function setBccAddressHandler(e) { var i, j; var iframe_document = document.getElementById("canvas_frame").contentDocument; var gmail_address = ""; // 使用中の gmail アドレスを取得 var from_address = ""; // 使用しているGMailアカウントのアドレスを取得 var title_nodes = document.getElementsByTagName("title"); if (title_nodes.length > 0) { var address_list = title_nodes[0].innerText.match(/[a-zA-Z0-9.]+@gmail\.com/); if (address_list != null) { gmail_address = address_list[0]; } } // とりあえず、GMail アカウントアドレスをデフォルトのBCCアドレスとして設定 if (gmail_address != "") { from_address = gmail_address; } // 複数アドレス登録している場合のfrom行のアドレスを取得 var nodes = iframe_document.getElementsByName("from"); for (i = 0; i < nodes.length; i++) { var node = nodes[i]; switch(node.tagName) { case "SELECT": // 新規作成と from 変更選択の場合 var options = node.getElementsByTagName("option"); for (j = 0; j < options.length; j++) { if (options[j].selected) { from_address = options[j].value; } } break; case "INPUT": // 返信の場合で from 変更を選んでいないとき from_address = node.value; break; } } if (fixed_address != "") { from_address = fixed_address; } // bcc フィールドを表示するためにボタンを押す var spans = iframe_document.getElementsByTagName("span"); for (i = 0; i < spans.length; i++) { if (spans[i].innerText == BCC_SPAN_INNER_TEXT) { var node = spans[i]; // イベントディスパッチしてbccフィールドを開かせる var event = node.ownerDocument.createEvent("MouseEvents"); event.initMouseEvent('click', true, // can bubble true, // cancellable node.ownerDocument.defaultView, 1, // clicks 50, 50, // screen coordinates 50, 50, // client coordinates false, false, false, false, // control/alt/shift/meta 0, // button, node); node.dispatchEvent(event); } } if (from_address != "") { // bcc フィールドに from 行のアドレスを書き込む var bcc_named = iframe_document.getElementsByName("bcc"); for (i = 0; i < bcc_named.length; i++) { if (bcc_named[i].tagName == "TEXTAREA") { // コンテントスクリプトから innerText を更新しても // スクリプト上では反映されないようだ // // はじめに node.innerText = ""; だったとする // node.innerText = "foo"; // alert(node.innerText); // 空文字列が出力され foo は出力されない // その上で、innerText に変更がないと判断すると実際の代入が行われない // 説明するの面倒なので、とりあえず、下記を追加すると、 // 同じ内容(from_address)が毎回書き込まれる // bcc_named[i].innerText = ""; // bcc_named[i].innerText = from_address; // 上記廃止 // chrome version 12? から // bcc の textarea の innerText を直接編集仕様としても // 何故かページ内に反映しない(デベロッパーツールでみるとソース上は反映されてる) // という奇っ怪な問題が解決できなくなったので // 最初にあった textarea を一回削除してから再登録するという // 力技で対応 // alert("|" + bcc_named[i].getAttribute("trautobcc") + "|"); // 実際の textarea の attribute を参照して // コピーのエレメントを作成 var element = document.createElement('textarea'); element.innerText = from_address; for (j = 0; j < bcc_named[i].attributes.length; j++) { element.setAttribute(bcc_named[i].attributes[j].name, bcc_named[i].attributes[j].value); } // 親ノードを引っ張ってきて、現状の textarea を削除して // 新しくつくった textarea を登録 var parent = bcc_named[i].parentNode; var children = parent.childNodes; parent.removeChild(bcc_named[i]); parent.appendChild(element); } } } } // 上記の処理を gmail のページで1秒に1回の割合で実行 if (document.getElementById("canvas_frame")) { // id canvas_frame のノードを含んでいるのが親ドキュメントです var timer_id_set_bcc_address = setInterval(setBccAddressHandler, 1000); }