강의 컨설팅 트레이닝 무료진단 무료책자 마케팅편지 마케팅정보공유 다이어리 서비스제휴 고객센터

mail 보내는법
작성자 : 2 나야나
등록날짜 : 2009.05.26 10:45
1,781

MIME 개요 및 헤더 필드

여러분은 메일을 보낼때 메일 내용뿐만 아니라 이미지파일 같은것을 메일에 첨부해서 보낼 수 있습니다. 이처럼 메일에 다른 첨부물들은 추가해서 보낼 수 있도록 하려면 MIME를 사용하면 됩니다. 이번 장에서는 MIME이란 무엇이고 PHP에서 어떻게 MIME 메일 클래스를 생성하는지 알아보도록 하겠습니다.

 

* 참고사이트 : http://www.phpbuilder.com/columns/kartic20000807.php3


MIME이란?
MIME(Multipurpose Internet Mail Extensions)은 텍스트만을 지원하는 e-mail시스템에서 메시지가 바이너리 형식의 첨부파일을 포함할 수 있도록 하기 위해 확장된것입니다.

MIME는 RFC 822(ARPA 인터넷 텍스트 메시지의 포맷)가 메시지 본문 내용에 ASCII문자를 사용해야 한다는 약간의 제한을 가지고 있다는 것 이외에는 많은 이점을 가지고 있습니다. 그 결과, MIME 메시지는 약간의 RFC 822 헤더를 가진 인터넷 텍스트 메일과 함께 와 ASCII의 부분조합으로 대표되는 첨부물을 포함하고 있는 형태의 본문으로 이루어져 있습니다. MIME 헤더는 여러분의 메일 첨부물에 특별한 의미를 부여합니다.

* RFC822에 관련 참고사이트 : http://www.ietf.org/rfc


MIME 메시지 분석
보통의 텍스트 e-mail메세지는 헤더부분(To: From: Subject:등)과 본문부분으로 구성됩니다. MIME 메시지는 MIME 메시지 헤더와 MIME PART헤더로 구성됩니다. MIME 메일은 RFC 822에 기반을 둔 메일을 확장한 것으로 MIME 역시 RFC의 한 부분입니다.

 

헤더 필드
MIME헤더는 MIME 메시지 헤더와 MIME PART헤더로 분류됩니다. MIME 메시지 헤더는 다음과 같이 구성되어 있습니다.

 

MIME-Version헤더
사용 할 MIME의 버전을 제공합니다.

Content타입헤더
데이터의 형식을 확인해서 사용할 수 있도록 해줍니다. text, image, audio, video, applications, multipart, message 형식을 사용할 수 있습니다. 임의의 바이너리 첨부물은 application/octet-stream 형식을 사용하면 됩니다. 몇 가지 예를 더 들면 image/jpg, application/msword, multipart/mixed등이 있습니다.


Content-Transfer-Encoding헤더
가장중요한 헤더로써 데이터의 인코딩 유형을 보여주고 MUA를 사용해서 첨부물을 디코드 할 수 있도록 합니다. 7bit, 8bit, 바이너리, quoted-printable, base64, custom, per attachment 중의 하나를 사용할 수 있습니다. 7bit 인코딩은 US ASCII문자를 사용하는 인코딩입니다. 8bit와 바이너리 인코딩은 일반적으로 잘 사용하지 않습니다. Quoted printable은 사람들이 읽기 편한 보통의 텍스트를 사용하고 데이터에 영향을 줄 수 있는 게이트웨이를 통해 보호됩니다. 이것은 보통 바이너리를 사용하고 텍스트 형식의 데이터가 아닙니다. Base64는 보통 바이너리나 텍스트가 아닌 데이터들을 인코딩하는데 사용될 수  있습니다. 7bit데이터가 아니것은 scheme(문자열을 쉽게 다루기 위해 설계된 프로그래밍 언어)를 사용해서 인터넷 메일 게이트웨이를 통과할 수 있습니다.


Content-ID헤더
Content-Type헤더가 message/external-body, multipart/alternative일 경우에 사용합니다.


