일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자바스크립트
- 윈도우10
- iptime
- php
- proxmox
- 알뜰폰
- Apache
- 소비전력
- ConoHa
- 아파치
- centos
- KB국민카드
- SKT
- 가상서버호스팅
- 보르비스초월
- 시놀로지
- 킹북이초월
- 복현오거리
- 스톤에이지
- OpenWrt
- PHP-FPM
- 램가스초월
- 티스토리
- 리눅스
- mysql
- jQuery
- Rocky
- KB증권
- 알리익스프레스
- 라즈베리파이2
- Today
- Total
맛집 여행 캠핑 일상 생활
HTML PHP 폼메일 소스 본문
php 웹호스팅서버에서 폼메일 보내기
sendmail 또는 postfix 를 이용한 웹메일 보내는 소스입니다. 예제가 아닌 실제로 동작하는 소스코드입니다.
화이트도메인 등록하고 사용하시면 됩니다.
sendmail 은 반응이 느리니 가급적이면 postfix 를 설치해서 보내면 반응 속도가 빠릅니다.
소스는 두개( mail.html, mail.php )의 파일만 있어도 되지만 이미지를 업로드에서 메일에 직접 작성을 할 수 있게 upload.php 도 첨부합니다.
그리고 파일도 첨부해서 메일로 보낼 수 있습니다. 첨부파일 최대크기는 5MByte 로 제한을 걸어놓았는데
MAXLIMIT 를 찾아서 수정해서 사용하시면 됩니다.
메일 작성은 ckeditor 를 사용하였습니다.
폼메일
▶ mail.html
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Cache-Control" content="No-Cache" />
<meta http-equiv="Pragma" content="No-Cache" />
<title>메일쓰기</title>
<script src="//code.jquery.com/jquery.min.js"></script>
<script src="//cdn.ckeditor.com/4.4.7/full/ckeditor.js"></script>
<script type="text/javascript">
$(document).ready(function(){
if(parent.resize_layer) parent.resize_layer($('#cBody').height());
CKEDITOR.config.width = 770;
CKEDITOR.config.height = 440;
CKEDITOR.config.removePlugins = 'elementspath,resize';
CKEDITOR.config.toolbar = [
{ name: 'styles', items: [ 'Styles', 'Font', 'FontSize' ] },
{ name: 'colors', items: [ 'TextColor', 'BGColor' ] },
{ name: 'tools', items: [ 'Maximize', 'ShowBlocks' ] },
{ name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ], items: [ 'Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat' ] },
{ name: 'insert', items: [ 'Image', 'Table', 'HorizontalRule', 'SpecialChar' ] }
];
CKEDITOR.config.removeButtons = 'Source,Save,NewPage,Print,Templates,Find,Replace,SelectAll,Scayt,HiddenField,Outdent,Indent,Blockquote,CreateDiv,BidiLtr,BidiRtl,Language,Anchor,Flash,Smiley,PageBreak,Iframe,Format,Subscript,Superscript,About';
var editObj = CKEDITOR.replace( 'message', { filebrowserUploadUrl: 'upload.php', contentsCss:'p{margin:0;}' } );
editObj.on('key', function(evt){
var cLen = editObj.getData().length;
if(cLen > 65000) {
alert('65000자를 넘을 수 없습니다.');
editObj.execCommand('undo');
}
else {
editObj.fire('saveSnapshot');
}
});
});
function mail_check(v, n) {
var regEmail = /\w{2,}[@][\w\-]{2,}([.]([\w\-]{2,})){1,3}$/;
var tmps = new Array();
if(v.indexOf(',') > -1) {
tmps = v.split(',');
}
else if(v.indexOf(';') > -1) {
tmps = v.split(';');
}
else {
tmps.push(v);
}
for(var i=0; i<tmps.length; i++) {
if(tmps[i].indexOf('<') > -1 && tmps[i].indexOf('>') > -1) {
tmps[i] = tmps[i].substring(tmps[i].indexOf('<')+1, tmps[i].indexOf('>'));
}
if(!regEmail.test(tmps[i])) {
return false;
}
}
if(n == 1 && tmps.length != 1) {
return false;
}
return true;
}
function mail_proc(f) {
if(!f.femail.value) {
alert('보내는이 메일 주소를 입력하세요.');
f.femail.focus();
return false;
}
if(!mail_check(f.femail.value, 1)) {
alert('이메일 주소가 유효하지 않습니다.');
f.femail.focus();
return false;
}
if(!f.temail.value) {
alert('받는이 메일 주소를 입력하세요.');
f.temail.focus();
return false;
}
else {
if(!mail_check(f.temail.value)) {
alert('메일 주소가 유효하지 않습니다.');
f.temail.focus();
return false;
}
}
if(f.remail.value) {
if(!mail_check(f.remail.value)) {
alert('메일 주소가 유효하지 않습니다.');
f.remail.focus();
return false;
}
}
if(f.hemail.value) {
if(!mail_check(f.hemail.value)) {
alert('메일 주소가 유효하지 않습니다.');
f.hemail.focus();
return false;
}
}
if(!f.subject.value) {
alert('제목을 입력하세요.');
f.subject.focus();
return false;
}
var editObj = CKEDITOR.instances.message;
if(editObj.getData().length == 0) {
alert('메일 내용을 입력하세요.');
editObj.focus();
return false;
}
f.target = 'frame_mail_proc';
f.submit();
return false;
}
</script>
</head>
<body id="cBody">
<div id="cLayer" style="width:100%;height:auto;padding-left:20px;padding-top:20px;padding-bottom:5px;font-size:10pt;font-family:돋움;" align="left">
<div id="mailLayer" style="width:100%;height:auto;" align="center">
<div style="width:770px;padding-bottom:10px;font-size:12pt;font-weight:bold;" align="left">
폼메일 쓰기
</div>
<table>
<form name="mailForm" method="post" enctype="multipart/form-data" action="mail.php" onsubmit="return mail_proc(this);">
<tr>
<td width="110" align="left">보내는이</td>
<td align="left"><input type="text" name="femail" style="width:658px;" value="<?=$femail?>" /></td>
</tr>
<tr>
<td width="110" align="left">받는이</td>
<td align="left"><input type="text" name="temail" style="width:658px;" value="<?=$temail?>" /></td>
</tr>
<tr>
<td width="110" align="left">참조</td>
<td align="left"><input type="text" name="remail" style="width:658px;" /></td>
</tr>
<tr>
<td width="110" align="left">숨은참조</td>
<td align="left"><input type="text" name="hemail" style="width:658px;" /></td>
</tr>
<tr>
<td width="110" align="left">제목</td>
<td align="left"><input type="text" name="subject" style="width:658px;" /></td>
</tr>
<tr>
<td width="110" align="left">파일첨부</td>
<td align="left"><input type="file" name="attach" /></td>
</tr>
<tr>
<td colspan="2" height="2"></td>
</tr>
<tr>
<td colspan="2" align="left">
<textarea name="message"><?=$message?></textarea>
</td>
</tr>
<tr>
<td colspan="2" height="15"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="메일발송" onclick="return mail_proc(this.form);" />
</td>
</tr>
</form>
</table>
<div style="display:none;">
<iframe src="" name="frame_mail_proc" id="frame_mail_proc" frameborder=0 margin=0 allowTransparency=false width="100%" height="100%"></iframe>
</div>
</div>
</div>
</body>
</html>
▶ mail.php
<?php
$MAXLIMIT = 5242880; // 5MByte limit
if($_FILES['attach']['size'] > $MAXLIMIT) {
$ment = "파일 사이즈가 ".($MAXLIMIT/1024/1024)."MByte를 초과하였습니다.\\n";
$ment .= ($MAXLIMIT/1024/1024)."MByte 이하의 파일만 첨부가능합니다.";
echo "<script>alert('".$ment."');</script>";
return;
}
if($_FILES['attach']) {
$attach = $_FILES['attach'];
$name = preg_replace("/\.(php|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", $attach['name']);
$name = substr(md5(uniqid($_SERVER['REQUEST_TIME'])),0,8).'_'.str_replace('%', '', urlencode($name));
$ATTACH_DIR = "./attach/mail/";
$dest_file = $ATTACH_DIR.$name;
$url = $ATTACH_DIR.$name;
if(!is_dir($ATTACH_DIR)) {
if(@mkdir($ATTACH_DIR, 0777, true)) {
if(is_dir($ATTACH_DIR)) {
@chmod($ATTACH_DIR, 0777);
}
}
}
if(move_uploaded_file($attach['tmp_name'], $dest_file)) {
$attach_url = $url;
$attach_name = $attach['name'];
$attach_size = $attach['size'];
$attach_type = $attach['type'];
}
}
$femail = $_POST['femail'];
$temail = $_POST['temail'];
$remail = $_POST['remail'];
$hemail = $_POST['hemail'];
$subject = $_POST['subject'];
$message = $_POST['message'];
$boundary = "----" . uniqid("part"); // 구분자
// --- 헤더 --- //
$headers = "Return-Path: ".str_replace("\\", "", $femail)."\r\n";
$headers .= "From: ".str_replace("\\", "", $femail)."\r\n";
if($remail) {
$headers .= "Cc: ".str_replace("\\", "", $remail)."\r\n";
}
if($hemail) {
$headers .= "Bcc: ".str_replace("\\", "", $hemail)."\r\n";
}
if($attach_url && $attach_name) { // --- 첨부파일 --- //
$filename=$attach_name;
$fp = fopen($attach_url,"r");
$file = fread($fp,$attach_size);
fclose($fp);
if ($attach_type == ""){
$attach_type = "application/octet-stream";
}
// --- 헤더 --- //
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: Multipart/mixed; boundary=\"$boundary\"";
// --- 본문 --- //
$mailbody = "This is a multi-part message in MIME format.\r\n\r\n";
$mailbody .= "--$boundary\r\n";
$mailbody .= "Content-Type: text/html; charset=utf-8\r\n";
$mailbody .= "Content-Transfer-Encoding: base64\r\n\r\n";
$mailbody .= chunk_split(base64_encode(str_replace("\\", "", $message))) . "\r\n";
// --- 첨부 --- //
$mailbody .= "--$boundary\r\n";
$mailbody .= "Content-Type: ".$attach_type."; name=\"".$filename."\"\r\n";
$mailbody .= "Content-Transfer-Encoding: base64\r\n";
$mailbody .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
$mailbody .= base64_encode($file)."\r\n\r\n";
$mailbody .= "--$boundary--";
}
else {
// --- 헤더 --- //
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: Multipart/alternative; boundary = \"$boundary\"";
// --- 본문 --- //
$mailbody = "--$boundary\r\n";
$mailbody .= "Content-Type: text/html; charset=utf-8\r\n";
$mailbody .= "Content-Transfer-Encoding: base64\r\n\r\n";
$mailbody .= chunk_split(base64_encode(str_replace("\\", "", $message))) . "\r\n";
$mailbody .= "--$boundary--\r\n\r\n";
}
$ret = mail($temail, $subject, $mailbody, $headers);
if(!$ret) {
$msg = "메일 발송을 실패하였습니다.";
}
else {
$msg = "메일을 발송하였습니다.";
}
?>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Cache-Control" content="No-Cache" />
<meta http-equiv="Pragma" content="No-Cache" />
<script>alert('<?=$msg?>');</script>";
</head>
</html>
▶ upload.php
<!DOCTYPE html >
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko" lang="ko">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Cache-Control" content="No-Cache" />
<meta http-equiv="Pragma" content="No-Cache" />
<meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, width=device-width" />
<title>Upload</title>
<?
$MAXLIMIT = 5242880; // 5MByte limit
if($_FILES['upload']['size'] > $MAXLIMIT) {
$msg = "Limited size ".($MAXLIMIT/1024/1024)."MByte";
echo "<script>alert('".$msg."');</script>";
}
else {
$file = $_FILES['upload'];
$name = preg_replace("/\.(php|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", $file['name']);
$name = substr(md5(uniqid($_SERVER['REQUEST_TIME'])),0,8).'_'.str_replace('%', '', urlencode($name));
$ATTACH_DIR = "./attach/mail/";
$ATTACH_URL = "/attach/mail/";
$dest_file = $ATTACH_DIR.$name;
$url = "http://".$_SERVER['HTTP_HOST'].$ATTACH_URL.$name;
if(!is_dir($ATTACH_DIR)) {
if(@mkdir($ATTACH_DIR, 0777, true)) {
if(is_dir($ATTACH_DIR)) {
@chmod($ATTACH_DIR, 0777);
}
}
}
if(move_uploaded_file($file['tmp_name'], $dest_file)) {
echo "<script type='text/javascript'>window.parent.CKEDITOR.tools.callFunction('".$_GET['CKEditorFuncNum']."', '".$url."', 'success')</script>";
}
else {
echo "<script>alert('failed')</script>";
}
}
?>
</head>
<body>
</body>
</html>
마음에 드는 폼메일 예제 소스가 없어서 직접 만들어서 공개합니다.
하루에 메일 발송건수가 많은편이라면 화이트도메인 등록을 꼭 하시고 사용하세요.
블랙리스트에 오를 수도 있습니다.
POSTFIX 설치 방법은 https://ivps.tistory.com/37 여기를 참고
'HTML.CSS' 카테고리의 다른 글
CSS text-overflow 속성 (0) | 2016.05.03 |
---|---|
CSS word-break 속성 (0) | 2016.05.03 |
HTML CSS 크기 단위 (0) | 2016.04.20 |
웹페이지 프린터 출력 CSS STYLE 예제 (0) | 2016.03.25 |
HTML/CSS Layer 특정위치에 고정시키기 (0) | 2016.03.21 |