PHP 에서 mail 함수 정상 동작하는지 확인하는 소스

<?php
 //$mailto="받는주소";
 $mailto="sample@a.com";
 $subject="mail test";
 $content="test";
 $result=mail($mailto, $subject, $content);
 if($result){
  echo "mail success";
  }else  {
  echo "mail fail";
 }
?>


test.php 로 저장하여,
웹페이지에서 로드했을때
mail success 가 찍혀야 정상

만약, 위 소소에서 mail success 가 찍히는데
각종 커스텀 보드에서 메일 발송이 되지 않는다면,
php소스에서 mail 함수의 각 인자들을 확인해본다.

error_log($mailto, 0);  // mailto 변수를 서버의 에러로그에 찍는다.
error_log($subject, 0);

가령,

<?php
 //$mailto="받는주소";
 $mailto="sample@a.com";
 $subject="mail test";
 $content="test";
 $result=mail($mailto, $subject, $content);
 if($result){
  echo "mail success";
  }else  {

  error_log($mailto, 0); 

  echo "mail fail";
 }
?>

일 경우,
Apache 서버를 구동중이라면,
Apache\logs\error.log
파일에 mailto 변수의 내용이 찍힌다.

지금 내가 사용중인 환경은
Apache2.2.8
+ SMTP(W2K3 R2) + PHP5.2.5


위와 같이 테스트에서 이상이 없었으나,
제로보드에서는 메일을 보내지 못하는 현상이 발생한다.

따라서,
제로보드의 메일발송 소스를 확인해보니,
받는 사람(Receiptor) 변수에

위의 예제에서는 "sample@a.com" 이지만,
제로보드는 "받는사람 이름 <sample@a.com>"을 설정한다.

Receiptor 변수를 임의로 "sample@a.com"으로 수정하고
정상 작동하는 것을 확인
해당 소스를 수정해주었다.

제로보드\classes\mail\Mail.class.php

function getReceiptor() {
  //if($this->receiptor_name) return sprintf("%s <%s>", '=?utf-8?b?'.base64_encode($this->receiptor_name).'?=', $this->receiptor_email);
  return $this->receiptor_email;
}


수정이후 정상 발송 확인

출처: https://lifeful.tistory.com/19 [SEIZ THE DAY.]

  1. Favicon of http://tv.dasiboa.live 드라마다시보기 2020.09.04 14:31

    포스팅 잘 보고 갑니다...


[리눅스 sendmail 로 폼메일사용시 nobody@localhost.localhost.com 으로 발송될 경우 ]


보내는 사람 계정 명이 nobody@localhost.localdomain 으로 발송이 되서 

다음이나 다른 포털에서 반송되는 경우를 볼수 있습니다 

이럴때에 조치 방법으로 

php.ini에서 

 

메일 함수 사용시 

리눅스

php.ini 를 수정하는 방법.(Linux) 
; PHP mail() 함수에서 발송하는 메일에는 모두 적용됨.  수정후 아파치 재시작해야함. 
;sendmail_path = 

sendmail_path = “/usr/sbin/sendmail -t -i -f 계정@도메인” 

 

위에 처럼 수정후 발송 하면 잘 적용 되십니다 

무조건 적용 

 

 

윈도우

php.ini 를 수정하는 방법(windows)
; 모든 메일발송자가 고정적으로 지정됨.  수정후 아파치 재시작해야함. 
;sendmail_from = master@example.com 
=> 
sendmail_from = 계정@도메인



출처: https://cnisoft.tistory.com/10 [씨엔아이소프트]


출처 : http://www.cgmarina.co.kr/computer/13720

 

[Session]

session.save_handler = files
session.save_path = /tmp
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.gc_maxlifetime = 1440
session.cache_expire = 180