Content-Description헤더
이것은 옵션 헤더로 메시지 부분에 대해서 US ASCII형태로 설명합니다.

Content-Disposition헤더
실험적인 헤더로써 MUA가 디스플레이 할 첨부물의 첨부형식을 인라인 형식으로 할 것인지 첨부형식으로 할 것인지를 결정 할 힌트를 제공합니다.

MIME PART헤더(실제로 MIME 첨부부분을 나타내는 헤더)는 MIME-Version헤더를 제외한 것을 사용할 수 있습니다. 만약, MIME 헤더가 메시지 블록의 한 부분이라면 전체 메시지에 적용됩니다. 하지만, 만약 MIME PART 내에서 사용되면, 그것은 그 PART에만 적용됩니다.

 

MIME 메세지
간단한 MIME 메세지
이 메시지는 PART가 없습니다. 다시 말해서, 첨부물이 없습니다. 이 메세지가 MIME 메세지가 되기 위해서는 필요한 헤더를 가지고 있어야 합니다.

From: php@php.net
To: 'Alex (the Great)' &ltalex@greece.net>
Subject: Bucephalus
MIME-Version: 1.0

Hello Alexander, How's Bucephalus doing?
 

위 메세지는 첨부물은 없지만 MIME 헤더를 가지는 간단한 RFC-822 메시지입니다. 위 메세지와 같이 Content-Type헤더가 존재하지 않는다면 Content-Type은 text/plain; charset='us-ascii'로 할당됩니다.
위의 메세지는 간단하지만 아래와 같이 복잡한 메세지도 있습니다.

 

From: 'Alex (the Great)' &ltalex@greece.net>
To: php@php.net
Subject: re: Bucephalus
MIME-Version: 1.0
Content-Type: image/jpg;
            name='buce.jpg'
Content-Transfer-Encoding: base64
Content-Description: Take a look at him yourself

<.....base64로 인코드된 Bucephalus jpg이미지...>

 

Multipart MIME 메세지
이 개념은 우리가 여러 개의 첨부물을 같은 e-mail로 전송하는 것을 할 수 있도록 합니다. 예를 들어, 누군가가
php@php.net이라는 e-mail을 통해 그의 말 사진과 족보차트와 텍스트 메세지를 보내기를 원한다고 한다면 Multipart 메시지라는 개념이 없다면 이 요구들을 간단히 만족시킬 수 없습니다.
이 같은 상황에서 Content-Type 메시지 헤더를 사용해서 e-mail의 각 부분을 저장하는 wrapper을 생성합니다. 그래서 사진과 족보차트와 텍스트 메세지를 가지게 됩니다.
Content-Type헤더는 완전한 e-mail 메시지를 가리키는 "multipart"값을 가지고 정보를 캡슐화합니다.
아래에 전체적인 내용이 나와 있습니다.

From: 'Alex (the Great)' &ltalex@greece.net>
To: php@php.net
Subject: re: Bucephalus
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="XX-1234DED00099A";
Content-Transfer-Encoding: 7bit

This is a MIME Encoded Message

--XX-1234DED00099A
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hi PHP,

Attached you will find my horse, Bucephalus', pedigree chart and photo.

Alex

--XX-1234DED00099A
Content-Type: image/jpg;
name="buce.jpg";
Content-Transfer-Encoding: base64
Content-Description: "A photo of Bucephalus"

<.....base64로 인코드된 Bucephalus jpg이미지...>

--XX-1234DED00099A
Content-Type: application/octet-stream;
name="pedigree.doc"
Content-Transfer-Encoding: base64
Content-Description: "Pedigree Chart of the great horse"

<.....base64로 인코드된 Bucephalus문서 (pedigree.doc)...>

--XX-1234DED00099A-

 

위의 내용을 세부적으로 살펴보도록 하겠습니다.


