생활코딩

Coding Everybody

이메일 전송 & 라이브러리의 확장

토픽 생활코딩 > 서버 > PHP > CodeIgniter

수업소개

이번 수업에서는 토픽을 추가 할 때 모든 회원에게 토픽이 추가 되었음을 알리는 이메일을 발송하는 방법을 알아본다. 이 과정에서 CodeIgniter의 이메일 라이브러리 클래스의 사용방법을 알아보고, 개발환경에서는 실제 사용자에게 이메일을 보내는 것이 아니라 지정된 개발자에게 이메일을 전송 할 수 있게 Email 라이브러리를 확장하는 방법을 알아본다. 

이메일 발송

토픽을 작성하면 이메일을 모든 회원들에게 발송하는 로직을 만들어보자. CodeIgniter는 이메일을 전송할 수 있는 라이브러리를 제공한다. 이에 대한 자세한 사용법은 공식 메뉴얼을 참고한다. Email Class 바로기기

토픽을 작성했을 때 이메일을 발송하기 위해서는 이메일 로직이 동작할 적절한 포인트를 찾아야 한다. 글 작성 후에 이메일 발송 로직을 위치시키는 것이 바람직해보인다. 우선 모든 사용자를 가져오는 로직을 user_model에 추가한다. 

/application/models/user_model.php

function gets(){
    return $this->db->query("SELECT * FROM user")->result();
}

gets() 메소드를 실행해서 이메일 수신자의 리스트를 알아낸다. $this->load->library('email')을 통해서 이메일 라이브러리 클래스를 로드한다. 로드 후에는 $this->email을 통해서 이 클래스에 접근이 가능하다. 자세한 내용은 예제에 주석으로 표시했다. 코드를 참조한다.

    if ($this->form_validation->run() == FALSE)
    {
         $this->load->view('add');
    }
    else
    {
        $topic_id = $this->topic_model->add($this->input->post('title'), $this->input->post('description'));
        $this->load->model('user_model');
        $users = $this->user_model->gets();
        $this->load->library('email');
        // 전송할 데이터가 html 문서임을 옵션으로 설정
        $this->email->initialize(array('mailtype'=>'html'));
        $this->load->helper('url');
        foreach($users as $user){
            // 송신자의 이메일과 이름 정보
            $this->email->from('master@ooo2.org', 'master');            
            // 이메이 제목
            $this->email->subject('글을 발행 됐습니다.');
            // 이메일 본문
            $this->email->message('<a href="'.site_url().'index.php/topic/get/'.$topic_id.'">'.$this->input->post('title').'</a>');
            // 이메일 수신자.
            $this->email->to($user->email);
            // 이메일 발송
            $this->email->send();
        }            
        redirect('/topic/get/'.$topic_id);
    }
    
    $this->_footer();
}

개발용 이메일 설정 & 라이브러리 확장

CodeIgniter는 웹개발에 필요한 유용한 라이브러리들을 제공하고 있다. 그런데 라이브러리의 기본 동작 방법을 변경하고 싶다면 어떻게 해야 할까? 코어를 직접 변경할 수도 있겠지만, 이것은 추후 업그레이드시에 많은 문제를 유발한다. 공식적인 방법은 라이브러리 클래스를 상속하는 것이다. 

코어 라이브러리를 상속하기 위해서는 몇가지 규칙을 이해해야 한다. Email Class를 확장하고 싶다면 /application/libraries/ 디렉토리에 MY_Email.php 라는 이름의 파일을 만든다. MY_ 는 규칙사항이다. CI는 Email 클래스를 실행할 때 MY_Email.php 파일이 존재하는지 확인한다. MY_Email 파일에는 MY_Email 클래스를 만들고 CI_Email 클래스를 상속해야 한다. 

다음 예제는 /application/config/config.php 에 dev_receive_email 설정이 존재한다면 이 값으로 모든 이메일을 전송하는 방법이다. 이메일은 한번 발송되면 주어담을 수 없는 커뮤니케이션 도구이기 때문에 개발 시에 상당히 까다로운 시스템이다. 개발환경에서는 무조건 특정 이메일로 전송되게 한다면 보다 안심하고 개발 할 수 있을 것이다. 