session.save_handler :
기본적으로 Files 방식을 이용한다.
session_module_name() 을 통하여 현재 설정된 정보를 볼 수 있다. 공유 메모리를 사용하는 MM방식과 USER방식을 지원하다.
USER방식을 사용하는 경우에는 session_set_save_handler(string open, string close,string read, string write, string destroy, string gc)을 이용하여session_set_save_handler("함수명", "함수명", "함수명", "함수명", "함수명", "함수명")과 같이콜백 함수를 정의하고 콜백 함수를 호출하여 세션 데이터나 세션ID등을 데이터베이스 등에 보관하여 사용할 수도 있다.

session.save_path :
세션 파일을 저장할 경로을 의미하고 files 방식에서는 /tmp가 기본적인 파일이 저장되는 디렉토리의 절대 경로이다.

session.use_cookies :
세션과 함께 쿠키를 사용할 것인가에 대한 설정으로 기본적으로 쿠키와 함께 사용하도록 되어 있다.
쿠키를 사용하지 않는 경우에는 0으로 설정하고 버전에 따라서는 On과 Off로 설정하기도 한다.

session.name :
세션ID를 쿠키에 저장한 경우 PHP에서 세션ID를 확인하기 위한 변수명을 의미한다.
기본값으로 PHPSESSID로 설정되어 있으며$PHPSESSID라고 하면 세션ID를 확인할 수 있다.

session.auto_start :
PHP시작과 동시에 세션이 자동으로 스타트 되도록 하는 옵션이다.
기본값은 0으로 자동으로 시작되지 않도록 되어 있다.
그러므로 세션을 사용하기 전에는 session_start()를 호출해야 하고, 자동으로 시작하게 하려면 1로 설정하면 된다.
버전에 따라서는 On과 Off로 설정하기도 한다.

session.cookie_lifetime :
세션ID를 저장한 쿠키의 활성화 시간 또는 유효 시간을 설정하는 것이다.
기본값으로는 0이 설정되어 있어 브라우저가 종료되면 자동으로 쿠키값은 삭제된다.
session_set_cookie_params()함수를 이용하여 쿠키의 유효 시간을 변경할 수 있으며 PHP.INI를 수정하여 쿠키 적용 시간을 변경 가능하다.

session.cookie_path :
세션ID가 저장된 쿠키가 적용될 유효 경로(디렉토리)를 설정하는 부분이다.
기본값은 "/"로 모든 경로에서 적용 가능하도록 설정되어 있다.
session.cookie_lifetime과 같이 session_set_cookie_params()함수를 이용하여 쿠키의 적용 디렉토리를 변경할 수 있다.

session.gc_maxlifetime :
사용되지 않는 것으로 보이는 세션 데이터를 삭제한다.
세션ID를 삭제하는 것이 아니라 기본 설정 시간인 1440초 동안 아무런 요청이 없을때 자동으로 세션 데이터를 삭제하도록 되어 있다.
이렇게 자동으로 삭제하는 이유는 서버의 부하를 줄이기도 하지만 클라이언트에서 접속을 종료하였는지 여부를 확인할수 없으므로1440초 동안 사용하지 않는 데이터는 삭제하게 한다.

session.cache_expire :
서버에 저장된 세션ID의 활성화 시간이다.
클라이언트에서 브라우저를 닫아버리면 서버에서는 클라이언트가 연결중인지 아닌지 확인하는 방법이 없으므로 미리 세션데이터를 삭제하고 세션ID는 180분 이후에 삭제시킨다.
만약 세션 ID를 삭제하지 않으려면 PHP.INI를 수정하여 시간을 늘려주면 된다.


세션을 핸들링하려면 세션 저장 디렉토리를 별도로 사용해야 한다.

session_save_path("저장디렉토리");
ini_set("session.cache_expire", 180); // 세션 유효시간 : 분
ini_set("session.gc_maxlifetime", 86400); // 세션 가비지 컬렉션(로그인시 세션지속 시간) :

 

 

 

 

 