MIME 메시지 헤더의 Content-Transfer-Encoding헤더는 "7bit"라고 말해줍니다. Content-Type이 multipart/mixed 형식이면 인코딩은 7bit, 8bit, 바이너리 형식중 하나를 가질 수 있는데 가장 널리 사용될 수 있는 7bit형식을 사용했습니다.
메세지는 다양한 정보를 가지고 있는데 클라이언트가 어떻게 이미지 파일과 문서, 텍스트를 구분할 수 있을까요? 여러분은 Content-Type 다음에 오는 boundary="XX-1234DED00099A"; 파라미터에 주목해야 합니다. 이 값은 메일의 다양한 내용을 알려주는 MIME Boundary Marker이고 메일의 범위가 혼동되지 않도록 해줍니다.
이 메일을 관찰해보면, 모든 MIME PART 전에 두 개의 하이픈(-)으로 시작하는 boundary marker (XX-1234DED00099A)를 볼 수 있습니다. 여기서 중요한 점은 마지막 MIME PART의 boundary marker는 2개의 하이픈으로 시작하고 2개의 하이픈으로 끝난다는 것입니다. 이것은 메시지의 끝을 나타냅니다.
이제 처음 2개의 MIME 메시지 PART를 보겠습니다. 첫번째는 텍스트 메시지에 대한 설명입니다. 따라서 Content-Type은 text/plain이고 7bit로 인코딩 됩니다. 2번째는 JPEG이미지입니다. 이것은 Content-Type이 image/jpg라고 말합니다. name="buce.jpg" (Content-Type다음에 나오며 파라미터를 호출) 은 파일의 이름에 대해 설명합니다. 이것은 클라이언트가 첨부물의 이름을 알 수 있도록 해 줄 것입니다. 만약, name="buce.jpg"이 주어지지 않는다면, 첨부물의 이름으로 description필드가 디스플레이 될 것입니다.
만약 클라이언트가 인라인형식의 첨부물을 디스플레이 할 수 있다면 JPEG이미지는 e-mail의 본문에서 볼 수 있습니다. 다른 방법으로 여러분은 클라이언트에게 여러분이 원하는 첨부물을 어떻게 나타낼지를 알려줄 수도 있습니다. 예를 들어 만약에 Content-Disposition: attachment 이면 헤더는 attachment 아이콘으로 JPEG이미지를 보여줄 수 있을 것입니다.

 

MIME 클래스
PHP에서 MIME 메일 클래스를 구현할 수 있습니다. PHP는 우리가 필요로 하는 인코딩 할 수 있는 툴을 이미 가지고 있습니다.

MIME 클래스는 다음을 기능을 가져야 됩니다.

각각 요구되는 형식으로 첨부물을 인코딩 합니다.
MIME 부분의 헤더를 만듭니다.
완전한 e-mail로 MIME부분과 헤더를 포함합니다.
String로 완전한 메일을 반환합니다.
서버에 설치되어 있는 메일러를 사용해서 보냅니다.
이 클래스는 MIME_mail이라고 부릅니다. 메소드와 클래스 멤버 변수들은 내부적으로 접근합니다.

<?php

class MIME_mail {
    //public:
     var $to;
     var $from;
     var $subject;
     var $body;
     var $headers = "";
     var $errstr="";
     var $base64_func= '';
     var $qp_func = '';
     var $mailer = "";

?>

 

위는 public 변수들입니다. 다시 말해서 여러분의 스크립트 내에서 직접 다룰 수 있습니다. 위의 대부분의 변수들은 설명이 없어도 알 수 있는 것들입니다.

$headers는 여러분이 보내기를 원하는 메일러의 옵션 헤더를 가집니다.
$errstr는 스크립트내에서 사용할 수 있는 읽을 수 있는 에러값을 가집니다.
$base64_func와 $qp_func은 사용자가 커스터마이즈 할 수 있는 함수 헤더들입니다. 디폴드로 null값으로 되어있습니다. $base64_func이 null일때는 우리가 PHP에서 base64_encode() 함수를 사용할 것이라는 의미를 가집니다.
Quoted Printable은 $qp_func 변수에 의해 접근할 수 있습니다.

 

<?php