/application/libraries/MY_Email.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Email extends CI_Email {
	public function to($to)
	{
		$this->ci = &get_instance();
		$_to = $this->ci->config->item('dev_receive_email');
		$to = $_to ? $_to : $to;
		return parent::to($to);
	}
}

태그

댓글

댓글 본문
  1. 존레논아부지
    완!!
  2. jeisyoon
    2021.08.24 이메일 전송 및 라이브러리의 확장 - OK
  3. 신입1
    고맙습니다.
  4. JustStudy
    고맙습니다
  5. will
    .
  6. 킬러루프
    원하시는 기능인지는 모르겠지만 이클립스에 CI 코드 자동완성 만드는 방법을 검색하서 적용하시면 해당 함수로 한번에 이동이 가능하기는 합니다..
    /**
    * @property CI_Loader $load
    */
    class CI_Controller {}
    구조가 이런식으로 생겼습니다. 프로젝트내 아무위치에나 넣으시면 됩니다.
    대화보기
    • egoing
      플래쉬일 가능성이 있겠죠. 그 상위 태그를 따라가면서 찾아보셔요
      대화보기
      • femto
        이고잉님 이 강좌말고 다른 질문거리가 생겼는데
        어디에 질문을 해야할지몰라서..글 남겨봅니다.
        요즘 여러 강의들을 듣고 습관이 하나 생겼는데
        네이버나 다음 등 각종 웹싸이트마다 요소 검사를 해서 보곤하는데요.
        네이버웹툰에 별점 남기기가 궁금해서 요소검사를하려했더니 아예 오른쪽 마우스 버튼이 눌러지질 않습니다.
        네이버안에 각종 네이버 tv케스트나 뉴스등 여러곳에서는 요소검사가 가능한테
        네이버웹툰에서만 오른쪽 마우스 버튼이 눌러지질 않아요.
        왜그러는걸까요?
      • 육점이
        감사합니다 ~ 코드 이그나이터 수업은 예제가 복잡해서 다시한번 꼭 봐야겠어요!!!

        항상 너무 너무 감사합니다.

        저도 미래에 이고잉님의 지식공유와, 재능기부의 행보와 같은 가치있는 일을 꼭 할 것입니다. ^_^
      • 샤핀
        $this->ci = &get_instance(); 이런 부분이 나오니까 굉장히 어렵긴 하네요.
        자바에서 getContext()!? 와 같은 개념인 거 같긴 한데.. 내공이 부족함을 항상 다양한 강의를 통해 느낍니다. ...
      • egoing
        예 그런 편의성은 인타프라터 언어에서는 지원하기가 좀 어려워서요
        대화보기
        • 샤핀
          이쯤에서 드는 생각인데 이클립스는 컴파일 후에 꼭 디버깅 모드가 아니더라도 class 나 method 사이에 대고 F3키를 누르면 소스 네비게이션이 편하게 되지 않습니까.
          서브라임텍스트 php 수업은 보통 직접 디렉토리를 클릭해서 함수 안으로 이동하거나 해서 좀 불편한 감이 있습니다.
          혹시 소스 네비게이션이 되게 해주는 서브라임 텍스트 플러그인이 있을까요? ^^;;


          xdebug까지 보질 않아서 모르지만... 일일히 마우스로 디렉토리 클릭해서 사용된 함수 안으로 들어가서 뜯어 고치자니... 불편하네요. 이클립스 같은 ide 사용하다 이러니 좀 불편한거 같아서 질문드립니다.
          php와 같은 인터프리터 언어는 동시 통역과 같아서 디버깅 시 외에는 소스 네비게이션이 안되려나요....
        • 김승갑
          강의 잘봤습니다.
          Xdebug와 Netbeans 강의 해주시면 좋을거같은데ㅎㅎ
          혹시 벌써 있나요 찾아봐야겠네요~