メールを送信する前に画像のサイズ、形式のチェックをします。
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)