    //private:
     var $mimeparts = array();

?>

 

$mimeparts은 e-mail 메세지의 독립적인 MIME부분을 포함하는 내부 배열입니다. 이것으로 이 클래스 밖의 private메서드와 변수를 다룰 수는 없습니다.


 

<?php

    // 생성자
     function MIME_mail($from="", $to="", $subject="", $body="", $headers =
     "")
     {
         $this->to = $to;
         $this->from = $from;
         $this->subject = $subject;
         $this->body = $body;

         if (is_array($headers))
         {
             if (sizeof($headers)>1)
                 $headers=join(CRLF, $headers);
             else
                 $headers=$headers[0];
         }

         if ($from)
         {
             $headers = preg_replace("!(from:\ ?.+?[\r\n]?\b)!i", '',
                             $headers);
         }

         $this->headers = chop($headers);
         $this->mimeparts[] = "" ;
         return;
     }

?>

 

object를 위한 생성자를 가지고 있습니다. 이것은 "from"과 "to"의 e-mail 주소, 제목과 내용, 헤더들을 파라미터로 받습니다. 내용부분은 일반적인 e-mail내용을 가집니다. 마지막 파라미터는 옵션 헤더로 X-Mailer: MYMailer_1.0과 같이 사용될 수 있습니다.

$header는 여러분이 메일을 보내고자 할 때 다른 여러 헤더들이 사용될 수도 있고 하나의 특정 헤더만 사용될 수도 있습니다. 여러분은 array("X-Mailer: MYMailer_1.0", "X-Organization: PHPBuilder.com")와 같이 다중 헤더를 사용할 수 있습니다.
$mimeparts은 빈 슬롯1(index 0)을 만듭니다.

 

메서드(1)
우리는 MIME 메시지 헤더와 MIME PART헤더의 생성부분을 모듈화 시킬 수 있고, 완성된 e-mail 메시지를 만드는 부분을 다른 메서드로 만들 수 있습니다. 메서드의 구현은 앞에서 언급한 MIME의 기본을 따릅니다.

 

<?php

