Dev Blog

스크립트 & 소스코드 공유

실무에서 유용하게 쓰는 스크립트와 코드 조각을 블로그 게시판으로 저장하고 공유합니다.

6건의 글

그누보드 메일이 발송되지 않을 때 - SMTP 설정 방법

그누보드에서 메일이 정상적으로 발송되지 않을 때 네이버 SMTP로 보내는 설정 방법이다. /lib/mailer.lib.php에서 G5_SMTP 관련 부분을 주석 처리하고, $mail->IsSMTP(), SMTPSecure = "ssl", Host = smtp.naver.com, Port = 465, 네이버 계정의 Username과 Password를 직접 입력한다. 네이버 메일의 POP3/IMAP 설정 안내에서 값을 확인할 수 있다.

닷X 무료 호스팅과 네이버 SMTP를 기준으로 테스트한 것입니다.
우선 /lib/mailer.lib.php 파일을 여신 후에

/*
if (defined('G5_SMTP') && G5_SMTP) {
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host = G5_SMTP; // SMTP server
if(defined('G5_SMTP_PORT') && G5_SMTP_PORT)
$mail->Port = G5_SMTP_PORT;
}
*/

이렇게 된 부분이 있습니다.
주석으로 막으셔도 되고 위에 써 있는 상수(config.php)를 직접 수정하셔도 됩니다.
계정 정보를 입력해야 하고 ssl, auth 이런 것들 때문에 저는 주석으로 막고 이 파일을 그냥 수정했습니다.

아래 부분을 주석으로 막은 바로 밑에 붙여 넣으시면 됩니다.

$mail->IsSMTP();
$mail->SMTPDebug = 2;
$mail->SMTPSecure = "ssl";
$mail->SMTPAuth = true;
$mail->Host = "smtp.naver.com";
$mail->Port = 465;
$mail->Username = "naver id";
$mail->Password = "naver password";

//여기에서 수정하셔야 할 것은

$mail->Host = "smtp.naver.com";
$mail->Port = 465;
$mail->Username = "naver id";
$mail->Password = "naver password";

이 네 가집니다.

위 값은 SMTP를 제공해 주는 메일 계정에 보면 다 나옵니다.
네이버를 기준으로 하였으니 네이버 메일로 접속하신 후 좌측 하단에 보면 '외부메일 가져오기'라고 된 부분이 있습니다.
클릭하신 후에 POP3/IMAP 설정을 들어가세요.
그러면 가장 하단에 '메일 프로그램 환경 설정 안내' 부분이 있습니다.
여기에 있는 정보를 그대로 위 네 가지에 넣어 주시면 됩니다.

그리고 나서 실행해 보세요.

혹시 몰라 mailer.lib.php 파일 첨부합니다.

mailer("테스트", "보내는 사람", "받는 사람", "대출 문의", "내용입니다.");
실제로 위 함수를 실행할 때 보내는 사람 메일 주소는 smtp 계정에서 사용하는 메일 주소를 넣으셔야 합니다.
예를 들어서 나는 개인정보보호를 위한 이메일주소 노출방지 으로 해야만 발송이 된다는 겁니다.

그누보드5 짧은주소(rewrite) 사용하기 - Apache 설정

그누보드5의 짧은 주소 기능을 Apache 서버에서 사용하기 위한 설정 방법이다. httpd -M 명령으로 rewrite_module 활성화 여부를 확인하고, 비활성 상태라면 00-base.conf에 LoadModule rewrite_module modules/mod_rewrite.so를 추가한다. 이후 그누보드 환경설정에서 제공하는 rewrite 규칙을 .htaccess에 붙여넣어 사용한다.

Apache 서버인 경우 rewrite_module 이 비활성화 되어 있으면 짧은 주소를 사용할수 없습니다.

위 멘트에 대한 활성화 설정방법입니다.

[root@eyedino www]# httpd -M

------------생략---------------------

