fake sendmail for windows を使って、PHP でごく普通に( mb_send_mail で )メール送信

fake sendmail は、XAMPP に同梱されています

メールサーバは、フリーメールで可能で、簡単な設定で利用できます。以下のサンプルは、さくらインターネット で動作確認しました。

▼ 手順

🔴 ダウンロード

配布元より、sendmail.zip をダウンロードして、解凍します。
( XAMPP には sendmail フォルダがあります )

🔴 sendmail.exe の動作テスト

まず、sendmail.ini をエディタで開いて、四つのエントリを指定します
▼ さくらインターネットを使う場合の設定

smtp_server=初期ドメイン
smtp_port=587
auth_username=ユーザ@初期ドメイン
auth_password=パスワード

※ smtp_ssl=auto となっており、デフォルトで ssl で実行され、使え無い場合は TLS を使おうとします

🔴 php.ini の設定

sendmail_path = "C:\tools\sendmail\sendmail.exe"

実際の sendmail.exe のパスを “” で囲んで指定します。
※ この場合、エラーログは “C:\tools\sendmail\error.log” です( デフォルト )

🔴 PHP のコード ( UTF8 BOM なしで記述します )

HTML の input 要素で type=”text” name=”fld_to”、name=”fld_subject”、name=”fld_body”、を form 要素の中に記述し、form 要素に method=”post” action=”以下の PHP のファイルのパス” を指定し、form 要素の中に input 要素で type=”submit” を指定したボタンを記述します。

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

$from_header = "From: " . mb_encode_mimeheader( mb_convert_encoding("差出人","iso-2022-jp") );

$from_header .= " <{$GLOBALS["mail"]}>";

$result = mb_send_mail($_POST["fld_to"], $_POST["fld_subject"], $_POST["fld_body"], $from_header);
if ( $result ) {
	$error = "OK";
}
else {
	$error = "ERROR";
}

print mb_language() . "
"; print $error;

$GLOBALS[“mail”] は、メール形式であれば良いですが、通常ならば auth_username で指定したメールアドレスを記述します。

PHP, 記録

VBScript( Jscript ) を『管理者として実行する』には、Shell の runas ( 右クリックメニューの実行と同等 ) で実現

VBScript を『管理者として実行する』には、以下の内容ををスクリプトの先頭に記述します

🔻 VBScript

Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

Wscript.Echo "ここは管理者権限で実行されます"

🔻 Jscript

※ Jscript は WScript 等、大文字小文字の区別があるので注意です。
var obj = new ActiveXObject("Shell.Application");
if ( WScript.Arguments.length == 0 ) {
	obj.ShellExecute( "wscript.exe", WScript.ScriptFullName + " runas", "", "runas", 1 );
	WScript.Quit();
}

WScript.Echo( "ここは管理者権限で実行されます" );

Shell.ShellExecute method

これは、VBScript から利用可能な Shell の機能を使って、右クリックメニューにある『管理者として実行』を実行する方法です。ここでは日本語では無く runas と言う文字列を使って管理者として実行させています。

但し、引数がなかった場合の処理としては処理終了します。ですからこのスクリプトでは、引数をダミーで一つセットして( この場合一つめの runas がそうです )自分自身を再度呼び出しています。

つまり、Windows からすれば二度目の実行が管理者としての実行になります。

この場合は、スクリプトに引数を渡す事ができません。もし渡したい場合は、違ったトリックを使う必要があるのに注意して下さい。(その場合は、外部ファイルから入力するのがもっとも簡単で確実だと思います)




TCPDF をダウンロードして、Windows の任意のフォルダで TCPDF 同梱のサンプルを実行する為の設定

2024/08/04 時点で 6.7.5

テスト環境

❶ Windows11 64ビット + XAMPP  8.2.12 + php ( 8.2.12 )
❷ TCPDF ( C:\app\TCPDF-main として解凍 )

テスト内容

TCPDF-main.zip を解凍すると、TCPDF-main\examples というフォルダがあり、そこにサンプルが沢山ありますが、それを他のフォルダでも同様に動作させます。

手順

❶ example フォルダを全て 任意のフォルダにコピー( アプリの実行環境になります )
❷ そのフォルダを XAMPP で、PHP が動作するようにする
❸ tcpdf_include.php を以下のように書き換える
( set_include_path までを先頭に、require_once('tcpdf.php'); は追加、または全部以下に書き換え )
<?php
$path = "/app/TCPDF-main";
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
require_once('config/tcpdf_config_alt.php');
require_once('tcpdf.php');
?>

barcodes は、tcpdf_barcodes_1d_include.php と tcpdf_barcodes_2d_include.php の
中身の配列の参照パスの一つを realpath('/app/TCPDF-main/tcpdf_barcodes_1d.php')
のように変更すれば動作します( tcpdf_barcodes_2d_include.php も同じ )
// Include the TCPDF 1D barcode class (search the class on the following directories).
$tcpdf_barcodes_1d_include_dirs = array(
    realpath(dirname(__FILE__) . '/../../tcpdf_barcodes_1d.php'),// True source file
	realpath('/app/TCPDF-main/tcpdf_barcodes_1d.php'),// Relative from $PWD
	'/usr/share/php/tcpdf/tcpdf_barcodes_1d.php',
	'/usr/share/tcpdf/tcpdf_barcodes_1d.php',
	'/usr/share/php-tcpdf/tcpdf_barcodes_1d.php',
	'/var/www/tcpdf/tcpdf_barcodes_1d.php',
	'/var/www/html/tcpdf/tcpdf_barcodes_1d.php',
	'/usr/local/apache2/htdocs/tcpdf/tcpdf_barcodes_1d.php'
);