   &nbspfunction attach($data, $description = "", $contenttype = OCTET, $encoding = BASE64, $disp = '')
    {
         if (empty($data))
             return 0;

         if (trim($contenttype) == '')
             $contenttype = OCTET ;

         if (trim($encoding) == '')
             $encoding = BASE64;

         if ($encoding == BIT7)
             $emsg = $data;

         elseif ($encoding == QP)
             $emsg = $$this->qp_func($data);

         elseif ($encoding == BASE64)
         {
             if (!$this->base64_func)
                 $emsg = base64_encode($data);
             else
                 $emsg = $$this->base64_func($data);
         }

         $emsg = chunk_split($emsg);

         if (preg_match("!^".TEXT."!i", $contenttype) && !preg_match
            ("!;charset=!i", $contenttype))
         $contenttype .= ";\r\n\tcharset=".CHARSET ;

         $msg = sprintf("Content-Type: %sContent-Transfer-Encoding: %s
                             %s%s%s",$contenttype.CRLF, $encoding.CRLF,
                             ((($description) && (BODY != $description))?"Content-
                            &nbspDescription: $description".CRLF:""),
                             ($disp?"Content-Disposition: $disp".CRLF:""),
                              CRLF.$emsg.CRLF);

         BODY==$description? $this->mimeparts[0] = $msg:
                                        $this->mimeparts[] = $msg ;

         return sizeof($this->mimeparts);
    }

?>

 

위의 메서드를 살펴 보도록 하겠습니다.


위의 메소드는 다음 파라미터들을 가집니다. 실제 데이터에 접속하는 $data, Content-Description 헤더로써 데이터의 응답을 설명하는 $description, Content-Type 헤더를 사용해서 데이터의 content-type을 정하는 $contenttype, 인코딩에 사용할 Content-Transfer-Encoding의 값을 정하는 $encoding, Content-Disposition헤더내에서 사용할 수 있는 배치값 $disp는 인라인 형식 또는 첨부형식으로 사용할 수 있도록 상수값을 가집니다.
BASE64, TEXT등의 값은 .def 파일에 상수로 정의 되어 있습니다.

인코딩 프로세스 다음에 오는 인코드 정보를 가지고 있는 chunk_split()를 사용하는 것에 주목하세요. 이 함수는 임의의 길이로 string을 더 작은 조각으로 나누어 주는 함수입니다. 여기서는 길이에 대해 언급하지 않았기 때문에 디폴트로 76이 사용됩니다. 이것은 emailing 규칙입니다.
$contenttype 파라미터가 text/plain을 포함하고 있다면 "charset="파라미터값은 반드시 주어집니다. 그 값은 문자상수로 정의되고 US-ASCII 형식으로 사용됩니다. 헤더들이 파라미터 값들을 가지면 Content-Type: text/plain; charset=us-ascii와 같이 헤더와 파라미터 사이를 세미콜론(;)으로 구분합니다.
MIME PART 헤더들의 각각의 값들을 이 메서드에 넘겨주면 다른 MIME PART 헤더들이 만들어 집니다. 설명이 없는 Content-Description헤더는 가지지 않으려면 헤더들을 만든 후에 여러분은 인코드 데이터 부분의 정보를 추가하세요.
BODY라고 부르는 설명 필드를 클래스를 구현하기 위해 사용합니다. 만약 설명 필드가 BODY와 같다면 $mimeheaders 배열의 첫 번째 슬롯(index 0)을 사용합니다.
attach()는 $mimeparts의 현재 크기를 반환합니다. 이 방법은 첨부물이 존재하는 위치를 알려줍니다.(보통 반환값 보다 하나 적은 수를 실제 배열의 인덱스로 반환.)
모든 헤더들은 CRLF (\r\n)으로 제한됩니다.


메서드(2)


다음은 build_message()메서드 입니다.

 

<?php

   function build_message()
    {
         $msg = "";
         $boundary = 'PM'.chr(rand(65, 91)).'------'.md5(uniqid(rand()));
         $nparts = sizeof($this->mimeparts);

         if (is_array($this->mimeparts) && ($nparts > 1))
         {
             $c_ver = "MIME-Version: 1.0".CRLF;
             $c_type = 'Content-Type: multipart/mixed;'.CRLF
                            ."\tboundary=\"$boundary\"".CRLF;
             $c_enc = "Content-Transfer-Encoding: ".BIT7.CRLF;
             $c_desc = $c_desc?"Content-Description: $c_desc".CRLF:"";
             $warning = CRLF.WARNING.CRLF.CRLF ;

             if (!empty($this->body))
             {
                 $this->attach($this->body, BODY, TEXT, BIT7);
             }

             for ($i=0 ; $i < $nparts; $i++)
             {
                 if (!empty($this->mimeparts[$i]))
                 $msg .= CRLF.'--'.$boundary.CRLF.$this->mimeparts[$i]
                             .CRLF;
             }

             $msg .= '--'.$boundary.'--'.CRLF;
             $msg = $c_ver.$c_type.$c_enc.$c_desc.$warning.$msg;
         }
         else
         {
             if (!empty($this->body)) $msg .= $this->body.CRLF.CRLF;
         }

         return $msg;
    }

?>
 

위 내용을 분석해 보겠습니다.

각각의 MIME PART가 가지는 boundary marker와 marker의 유일한 id에 대해 앞에서 읽었습니다. boundary marker는 다음과 같이 사용됩니다. MIME 메시지 헤더는 첨부물을 구분해서 나타냅니다. MIME PARTS : 실제로 각각의 부분 전후로 attachment boundary로 구분되어 있습니다.

$boundary는 임의의 숫자의 unique한 값을 MD5 hash를 적용해서 boundary marker로 사용합니다. 추가적으로 $boundary에 "PM?"라고 덧 붙였습니다. 여기서 ?는 임의의 알파벳을 말합니다. $boundary값은 "PMK-----2345ee5de0052eba4daf47287953d37e"과 같이 됩니다.
MIME 헤더들을 생성하는 과정동안 2가지 경우를 생각해야 합니다. 첫 번째 경우는 첨부물을 사용할 수 있는 경우입니다. 본문 메시지가 "This is a MIME Encoded Message"라는 경고 메시지인지 생각해 보십시오. 실제 메시지는 첨부물로 들어가 있습니다. e-mail 내용은 첨부물 중에서 보통 첫 번째 것입니다. 우리의 경우에는 $mimeparts[0]가 됩니다. 실제로 $mimeparts만 사용해도 첫 번째 슬롯이 0이 되어서 이메일 내용 부분을 사용할 수 있습니다. e-mail일 본문은 text/plain형식으로 7bit로 인코딩 되어야 합니다. 
 
 

<?php

   if (!empty($this->body))
    {
         $this->attach($this->body, BODY, TEXT, BIT7);
    }

?>

 

위 부분은 e-mail 내용 부분을 MIME 첨부물로서 첨부시키는 작업입니다. attach()의 BODY로 이것을 첨부시킵니다.

2번째 경우에는 첨부물이 없을 때입니다. 이 경우에, 메일 내용은 $msg에 저장되고 MIME 헤더는 필요가 없습니다. (그러나, 우리는 이 경우에 MIME- Version 헤더만 사용한 가장 간단한 MIME 메시지 형태로 만듭니다.)

첨부물이 있으면 MIME 메시지 헤더들(MIME-Version, Content-Type등)이 만들어 집니다. MIME 메시지 헤더와 함께 메시지 본문을 만들려면 먼저, MIME 메시지 헤더를 만듭니다. 수행중에 만들어지는 $mimeheaders 배열을 통해 각각의 MIME PART를 이용할 수 있습니다. 여기서 실제로 boundary marker ($boundary)가 사용됩니다. 규칙에 따르면 두 개의 하이픈을 boundary marker 앞에 붙이고 ('--'.$boundary.CRLF;) 마지막 MIME PART는 전체 메시지가 끝나는 것을 알려주는 두 개의 하이픈을 boundary marker뒤에도 붙입니다. ('--'.$boundary.'--'.CRLF;)
이 함수의 결과로 완성된 메세지는 반환되어서 $msg안에 들어갑니다
다음 gen_email() 메서드는 build_message()를 사용해서 만든 MIME 메시지를 완성시킵니다. gen_email ()함수는 RFC 822헤더를 붙여서 하나의 완성된 메일을 만듭니다.


<?php

     function gen_email($force=false)
     {
         if (!empty($this->email) && !$force) return $this->email ;
         $email = "";
         if (empty($this->subject)) $this->subject = NOSUBJECT;
         if (!empty($this->from)) $email .= 'From: '.$this->from.CRLF;
         if (!empty($this->headers)) $email .= $this->headers.CRLF;
         $email .= $this->build_message();
         $this->email = $email;
         return $this->email;
     }

?>

클래스 멤버변수 $email은 완전한 e-mail 메시지를 가지고 있습니다. 불필요한 메시지 재생성을 피하기 위해서 $email이 값이 없을 경우에만 e-mail 헤더를 만들고 build_message()를 호출합니다. 그러나, gen_email(true)이면 강제로 메시지를 재생성 합니다.

gen_email()은 FROM 헤더를 만듭니다. 제목이 없을 경우에는 NOSUBJECT로 만듭니다. To와 Subject헤더들을 포함시켜서 저장합니다. 이 메서드는 MIME 메세지를 만들고 완전한 e-mail 메시지를 반환합니다.

print_mail() 과 send_mail()이라는 메서드가 있는데 이것은 $force 파라미터를 가집니다. print_mail() 완전한 e-mail메세지를 출력하고 send_mail()은 PHP의 mail()함수를 이용해서 메시지를 보냅니다. send_mail()는 SMTP 객체의 send 메서드를 이용합니다.

 

마치며...
이번 장에서는 MIME가 무엇인가와 PHP에서 구현한 MIME 메일 클래스에 대해서 알아보았습니다. 다소 설명이 부족하지만 이번장이 도움이 되셨으면 합니다. 다음 강좌에서는 PHP에서 동적인 이미지를 어떻게 구현하는지에 대해 알아보겠습니다.

[출처]  민주가인

"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기,
각종 광고, 영업, 판매, 제안서, 전단지
반응율 3배×10배 이상 높이는 마법의 8단계 공식"
자세히보기

Comments

번호 제목 글쓴이 날짜 조회
3225 random 값 만들기 2 나야나 05.26 2209
3224 로그인 체크 2 나야나 05.26 2299
열람중 mail 보내는법 2 나야나 05.26 1782
3222 포토샵 액션 사용하기 2 bath (단순작업 자동화) 2 dman 04.26 2625
3221 포토샵 액션 사용하기 (단순작업 자동화) 2 dman 04.26 2515
3220 브라우져에서 페이지 전환시 오버렙 되면서 부드럽게 이동 2 dman 04.26 2614
3219 화면 캡춰하여 이용하는방법 2 dman 04.26 2362
3218 내 pc사양 정확히 아는방법 2 dman 04.26 3411
3217 [브라우저] 신기한 IE의 버그 2 돌구리 04.14 2398
3216 [알고리즘] 1년치 달력 간단히 출력 2 돌구리 04.14 2646
3215 [스크립트] tooltip script 2 돌구리 04.14 2584
3214 [스크립트] 마우스 오른쪽클릭방지 해제 스크립트 2 돌구리 04.14 2365
3213 [스크립트] javascript로 그림 그리기 2 돌구리 04.14 2677
3212 [함수] [개작] 간단한 풀다운 메뉴 (노클릭-팝업) 2 돌구리 04.14 2468
3211 내 PC IP 아는 간단한 방법 댓글1 2 성공맨 04.03 3356
3210 1-32.[음악] 음악주소 직접만들기 - ⑧ 음악소스 wma 파일로 변환 99 단국강토 02.19 2900
3209 1-31.[음악] 음악주소 직접만들기 - ⑦ 음악파일 형식 99 단국강토 02.19 2598
3208 1-30.[음악] 음악 불러오기 - ⑥ 음악주소 찾기 - 음악 사이트 분석 99 단국강토 02.19 2800
3207 1-29.[음악] 음악 불러오기 - ⑤ 음악주소 찾기 - 카페 활용 99 단국강토 02.19 2428
3206 1-28.[음악] 음악 불러오기 - ④ 음악주소 찾기 근본적 문제 99 단국강토 02.19 3223
3205 1-27.[음악] 음악 불러오기 - ③ 재생 횟수 조절하기 loop / infinite 99 단국강토 02.19 1999
3204 1-26.[음악] 음악 불러오기 - ② 플레이어 감추기 bgsound / hidden 99 단국강토 02.19 2544
3203 1-25.[음악] 음악 불러오기 - ① 음악태그 <embed src="음악주소"> 99 단국강토 02.19 2222
3202 HTML 특수문자코드표 99 단국강토 02.19 3259
3201 1-24.[그림] 그림 불러오기 - ⑥ 그림 여백 만들기 99 단국강토 02.19 2117
3200 1-23.[그림] 그림 불러오기 - ⑤ 그림 테두리 만들기 99 단국강토 02.19 2308
3199 1-22.[그림] 그림 불러오기 - ④ 그림 위치조절, 그림과 글자 위치조절 99 단국강토 02.19 2085
3198 1-21.[그림] 그림 불러오기 - ③ 그림 크기조절 99 단국강토 02.19 2441
3197 1-20.[그림] 그림 불러오기 - ② 그림 부르기 [img src="그림주소"] 99 단국강토 02.19 2777
3196 1-19.[그림] 그림 불러오기 - ① 그림 주소 알아내기 99 단국강토 02.19 2507
마케팅
특별 마케팅자료
다운로드 마케팅자료
창업,경영
기획,카피,상품전략
동기부여,성취