실제 사용할때에는  
session_save_path($_SERVER['DOCUMENT_ROOT']."/세션폴더");
ini_set("session.cache_expire", 180); // 세션 유효시간 : 분
ini_set("session.gc_maxlifetime", 86400); // 세션 가비지 컬렉션(로그인시 세션지속 시간) :
session_start();

 

위와같이 사용 하면 됨.



출처: https://jaweb.tistory.com/entry/php-session-유지시간-설정-작업관련 [잡다구리 파크]


php.in 에 설정된 date.timezone 은 글로벌 설정으로 시스템에 등록된 모든 계정에 적용되는데

이를 특정 계정에 대해서 다른 date.timezone 으로 설정하려고 한다면 아래와 같이 하면 된다.

php.ini 의 date.timezone 이 date.timezone "Asia/Seoul" 일 때

특정 계정의 date.timezone을 America/New_York 로 바꾸고 싶으면

해당 계정의 Virtualhost 설정에 php_admin_value date.timezone "America/New_York" 를 추가해주고

웹서버 재시작을 해준다.

적용 여부 확인은 아래 php 구문이 담긴 php 파일을 만들어 웹상에서 호출한다.

echo date_default_timezone_get();


LINUX 웹 서버를 운영하면서 문제가 생겼다.

 

각각의 사이트들을 하루에 한번씩 백업 폴더로 카피하는데 PHP 세션디렉토리를 지우지 않아 몇달간 모인 세션파일이 수백만개가 넘어가 버려 rm 으로 지워 지지 않는다.

 

문제는 리눅스의 파티션에 들어갈수 있는 파일 갯수(inode)가 정해져 있다는 것이다.

df -i 로 확인 해보면 된다.

이문제로 운영중인 서버에 세션이 생성되지 않아 서버가 죽는 경우가 생겼다.

 

하여간 몇가지 방법으로 삭제를 시도를 해보았지만 실패....

 

시도한 방법을 나열하자면...

1. rm -rf *

2. find . -type f -exec rm -fv {} \;

3. find . -type f -delete

4. perl 을 이용한 스크립트

 

너무 파일이 많은지 서버 자원만 엄청 사용하고 결국 포기 했다.

 

그래서 시도한 방법이 현재 운영중인 사이트를 다른 폴더로 옮기고 재빨리 파티션자체를 포멧하고 다시 복구 시키는 방법을 썻다.

손이 많이 가지만 가장 깔끔한 방법...

 

하지만 다른 한대의 서버에는 다른쪽으로 옮길 파티션(하드)가 존재하지 않아 포기

 

몇일후 PHP 를 이용해서 지워도 되겠다는 생각에 아래 스크립트를 실행 시켰다.

 

$dir = "/home/linkFolder/img";
$dh = opendir( $dir);
$i = 0;
while (($file = readdir($dh)) !== false) {
  $file = "$dir/$file";
  if (is_file( $file)) {
    unlink( $file);
    if (!(++$i % 1000)) {
      echo "$i files removed\n";
    }
  }
}

 

오호~~ 잘 지워 진다. 속도로 빠르다. 50만개정도 삭제 하는데 20분도 안걸렸다.

 

역시 내가 PHP를 사랑할 수 밖에 없는 이유다. 보안이 어쩌고 하지만 안되는게 없는 PHP이다. ㅎㅎ



출처: http://blog.yesyo.com/entry/리눅스-대량의-파일-지우기 [MintState WebLog]


이 프로그램은 이미 오래 전에 나돌던 프로그램입니다.

아시는 분은 다 아실 프로그램 dezend 입니다.

젠드엔코더로 암호화된 젠드 엔코더파일을 디코더하는 프로그램으로 방법은 간단합니다.

압축해제해서 디코더할 PHP소스 파일을 해당폴더에 넣어 php.exe 파일에 끌어넣기만 하면 됩니다.

예를 들어 test.php 파일을 php.exe 파일에 끌어넣기 하면 test.de.php 파일로 디코더되어 생성됩니다.

Dezend Encoder.zip

