LoginSignup
5
4

More than 3 years have passed since last update.

PHPで画像添付メール送信

Posted at

メールを送信する前に画像のサイズ、形式のチェックをします。

input.php

<?php

    header('Content-type: text/html; charset=UTF-8');

    //メッセージ取得初期化
    $MESSAGE     = isset($_COOKIE['MESSAGE']) ? $_COOKIE['MESSAGE'] : NULL;
    setcookie('MESSAGE',     '',     time() + 3600, '/');

?>

<?=nl2br($MESSAGE);?>

<form method="POST" action="upload.php" enctype="multipart/form-data">

    <input type="file" name="upimg" accept="image/*">
    <input type="submit">

</form>

upload.php

<?php

    header('Content-type: text/html; charset=UTF-8');

    try {

        $ERRMSG = NULL;

        //―――――――――――――――――――――――――――――――――――
        //送信画像チェック
        //―――――――――――――――――――――――――――――――――――
        $IMGNAME =     isset($_FILES['upimg']['name'])     ? $_FILES['upimg']['name'] : NULL;
        $IMGTMP =      isset($_FILES['upimg']['tmp_name']) ? $_FILES['upimg']['tmp_name'] : NULL;
        $IMGUPERR = isset($_FILES['upimg']['error'])     ? $_FILES['upimg']['error'] : NULL;

        $fp = @fopen($IMGTMP, "rb");
        $img = @fread($fp, filesize($IMGTMP));
        @fclose($fp);

        $IMGSIZE = floor(strlen($img) / 1024);
        $ENCODEIMG = base64_encode($img);

        $imginfo = @getimagesize('data:application/octet-stream;base64,' . $ENCODEIMG);
        $IMGTYPE = $imginfo['mime'];

        $INPERRFLG = 0;
        $INPERRMSG = NULL;

        if($IMGUPERR == UPLOAD_ERR_NO_FILE){
            $INPERRFLG = 1;
            $INPERRMSG .= 'ファイルを選択してください' . "\n";
        }else if($IMGUPERR == UPLOAD_ERR_PARTIAL){
            $INPERRFLG = 1;
            $INPERRMSG .= 'ファイルのアップに失敗しました。' . "\n";
        }else if($IMGUPERR == UPLOAD_ERR_INI_SIZE || $IMGUPERR == UPLOAD_ERR_FORM_SIZE){
            $INPERRFLG = 1;
            $INPERRMSG .= 'ファイルサイズが大きすぎます' . "\n";
        }else{

            if($IMGTYPE == 'image/gif' || $IMGTYPE == 'image/jpeg' || $IMGTYPE == 'image/png'){
            }else{
                $INPERRFLG = 1;
                $INPERRMSG .= '画像を選択してください。' . "\n";
            }
            if(!preg_match('/^.*\.(jpg|jpeg|gif|png)$/i', $IMGNAME)){
                $INPERRFLG = 1;
                $INPERRMSG .= 'jpg、gif、pngの拡張子を選択してください。' . "\n";
            }
            if($IMGSIZE > 1024){
                $INPERRFLG = 1;
                $INPERRMSG .= 'サイズを1MB以下にしてください。' . "\n";
            }

        }

        if($INPERRFLG == 1){
            setcookie('MESSAGE',     $INPERRMSG,     time() + 3600, '/');
            header('Location: http://' . $_SERVER['SERVER_NAME'] . '/input.php');
            exit;
        }

        //―――――――――――――――――――――――――――――――――――
        //メール送信
        //―――――――――――――――――――――――――――――――――――
        $BOUNDARY = '__BOUNDARY__' .md5(rand());

        $to = 'webmaster@example.com';
        $subject = '件名';
        $header = implode("\r\n",array(
            'Content-Type: multipart/mixed;boundary=' . $BOUNDARY ,
            'From: webmaster@example.com',
            'Reply-To: webmaster@example.com',
        ));

        $body = "--" . $BOUNDARY . "\n";
        $body .= 'Content-Type: text/plain; charset="ISO-2022-JP' . "\n";
        $body .= '画像が送信されました。' . "\n";

        $body .= '--' . $BOUNDARY . "\n";
        $body .= 'Content-Type: ' . $IMGTYPE . '; name=' . $IMGNAME . "\n";
        $body .= 'Content-Disposition: attachment; filename=' . $IMGNAME . "\n";
        $body .= 'Content-Transfer-Encoding: base64' . "\n";
        $body .= chunk_split($ENCODEIMG) . "\n";
        $body .= '--' . $BOUNDARY . '--';

        mail($to, $subject, $body, $header);


    } catch (Exception $e) {
        $ERRMSG = $e->getMessage();
    }

?>
<?php if(mb_strlen($ERRMSG) > 0) : ?>

    <p><?=$ERRMSG;?></p>

<?php else : ?>

    <p>メールを送信しました。</p>

<?php endif; ?>

ほぼこちらのサイトを参考にさせて頂きました。

参考サイト
- PHP: HTTP コンテキストオプション - Manual

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4