PHPで画像添付メール送信


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

input.php

```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
<?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](【PHP】mb_send_mailで添付ファイル付きメールを送信する - Fatal Error: Unexpected BLOG)