negotiation_module (shared)

remoteip_module (shared)

reqtimeout_module (shared)

request_module (shared)

rewrite_module (shared) //있으면 활성된 것이고 없으면 다음단계 진입

setenvif_module (shared)

slotmem_plain_module (shared)

slotmem_shm_module (shared)

socache_dbm_module (shared)

socache_memcache_module (shared)

-------------생략------------------------

다음단계

[root@eyedino www]# nano /etc/httpd/conf.modules.d/00-base.conf

또는 vi editor

[root@eyedino www]# vi /etc/httpd/conf.modules.d/00-base.conf

마지막줄에 붙여넣기

LoadModule rewrite_module modules/mod_rewrite.so

하시면 기본설정은 끝납니다.

.htaccess 파일설정

아시는 것처럼 루트 홈폴더 에

그누보드 환경설정/짧은주소/apache 설정 코드 보기를 복사하여 붙여넣기합니다.

그누보드5 rewrite BEGIN

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} -f [OR]

RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^ - [L]

RewriteRule ^shop/list-([0-9a-z]+)$ shop/list.php?ca_id=$1&rewrite=1 [QSA,L]

RewriteRule ^shop/type-([0-9a-z]+)$ shop/listtype.php?type=$1&rewrite=1 [QSA,L]

RewriteRule ^shop/([0-9a-zA-Z_]+)$ shop/item.php?it_id=$1&rewrite=1 [QSA,L]

RewriteRule ^shop/([^/]+)/$ shop/item.php?it_seo_title=$1&rewrite=1 [QSA,L]

RewriteRule ^content/([0-9a-zA-Z_]+)$ bbs/content.php?co_id=$1&rewrite=1 [QSA,L]

RewriteRule ^content/([^/]+)/$ bbs/content.php?co_seo_title=$1&rewrite=1 [QSA,L]

RewriteRule ^rss/([0-9a-zA-Z_]+)$ bbs/rss.php?bo_table=$1 [QSA,L]

RewriteRule ^([0-9a-zA-Z_]+)$ bbs/board.php?bo_table=$1&rewrite=1 [QSA,L]

RewriteRule ^([0-9a-zA-Z_]+)/([^/]+)/$ bbs/board.php?bo_table=$1&wr_seo_title=$2&rewrite=1 [QSA,L]

RewriteRule ^([0-9a-zA-Z_]+)/write$ bbs/write.php?bo_table=$1&rewrite=1 [QSA,L]

RewriteRule ^([0-9a-zA-Z_]+)/([0-9]+)$ bbs/board.php?bo_table=$1&wr_id=$2&rewrite=1 [QSA,L]

</IfModule>

그누보드5 rewrite END

.htaccess파일을 저장합니다.

