6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?