|
マクロ改良しました。「あとで送信/今すぐ送信時」の自動起動マクロに指定して
いてもうまく動くように出来たと思います。URLの自動折り返し禁止もやってます。
あと、返信メール/転送メールやHTML形式メールでもうまく動くようになってるの
は、まさに今日、もみじさんの話があって直した所でした。
----------------------------------------------------------------------------
--------------------
// 添付ファイルをOneDrive経由渡し-パスワード別便.mac by 斉藤秀夫
// Version 1.0 2023.04.10
// Version 1.1 2024.04.08 返信メール/転送メールの場合はカーソル位置にリン
クを挿入するようにした。
// HTMLメールにも対応。
// Version 1.2 2024.04.09 「あとで送信/今すぐ送信」の自動起動マクロとして
使えるようにする。
//
// このマクロは添付ファイルをOneDriveにアップロードしてパスワード付きの共有
// リンクを作成し、そのリンクを送りつつ、パスワードは別便で送る用のマクロです。
// 添付ファイルをパスワード付きZipで圧縮して送りつつ、パスワードは別便で送る、
// いわゆる「PPAP」の代替となるマクロです。
//
// このマクロは秀丸メールのVersion 7.19以上でないと使えません。
//
// このマクロはOneDriveに添付ファイルをアップロードした後にパスワードおよび
// 期限付きの共有リンクを作成します。パスワードおよび期限付きの共有リンクを
// 作成するには有料版のマイクロソフトアカウントが必要です。Microsoft Office365
// のサブスクリプションに入っている人には有料版のアカウントが付いてくるので、
// そのアカウントを使えばOKです。Office365のサブスクリプション契約が無い
// 場合は個人のマイクロソフトアカウントを有料アカウントにアップグレードする
// 方法もあります。
//
// OneDriveにアップロードする用に、あらかじめ、「設定 - 全般的な設定...」の
// 「ウイルス対策 - 詳細」の中にある「Officeファイルをサンドボックス内で開く
// 用のOAuthログイン」ボタンを押して、OAuthログインをしておく必要があります。
// それが無いとアップロードに失敗します。
//
//パスワードの長さを指定します。標準は10です。9以下を指定しても最低10文
字になります。
#passwordlength = 10;
//共有URLの有効期限の日数を指定します。普通は7でいいと思います。
//最低1日〜最高で30日までになります。
#expirationdate = 7;
loaddll "tkinfo.dll";
#version = dllfunc("HidemaruMailVersion") * 100 + dllfunc("HidemaruMailV
ersionBeta");
if( #version < 71999 ) {
message "このマクロを実行するには秀丸メールのVersion 7.19以上が必要
です。";
endmacro;
}
$home = dllfuncstr("HomeDir");
$account = dllfuncstr("CurrentAccount");
if( dllfunc("IsTuruKameMain") ) {
message "このマクロは送信するメール専用です。";
endmacro;
}
if( dllfunc("MailType") == 3 || readonly ) {
message "受信したメールではこのマクロは使えません。";
endmacro;
}
if( dllfuncstr("CurrentHeader", "To" ) == "" ) {
message "宛先がまだ指定されてません。このマクロは宛先/件名を入力した
後に実行してください。";
endmacro;
}
if( dllfuncstr("CurrentHeader", "Subject" ) == "" ) {
message "件名がまだ指定されてません。このマクロは宛先/件名を入力した
後に実行してください。";
endmacro;
}
#reason = dllfunc("ReasonMacroStarted");
if( #reason == 5 ) { //あとで送信/今すぐ送信
$$s = dllfuncstr("Bypass_GetWindowText", hidemaruhandle(0) );
if( leftstr( $$s, 6 ) == "今すぐ" ) {
#sendnow = 1;
} else {
#sendlater = 1;
}
}
#cAttach = 0;
$uploadList = "";
while(1) {
$attach = dllfuncstr("CurrentHeader2", "X-Attach", #cAttach );
if( $attach == "" ) break;
if( $uploadList != "" ) {
$uploadList = $uploadList + ",";
}
$uploadList = $uploadList + $home + $account + "\\" + $attach;
#x = strrstr( $attach, "\\" );
if( #x >= 0 ) {
$baseName = midstr( $attach, #x + 1 );
} else {
$baseName = $attach;
}
$aBaseName[#cAttach] = $baseName;
$aAttach[#cAttach] = $attach;
#cAttach = #cAttach + 1;
}
if( #cAttach == 0 ) {
if( #reason != 5 ) { //2024.04.09 自動起動の場合はメッセージ表示
しない。
message "添付ファイルは1つもありません。";
}
endmacro;
}
question "添付ファイルをOneDriveにアップロードしてパスワード付き共有リン
クを作成します。続行してもいいですか?";
if( result != yes ) {
endmacro;
}
if( #reason == 5 ) { //あとで送信/今すぐ送信
//ここで送信取り消ししておかないといけない。
#n = dllfunc("SetCancel", 1);
}
if( #passwordlength < 10 ) { //2021.04.19 最低10文字にする。
#passwordlength = 10;
}
$password = "";
#rand_init = (tickcount & 0x7FFFFFFF) + val(second) + val(minute) + val
(hour);
$asciilist = "#$%&*+-/0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm
nopqrstuvwxyz";
#asciilistlen = strlen($asciilist);
#i = 0;
while( #i < #passwordlength ) {
if( #i == 0 ) {
#rand = #rand_init / #asciilistlen % #asciilistlen;
} else if( #i == 1 ) {
#rand = #rand_init % #asciilistlen;
} else {
//ヒラメさんの「ランダムなパスワードを生成するマクロ」をパクらせ
てもらう。
if( #i == 2 ) {
#rand = #rand_init;
}
call Random #rand;
#rand = ##return;
}
#randPositive = #rand;
if( #randPositive < 0 ) {
#randPositive = - #randPositive; //負の数だとダメ。
}
$password = $password + midstr( $asciilist, #randPositive % #asciili
stlen, 1 );
#i = #i + 1;
}
if( strstr( $password, "0" ) < 0
&& strstr( $password, "1" ) < 0
&& strstr( $password, "2" ) < 0
&& strstr( $password, "3" ) < 0
&& strstr( $password, "4" ) < 0
&& strstr( $password, "5" ) < 0
&& strstr( $password, "6" ) < 0
&& strstr( $password, "7" ) < 0
&& strstr( $password, "8" ) < 0
&& strstr( $password, "9" ) < 0 ) {
//数字が最低1つ入ってないとダメなので、無理矢理数字を付けてしまう。
call Random #rand;
#rand = ##return;
#randPositive = #rand;
if( #randPositive < 0 ) {
#randPositive = - #randPositive; //負の数だとダメ。
}
$password = $password + midstr( "0123456789", #randPositive % 10, 1 );
}
//フォルダの名前 = YYYY年\YYYY-MM-DD-メールアドレス とする。
$folder = year + "-" + month + "-" + day + "-" + dllfuncstr("SetNameOnly
",dllfuncstr("CurrentHeader","To")) + "様";
$folder = dllfuncstr("ValidateForFileName", $folder);
$folder = "\\添付ファイル渡し\\" + year + "年\\" + $folder;
//「ドキュメント」フォルダ配下に生成する?
$shareUrl = dllfuncstr("OneDriveUpload", $uploadList, $folder, $password,
#expirationdate);
if( $shareUrl == "" ) {
message "OneDriveへのアップロードに失敗しました。詳しくは「送受信 -
直前のやりとり記録」を参照ください。";
endmacro;
}
$uploadedFolder = dllfuncstr("OneDriveUpload_GetFolder");
#htmlviewer = dllfunc("IsHtmlMailViewerVisible");
if( #htmlviewer ) {
#n = dllfunc("HtmlEdit", "off");
}
#mailtype = dllfunc("MailType");
if( #mailtype == 1 || #mailtype == 2 ) {
//返信メールまたは転送メールの場合はカーソル位置に挿入する?
insert "\n";
} else {
gofileend;
}
if( #htmlviewer ) {
insert "<div>-------------------------------------------------------
--------------</div>\n";
} else {
insert "------------------------------------------------------------
---------\n";
}
#i= 0;
while( #i < #cAttach ) {
$basename = dllfuncstr("DecodeAttachFileName", $aBaseName[#i] );
if( #htmlviewer ) {
$basename = dllfuncstr("PlainTextToHtml", $basename );
if( #cAttach >= 2 ) {
insert "<div>添付ファイル(" + str(#i+1) + ") = " + $basename
+ "</div>\n";
} else {
insert "<div>添付ファイル = " + $basename + "</div>\n";
}
} else {
if( #cAttach >= 2 ) {
insert "添付ファイル(" + str(#i+1) + ") = " + $basename + "\n";
} else {
insert "添付ファイル = " + $basename + "\n";
}
}
#i = #i + 1;
}
if( #htmlviewer ) {
insert "<div>フォルダ = " + dllfuncstr("PlainTextToHtml", $uploadedF
older ) + "</div>\n";
insert "<div>URLの有効日数 = " + str(#expirationdate) + "日間</div>\n";
insert "<div>パスワード = (別便のメールにて連絡)</div>\n";
insert "<div>ダウンロードURL = <a href=\"" + $shareUrl + "\">" + dll
funcstr("PlainTextToHtml", $shareUrl ) + "</a></div>\n";
} else {
insert "フォルダ = " + $uploadedFolder + "\n";
insert "URLの有効日数 = " + str(#expirationdate) + "日間\n";
insert "パスワード = (別便のメールにて連絡)\n";
insert "ダウンロードURL = " + $shareUrl + "\n";
if( dllfunc("IsOrikaeshi") ) {
//現在行の自動折り返し禁止を使ってURLの折り返し禁止にする。
up;
#n = dllfunc("SwitchDontOrikaeshi");
golineend2;
right;
}
}
// 添付ファイルの取り消し
#i = 0;
while( #i < #cAttach ) {
#n = dllfunc("UndoAttach", $aAttach[#i]);
#i = #i + 1;
}
if( #htmlviewer ) {
#n = dllfunc("HtmlEdit", "on");
}
//パスワード通知メールの作成
$to = dllfuncstr("CurrentHeaderUnited", "To");
$cc = dllfuncstr("CurrentHeaderUnited", "Cc"); //バグ修正。Cc:
/ Bcc:対応。
$bcc = dllfuncstr("CurrentHeaderUnited", "Bcc"); //バグ修正。Cc:
/ Bcc:対応。
$toname = dllfuncstr("SetNameOnly", $to);
$subject = dllfuncstr("CurrentHeader", "Subject");
$sign = dllfuncstr("CurrentSignName");
#attachhidemaru = hidemaruhandle(0);
#n = dllfunc("NewMail");
#n = dllfunc("SwitchSign", ""); //署名無しに一回切り替え
#n = dllfunc("SetHeaderUnited", "To", $to);
if( $cc != "" ) {
#n = dllfunc("SetHeaderUnited", "Cc", $cc);
}
if( $bcc != "" ) {
#n = dllfunc("SetHeaderUnited", "Bcc", $bcc);
}
#n = dllfunc("SetHeader", "Subject", "ダウンロード用パスワードの通知 - "
+ $subject );
gofiletop;
beginsel;
gofileend;
delete;
insert $toname + " 様\nクラウドストレージ(OneDrive)から添付ファイルを
ダウンロードする用のパスワードをお知らせします。\n\n" +
"メールの件名: " + $subject + "\n" +
"パスワード: " + $password + "\n" +
"\n" +
"よろしくお願いします。\n";
if( leftstr($sign, 1) == "\\" ) {
//切り替えできない
$signContent = dllfuncstr("LoadTemplate", "sign", $sign);
if( $signContent != "" ) {
insert "\n" + $signContent;
}
} else {
#n = dllfunc("SwitchSign", $sign); //署名をここで切り替え
}
gofiletop;
#passwordhidemaru = hidemaruhandle(0);
if( #sendlater ) {
// 「あとで送信」の自動起動の場合
sleep 1000; //「今すぐ送信」を終わらせる用。
setactivehidemaru #attachhidemaru;
#n = dllfunc("SendLater");
if( #n == 0 ) {
//エラー
endmacro;
}
setactivehidemaru #passwordhidemaru;
closehidemaru #attachhidemaru;
#n = dllfunc("SendLater");
if( #n != 0 ) {
//パスワードメールの送信成功時エディタ終了。
exit;
}
} else if( #sendnow ) {
// 「今すぐで送信」の自動起動の場合
sleep 1000; //「今すぐ送信」を終わらせる用。
setactivehidemaru #attachhidemaru;
#n = dllfunc("SendNow");
if( #n == 0 ) {
//エラー
endmacro;
}
setactivehidemaru #passwordhidemaru;
closehidemaru #attachhidemaru;
#n = dllfunc("SendNow");
if( #n != 0 ) {
//パスワードメールの送信成功時エディタ終了。
exit;
}
} else {
setactivehidemaru #attachhidemaru;
}
endmacro;
//ヒラメさんマクロそのまま
Random:
// 疑似乱数を生成する
// https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E5%90%88%E5%90%8C%E6%B3%95
// call Random #1
// #1: ランダムシード
// 戻り値 ##return: 乱数
// 使用方法
// refreshdatetime;
// #rnd = tickcount;
// call Random #rnd;
// #rnd = ##return;
// message str(#rnd);
// call Random #rnd; //先に取得したランダム値を指定すること
// #rnd = ##return;
// message str(#rnd);
##r = (48271 * ##1) % 2147483647; //2^31-1=2147483647
return ##r;
|
|