[출처] http://blog.habonyphp.com/383#.WWNC2-S1uUn


php.ini 설정에서 register_globals = on/off 차이점과 기능설명

rester_globals 를 On 으로 하면 변수가 get, post, session 변수인지 체크하지 않아도 됩니다. 
쓰기에 따라서 보안적인 부분에 문제가 생길 수 있습니다
 

register_globals = on
가능 -> $_POST['u_id']
가능 -> $u_id
 
register_globals = off
가능 -> $_POST['u_id']
불가능 -> $u_id  
* extrract()로 처리하면 가능

php.ini에서 register_globals=off 일경우 헤더나 인클루드를 이용해서 상단에
@extract($_GET);
@extract($_POST);
@extract($_SERVER);
@extract($_FILES);
@extract($_ENV);
@extract($_COOKIE);
@extract($_SESSION);
 
위와 같이 처리해 주면 기존 소스를 그대로 사용할 수 있다.
혹은 받아오는 변수의 전체코드를 다 써주면 됨
$HTTP_GET_VARS[변수] 또는 $_GET[변수]
$HTTP_POST_VARS[변수] 또는 $_POST[변수]
$HTTP_COOKIE_VARS[변수] 또는 $_COOKIE[변수]
$HTTP_SESSION_VARS[변수] 또는 $_SESSION[변수]
$HTTP_POST_FILES[변수] 또는 $_POST_FILES[변수]



출처: http://gocoding.tistory.com/156 [Developer Factory]

'Works > PHP' 카테고리의 다른 글

리눅스 대량의 파일 지우기  (0) 2017.11.20
Dezend Encoder  (0) 2017.07.10
PHP의 php.ini 설정에서 register_globals = on/off 차이  (0) 2017.06.21
sqlsrv 함수로 mssql 접속하는 테스트페이지  (0) 2017.03.29
php 퍼미션 관련 함수  (0) 2016.10.25
PHP 문자열 함수  (0) 2016.06.30


<?php

$serverName = "서버IP";
$connectionInfo = array ("Database"=>"DB명","UID"=>"DB유저명","PWD"=>"DB패스워드");
$conn = sqlsrv_connect($serverName, $connectionInfo);
    

if ($conn) {

echo "연결 성공!\n";

} else {

echo "연결 실패!\n";

die ( print_r (sqlsrv_errors(), true)); 

}

sqlsrv_close($conn);

?>


 

읽기 가능한 파일(또는 폴더)인지 체크하는 is_readable 함수


bool is_readable ( string $filename )
(PHP 4, PHP 5)

읽기 가능한 파일(또는 폴더)이면 true를 반환하고, 아니면 false를 반환합니다.