フォントの追加は、tcpdf_addfont.php で作成したフォントファイルを fonts フォルダにコピーします。
埋め込み : c:\php\php tcpdf_addfont.php -t TrueTypeUnicode -f 32 -i xxxxxxxx.ttf 非埋め込み : c:\php\php tcpdf_addfont.php -t CID0JP -f 32 -i xxxxxxxx.ttf -t は省略すると フォントファイルをチェックして通常は TrueTypeUnicode になり、-f は省略すると 32 です。 ※ -b を指定すると、character bounding box の情報を php のフォントファイルに書き込みます( If true includes the character bounding box information on the php font file. )
OTF から TTF の変換はこちらから

Windows の Docker Ubuntu に SSH で接続する

🔴 Dockerfile
FROM ubuntu

USER root

# sshサーバをインストール
RUN apt-get update && apt-get install -y openssh-server

# sshd用
RUN mkdir /var/run/sshd

# rootのパスワード
RUN echo 'root:pass' | chpasswd

# sshのrootでのアクセスを許可
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

docker build -t default_repo:default_tag .

ssh root@localhost -p 22

参考 1
参考 2

以下が出たら対象の記述を削除して再実行( 登録される )

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:XBwm/W+C5V4fTIce7Pmo4GaX7Wnut+FkkQM7Bj4WWEc.
Please contact your system administrator.
Add correct host key in C:\\Users\\lightbox/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in C:\\Users\\lightbox/.ssh/known_hosts:6
Host key for localhost has changed and you have requested strict checking.
Host key verification failed.

Notion まとめリンク

WSL に Ubuntu をインストール

まず、インストール可能なディストリビューションの一覧を表示します。

wsl -l -o

wsl --install -d Ubuntu

その他、コマンドライン

-l [オプション]
    ディストリビューションを一覧表示します。
    -v オプション
        すべてのディストリビューションに関する詳細情報を表示します

-s <ディストリビューション>
    ディストリビューションを既定として設定します。

-t <ディストリビューション>
    指定されたディストリビューションを終了します。

--unregister <ディストリビューション>
    ディストリビューションの登録を解除し、ルート ファイルシステムを削除します。


通常のインストールですと、完全な削除は以下から



WSL の最新バージョンの確認

▼ GitHub で最新バージョンが確認できます。
一番上にあるのは、プレリリースなので、latest が通常の最新になります。

WSL プレリリース

WSL latest

今ですと、▼ こうなります。

wsl --update

すでにそのバージョンがインストールされている場合は以下のように表示されます

更新プログラムを確認しています。
Linux 用 Windows サブシステムの最新バージョンは既にインストールされています。

JavaScript : window オブジェクトのプロパティとしてグローバル変数を定義する

実際は、右辺にオブジェクトをセットして専用の名前空間で参照できるライブラリのインスタンスとして利用します。

ルートで var で定義する変数と厳密には違うようですが、事実上同じと思っていいと思います。ですから、Fucntion 内でグルーバルな変数を利用したい場合は、window オブジェクトを使用すると良いでしょう
window.変数名 = "lightbox"

または

window["変数名"] = "lightbox"

例えば、ライブラリを簡単にまとめると以下のような定義のしかたになります。
(function(){

    S = {

        // いろいろな定義

        },

    // いろいろな定義
    ;

    window['MyLIB'] = S;

})();


(function(){})(); は、関数を定義して呼び出すのを一度に行う書き方で、無名関数を定義して () で実行しています
<script>

window["MyLIB"] = "lightbox";


(function(){

	alert(MyLIB);

})();

</script>




ブラウザ上で変更可能な選択した文字列を英語から日本語に翻訳するブックマークレット

最初、claude.ai に作成してもらいました。ai が作成するチャットのタイトルが英語で困っていたので。

javascript:(function(){
    var selectedText = window.getSelection().toString();
    if (selectedText) {
        fetch('https://api.mymemory.translated.net/get?q=' + encodeURIComponent(selectedText) + '&langpair=en|ja')
        .then(response => response.json())
        .then(data => {
            var translatedText = data.responseData.translatedText;
            document.execCommand('insertText', false, translatedText);
        })
        .catch(error => console.error('Error:', error));
    } else {
        alert('テキストを選択してください。');
    }
})();

これで動作はしていますが、api.mymemory.translated.net と言う良く詳細の解らない API が使われているので、
同じ事をもう一度 claude.ai に聞いてみると、Google の API で返して来ました。
しかし、今度はコードがおかしくてうまく動きませんでした

原因究明するより、動作しているほうのコードに、主体の API を転記しました。

javascript:(function(){
    var selectedText = window.getSelection().toString();
    if (selectedText) {
        fetch(`https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=ja&dt=t&q=${encodeURIComponent(selectedText)}`)
        .then(response => response.json())
        .then(data => {
            var translatedText = data[0].map(item => item[0]).join('');
            document.execCommand('insertText', false, translatedText);
        })
        .catch(error => console.error('Error:', error));
    } else {
        alert('テキストを選択してください。');
    }
})();


1回目で動いたのは運が良かったと言わざるを得ないので、今後は数回。できれば AI も変えて試すのがいいと思いました。