(혹시 root 소유권 으로 실행 안될 수도 있으니 소유권도 변경 바랍니다.

[root@eyedino www]# chown eyedino.eyedino .htaccess

마지막 단계

아파치 설정파일 설정

[root@eyedino www]# nano /etc/httpd/conf/httpd.conf

또는

[root@eyedino www]# vi nano /etc/httpd/conf/httpd.conf

<Directory "/home/*****/www">

AllowOverride None -> ALL 바꿈

Allow open access:

Require all granted

</Directory>

<Directory "/home/*****/www">

AllowOverride ALL

Allow open access:

Require all granted

</Directory>

CETOS8 에서는 기본값으로

-------------생략-----------------

The following lines prevent .htaccess and .htpasswd files from being

viewed by Web clients.

<Files ".ht*">

Require all denied

</Files>

-----------생략-------------------

이부분 막아놨더군요!

<Files ".ht*">

Require all denied

</Files>

주석정리 해주시고

httpd 재시작하시면 끝~

[root@eyedino www]# systemctl restart httpd

도움이 되었으면 좋겠습니다.

그누보드 간단한 스팸 글 등록 차단하기

메인 페이지를 거치지 않고 글쓰기 페이지에 직접 접근해 스팸 글을 등록하는 것을 차단하는 방법이다. /extend/user.config.php에 세션 토큰을 검사하는 코드를 추가해, index.php를 방문했을 때만 세션을 발급하고 write_update.php나 write_comment_update.php에서 세션이 없으면 접근을 거부한다.

메인 페이지를 방문하지 않고 글작성을 시도하는 경우 차단하는 방법입니다.

  • /extend/user.config.php 에 다음의 코드를 추가해주면 됩니다.
    
    // 메인 페이지를 방문하지 않고 글작성을 시도하는 경우 차단
    $s_name = basename($_SERVER['SCRIPT_NAME']);

if ($s_name == 'index.php') {
set_session('ss_ns_token', true);
}

if ($s_name == 'write_update.php' || $s_name == 'write_comment_update.php') {
if (!get_session('ss_ns_token'))
die('허용되지 않은 접근입니다.');
}

그누보드 원하는 게시판만 선택해 최근게시물 노출하기

그누보드 latest.lib.php 파일 하단에 함수를 추가해, 사이트 전체가 아닌 원하는 게시판만 선택적으로 최근 게시물을 노출시키는 방법이다. 최근 게시물을 가져올 게시판 테이블 목록을 지정하고 최신글을 조회해 제목·작성일 등 목록으로 출력하는 PHP 함수 코드를 제공한다.

latest.lib.php 하단에 아래 함수를 추가하시면됩니다.

// $bo_tables 테이블들 사이 콤마(,) 단위로 구분해서 넣을 것, 콤마 사이에 공백 없이 (ex aaa,bbb,)
function latest_all($skin_dir='', $bo_tables, $rows=10, $subject_len=40, $cache_time=1, $options=''){
global $g5;

if (!$skin_dir) $skin_dir = 'basic';

if(preg_match('#^theme/(.+)$#', $skin_dir, $match)) {
if (G5_IS_MOBILE) {
$latest_skin_path = G5_THEME_MOBILE_PATH.'/'.G5_SKIN_DIR.'/latest/'.$match[1];
if(!is_dir($latest_skin_path))
$latest_skin_path = G5_THEME_PATH.'/'.G5_SKIN_DIR.'/latest/'.$match[1];
$latest_skin_url = str_replace(G5_PATH, G5_URL, $latest_skin_path);
} else {
$latest_skin_path = G5_THEME_PATH.'/'.G5_SKIN_DIR.'/latest/'.$match[1];
$latest_skin_url = str_replace(G5_PATH, G5_URL, $latest_skin_path);
}
$skin_dir = $match[1];
} else {
if(G5_IS_MOBILE) {
$latest_skin_path = G5_MOBILE_PATH.'/'.G5_SKIN_DIR.'/latest/'.$skin_dir;
$latest_skin_url  = G5_MOBILE_URL.'/'.G5_SKIN_DIR.'/latest/'.$skin_dir;
} else {
$latest_skin_path = G5_SKIN_PATH.'/latest/'.$skin_dir;
$latest_skin_url  = G5_SKIN_URL.'/latest/'.$skin_dir;
}
}
$list = array();
$sql_common = " from {$g5['board_new_table']} a  where find_in_set(a.bo_table, '{$bo_tables}')";
$sql_common .= " and a.wr_id = a.wr_parent ";
$sql_order = " order by a.bn_id desc ";
$sql = " select a.* {$sql_common} {$sql_order} limit 0, {$rows}";
$result = sql_query($sql);
for ($i=0; $row=sql_fetch_array($result); $i++) {
$sql = " select * from {$g5['board_table']} where bo_table = '{$row['bo_table']}' ";
$board = sql_fetch($sql);
$tmp_write_table = $g5['write_prefix'] . $row['bo_table'];
$row2 = sql_fetch(" select * from {$tmp_write_table} where wr_id = '{$row['wr_id']}' ");
$list[$i] = $row2;
$list[$i] = get_list($row2, $board, $latest_skin_url, $subject_len);
$list[$i]['bo_subject'] = $row['bo_subject'];
$list[$i]['bo_table'] = $row['bo_table'];
}

ob_start();
include $latest_skin_path.'/latest.skin.php';
$content = ob_get_contents();
ob_end_clean();

return $content;
}
echo latest_all("스킨명", "게시판명1,게시판명2,게시판명3,게시판명4", 출력갯수, 글자수);

그누보드 업로드 이미지에 워터마크 일괄 적용하기

그누보드 게시판의 write_update.skin.php를 아래 소스로 교체하면 업로드되는 모든 이미지에 워터마크가 일괄 적용된다. PHP GD 함수로 원본 이미지 위에 워터마크를 합성하며, 함께 포함된 이미지 리사이즈 기능이 필요 없으면 주석 처리된 부분을 참고해 제거할 수 있다.

적용하고 싶은 게시판의 "write_update.skin.php"를 아래 소스로 바꾸시면 됩니다.

아래 소스는 이미지 리사이즈 적용 소스이니..원치 않으시면 주석달린곳을 참고 하시면 됩니다.

<?
// 자신만의 코드를 넣어주세요.
$data_path = $g4[path]."/data/file/$bo_table";
$thumb_path = $data_path.'/thumb';
$sql2=" select * from $g4[board_file_table] where  bo_table = '$bo_table' and wr_id = '$wr_id' order by bf_no asc";
$results2 = sql_query($sql2);
for ($d=0; $row2=sql_fetch_array($results2); $d++)  {
if ($_FILES[bf_file][name][$d]){
$file = $data_path .'/'. $row2[bf_file];
if (preg_match("/\.(jp[e]?g|gif|png)$/i", $file)) {
$size = getimagesize($file);
if ($size[2] == 1) $src = imagecreatefromgif($file);
else if ($size[2] == 2) $src = imagecreatefromjpeg($file);
else if ($size[2] == 3) $src = imagecreatefrompng($file);
else break;
$rate = $board[bo_image_width] / $size[0]; // 리사이즈를 원치않으면 여기서부터~~~
$height = (int)($size[1] * $rate);
if ($size[0] > $board[bo_image_width]){
@unlink($data_path.'/'.$row2[bf_file]);
$dst = imagecreatetruecolor($board[bo_image_width], $height);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $board[bo_image_width], $height, $size[0], $size[1]);
imagejpeg($dst, $data_path.'/'.$row2[bf_file], $board[bo_2]); //혹 업로드 이미지 깨지면 여긴 주석처리하시고 바로 아래 껄 이용하세요..
// imagepng($dst, $data_path.'/'.$row2[bf_file], $board[bo_2]); //주석 해제
chmod($data_path.'/'.$row2[bf_file], 0606);
$temp = @getimagesize(addslashes($file));

} // 리사이즈를 원치않으면 여기까지 삭제 & 주석처리하면 됨.
$wmFile = $g4[path]."/img/logo_mark.gif"; // 워터마크 이미지 주소
$wmImg  = imageCreateFromGIF($wmFile);
$size = getimagesize($file);
if ($size[2] == 1)  $jpegImg = imagecreatefromgif($file);
else if ($size[2] == 2)  $jpegImg = imagecreatefromjpeg($file);
else if ($size[2] == 3)  $jpegImg = imagecreatefrompng($file);
else break;
$wmX=imageSX($jpegImg) - imageSX($wmImg);
$wmY=imageSY($jpegImg) - imageSY($wmImg);
imageCopyMerge($jpegImg, $wmImg, $wmX, $wmY, 0, 0, imageSX($wmImg), imageSY($wmImg), 90);
ImageJPEG($jpegImg, $file, 90);
}
}
}
?>


Let's create something great together.

프로젝트 문의 및 견적 요청은 언제든 환영합니다.