예제 (ex #3

 <?php
 
if (is_readable('test.txt'
)) {
    echo 
'읽기 가능한 파일입니다.'
;
 }else{
    echo 
'읽기 권한이 없는 파일입니다. 권한 0707, 0777로 바꿔주세요.'
;
 }
 
?>


쓰기 가능한 파일(또는 폴더)인지 체크하는 is_writable 함수


bool is_writable ( string $filename )
(PHP 4, PHP 5)

쓰기 가능한 파일(또는 폴더)이면 true를 반환하고, 아니면 false를 반환합니다.

예제 (ex #4

 <?php
 
if (is_writable('test.txt'
)) {
    echo 
'쓰기 가능한 파일입니다.'
;
 }else{
    echo 
'쓰기 권한이 없는 파일입니다. 권한 0707, 0777로 바꿔주세요.'
;
 }
 
?>


실행 가능한 파일인지 체크하는 is_executable 함수


bool is_executable ( string $filename )
(PHP 4, PHP 5)

실행 가능한 파일이면 true를 반환하고, 아니면 false를 반환합니다.

예제 (ex #5

 <?php
 
if (is_executable('test.txt'
)) {
    echo 
'실행 가능한 파일입니다.'
;
 }else{
    echo 
'실행 권한이 없는 파일입니다. 권한 0707, 0777로 바꿔주세요.'
;
 }
 
?>


읽기, 쓰기, 실행의 권한 문제에 대한 설명은 퍼미션(Permission) 설정을 참고하십시요.

[출처] : http://blog.habonyphp.com/entry/php-%EC%9D%BD%EA%B8%B0-%EC%93%B0%EA%B8%B0-%EC%8B%A4%ED%96%89%EC%9D%B4-%EA%B0%80%EB%8A%A5%ED%95%9C-%ED%8F%B4%EB%8D%94-%ED%8C%8C%EC%9D%BC%EC%9D%B8%EC%A7%80-%EC%B2%B4%ED%81%AC%ED%95%98%EB%8A%94-%ED%95%A8%EC%88%98#.WA7E9U__qUk


붉은색은 자주 쓰는 함수

 ▶ 문자열 다듬기

 
 - trim(), ltrim(), chop()에서 지우는 공백은 스페이스, '\n'(줄바꿈), '\t'(가로 탭), '\v',

 ○ trim();
      - 문자열의 처음과 끝에 있는 공백을 지운다.

 ○ ltrim();
      - 문자열의 처음에 있는 공백을 지운다.
 ○ chop();
      - 문자열의 끝에 있는 공백을 지운다.
 
 
 
 ▶ 문자열 정돈
 
 ○ nl2br();
      - 문자열중 줄바꿈문자(\n)를 XHTML에서의 줄바꾸기인 <br/>태그로 바꾸어 준다.(4.0.5 이전의 HTML에서는 <br>태그)
 
 
 ▶ 문자열의 대소문자 관련 함수
 
 ○ strtoupper();
      - 모든 알파벳을 대문자로
 ○ strtolower();
      - 모든 알파벳을 소문자로
 ○ ucfirst();
      - 문장의 처음이 알파벳이면 그것만 대문자로
 ○ ucword();
      - 각 단어의 첫 알파벳을 대문자로
 
 
 
 ▶ 문자열 나누고 합치기
 
 ○ explode();
      - 지정 문자를 기준으로 문자열의 전, 후를 나누어 배열로 저장한다.
 
      ex) $email =
'email@email.com';     $email_array = explode('@', $email);
           $email_array[0] → 'email';     $email_array[1] → 'email.com';
 
 ○ implode();, join();
      - 지정 문자를 기준으로 배열을 전, 후에 배치하여 문자열을 합친다.
 
      ex) $new_email = implode('@', email_array);     $new_email → 'email@email.com';
 
 
 
 ○ strtok();
      - 지정 토큰문자로 토큰화 해서 구분

ex)
     $token = strtok($feedbak, ' ') // 처음 토큰화 하기
      echo $token.'<br />';
      while ($token!= ''){
            $token = strtok(' '); // 두번째 토큰화 (토큰화하고 싶은)
            echo $token.'<br />';
       }

 ○ substr();
 
      - 문자열 중 특정 시작부분과 끝부분 사이의 문자열을 추출하는데 사용한다.
      ex) $test = 'PHP Webprogramming';
           $test1 = substr($test, 1);     $test2 = substr($test, -1);     $test3 = substr($test, 5, 8);     $test4 = substr($test, 4, -2);
 
           $test1 → 'HP Webprogramming'(앞에서 1번 부터)
           $test2 → 'g'(뒤에서 1번 부터)
           $test3 → 'ebprogra'(앞에서 5번부터 8개)
           $test4 → 'Webprogrammi'(앞에서 4번부터 뒤에서 2번까지)

 
 
 
 ▶ 문자열 비교하기
 
 ○ strcmp();
      - C언어에서의 함수와 같다. 앞의 문자열을 기준으로 같으면 0을, 우선순위가 높으면 -1을, 반대의 경우에는 1을 리턴한다.
      - 단, 대문자와 소문자의 경우 소문자가 우선순위가 더 높다.(ASCII코드의 대소관계를 생각하면 쉽다.)

 ○ strcasecmp();
      - C언어에서의 stricmp()와 같다. 두 문자열을 비교하는 것은 strcmp()와 같지만 대소문자를 구분하지 않는다.
 ○ strnatcmp(); & strnatcasecmp();
      - 이 두 함수는 문자열을 좀더 자연스러운 기준에서 비교한다.(strnatcmp("12","2")의 결과는 1이다.)
      - 이 두 함수의 차이는 대소문자의 구분여부이다.(이 두 함수의 차이는 case의 유무여부이다.)
 
 
 
 ▶ 문자열의 길이 확인하기
 ○ strlen();
      - C언어에서의 함수와 같다. 문자열의 길이를 정수값으로 리턴해준다.

 
 
 ▶ 문자열 안에서 문자열 찾기
 ○ strstr();
      - 문자열 안에서 특정 문자열과 일치하는 부분이 있는지 찾아내는데 쓰이는 함수이다.
      - 일치하는 문자열이 있을 때는 해당 문자열이나 문자를 포함하여 이후 문자열을 리턴한다.
      - 일치하는 문자열이 없을 시에는 false를 리턴한다.
 
      ex) $str='Lion sleep to night';     $res = strstr($str, 'sleep');
           $res → 'sleep to night'
 
 ○ stristr();
      - strstr()과 같으나 대소문자를 구분하지 않는다.(ABC, Abc, aBC모두 같은 것으로 취급한다.)
 
 ○ strchr();
      - strstr()과 같으나 문자열대신 문자를 찾는다.
 
 ○ strrch();
      - strchr()과 같으나 뒤에서 부터 일치하는 문자를 찾기 때문에 마지막으로 나타난 문자부터 문자열을 출력한다.
 
 
 
 ▶ 문자열의 위치 찾아내기
 
 ○ strpos();
      - 문자열 내에서 일치하는 문자열이나 문자를 찾아 문자열 대신 해당 위치를 숫자로 알려준다.
      ex) $test = 'Ice cream';     $res1 = strpos($test, 'a');     $res2 = strpos($test, 'e');
           $res1 → 7(0부터 시작한다.)     $res2 = 2(일치하는 문자나 문자열이 많을 경우 가장 앞의 것을 기준으로 한다.)
      ex) $test = 'Ice cream';     $res = strpos($test, 'e', 4);
           $res = 6(앞에서부터 4번째에 있는 c부터 해당문자열의 위치를 찾는다.)

     
 ○ strrpos();
 
      - strpos와 비슷하나 찾는 문자가 가장 마지막에 보이는 곳의 위치를 리턴한다.
       
 ※ 두 함수 모두 만약 문자열에 needle(찾는 문자나 문자열)이 없으면 false를 리턴하는데 PHP에서는 false를 0과 같다고 보기 때문에
 
      위치 0을 리턴한것인지 false를 리턴한 것인지 구분할 수가 없다. 이 문제는 === 연산자를 사용하여 해결할 수 있다.
 ex) $res = strpos('Hello world', 'H');     //이 경우에는 가장 앞에 'H'가 있기 때문에 0을 리턴하지만 PHP는 false와 구분하지 못한다.
 
      if($res === false)
           echo 'Not found';
      else
           echo 'Found at position 0';
 
 
 
 ▶ 문자열 대체하기
 
 ○ str_replace();
      - 문자열에서 문자열를 찾아 대체문자열로 바꾸어 리턴한다.
      ex) $test = 'Change';     $res = str_replace('g', 'c', $test);
           $res → 'Chance'

 
 ○ substr_replace();
      - 특정 위치의 문자열을 대체문자열로 바꾸어 리턴한다.
      ex) $test = 'Vitamin A'; $res = substr_replace($test, 'C', -1);
           $res → 'vitamin C'



출처 : http://www.webmadang.net/index/main.jsp