カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

ファイルを添付してメール送信3

PHPのmb_send_mail関数でファイルを添付してメールを送信するスクリプト

$to   = "mailto@example.jp";
$from = "mailfrom@example.jp";

$subject  = "件名";

$mailbody = "メール本文\n";

$boundary = md5(uniqid(rand())); //バウンダリー文字(パートの境界)


$header = "From: $to\n"
        . "Reply-To: $from\n"
        . "X-Mailer: PHP/".phpversion()."\n"
        . "MIME-version: 1.0\n"
        . "Content-Type: multipart/mixed;\n"
        . "\tboundary=\"$boundary\"\n";

$msg = "This is a multi-part message in MIME format.\n\n"
     . "--$boundary\n"
     . "Content-Type: text/plain; charset=iso-2022-jp\n"
     . "Content-Transfer-Encoding: 7bit\n\n"

     . $mailbody."\n"

     . "\n";


// 画像(upfileという名前でアップロードされたとする)
if($_FILES["upfile"]["error"] == UPLOAD_ERR_OK) {

    $tmp   = $_FILES["upfile"]["tmp_name"];
    $name  = $_FILES["upfile"]["name"];
    $size  = $_FILES["upfile"]["size"];

    $array = explode(".", $name);
    $nr    = @count($array);
    $ext   = $array[$nr - 1];

    $name  = date("U").".".$ext;

    $fp = fopen($tmp, "r");
    $contents = fread($fp, filesize($tmp));
    fclose($fp);
    $f_encoded = chunk_split(base64_encode($contents)); //エンコード

    $msg .= "--$boundary\n"
         . "Content-Type: application/octet-stream;\n"
         . "\tname=\"$name\"\n"
         . "Content-Transfer-Encoding: base64\n"
         . "Content-Disposition: attachment;\n"
         . "\tfilename=\"$name\"\n\n"
         . "$f_encoded\n"
         . "\n";

} //[end if]


// language establish
mb_language("ja");

// original encoding
$orgEncoding = mb_internal_encoding();

// specify internal encoding
mb_internal_encoding("utf-8") ;


//メール送信
if(!mb_send_mail($mailto, $subject, $msg, $header)) {
    echo "メールの送信に失敗しました。";
}

// internal encoding take back
mb_internal_encoding($orgEncoding);
1,083 views

メールアドレスをチェックする正規表現パターン

完全なメモ書きです。

^[a-zA-Z0-9]+[a-zA-Z0-9\._-]*@[a-zA-Z0-9_-]+\.[a-zA-Z0-9\._-]+$

少しアップデートしました。こちらのほうが短くて済みます。
\wはアルファベット・数字・アンダースコアを表します。[a-zA-Z_0-9]

^\w+[\w.-]*@[\w-]+\.[\w.-]+$

参考URL:
https://murashun.jp/article/programming/regular-expression.html

2,908 views

Micosoft Office Accessのファイルが壊れる

Windows7のサポートが終了して7ヶ月が経ちました。
皆さんはWindows10への移行はお済みでしょうか?

私も公私共にWindowsを利用しており、Windows10でほぼ問題なく使用出来ているのですが、一つだけ問題があります。
それはOfficeのAccessで作成しているデータベースファイルが壊れるということです。

壊れるといってもそのファイルが使えなくなるわけではありません。
データベースの内容に矛盾が生じ、修復の作業が必要になってしまうわけです。
データベースでは常に最適化する作業が必要になってくるのは当たり前なのですが、最近この状況が頻繁に発生するようになってしまいました。

ちなみにこのようなメッセージが表示されます。

初めは[Accessで発生するメモリー不足エラー]で紹介した事象が起こっていました。
解決したようにも思えましたが、しばらくすると壊れるようになってきました。
そしてその頻度も日を追うごとに頻繁に起こるように…。

それを解消するために色々とやってみました。
続きを読む…»

6,034 views

VBで指定した日の曜日が月のうち何回目かを調べる

今回は、「今日は第何○曜日か知りたい」という時に使えるプログラムを紹介します。
今日が金曜日だと仮定して、今月のうち何回目の金曜日かを知りたい時に使います。

2つの日時の間隔を返すDateDiff関数を使って結果を求めます。

まずDateDiffの第1引数には「ww」を指定し、週の開始曜日をカウントの基準に設定します。
そして第3引数である“週の開始曜日”に調べたい日の曜日を入力することによってその曜日が月のうち何回目なのかを取得することができます。

ソースは次のようになります。

Dim year As Integer
Dim mon  As Integer
Dim day  As Integer
Dim ww   As Integer

year = 2020
mon = 7
day = 10

ww = DateDiff("ww", DateSerial(year, mon, 0), _
    DateSerial(year, mon, day), _
    Weekday(DateSerial(year, mon, day)))

Debug.Print ww & "回目"

出力結果は

2回目

となります。
続きを読む…»

2,552 views

Windows10が起動できなくなったのでMBRの作成

Windows10でMBRが無くて起動できないパターンに陥ってしまったので解消した方法をご紹介します。
 
まずその経緯をご説明します。
Windows7を使っていて、プライマリのSSDがいっぱいになったので新しいSSDを買いました。
そのSSDにまたWindows7をインストール。
 
念のため、元のSSDはSATAの3番目に接続して保管している状態に。(セカンダリはHDD)
 
しばらくしてOSをWindows10にアップグレードしました。
10ではDVDが再生できない等の問題もあって元のSSDを残したまま使っていたのですが、10でDVD再生できるフリーソフトを見つけたので、これを機にWindows7のSSDは外付け用にして利用しようと考えました。
 
で、SSDをフォーマットして取り外し。
Windows10がちゃんと起動できるか試したところ…、起動しない!という事態になってしまったのです。
 
ちゃんと起動するか確認してからフォーマットすれば良かったのですが、デュアルブートになってしまっていると思っていなかったのです。
おそらく初めにSSDを買い換えた時に、3番目に元のSSDを繋いだままWindows7をインストールしてしまっていたのでしょう。
新しいSSDにはMBRが作成されず、元のSSDのMBRを利用して起動するようになってしまっていたということになります。
続きを読む…»

2,778 views