Mail 메일 보내기

(PHP 4, PHP 5, PHP 7, PHP 8)

mail - 메일 보내기


설명

mail(
    string $to,
    string $subject,
    string $message,
    array|string $additional_headers = [],
    string $additional_params = ""
): bool
                

메일 보내기


매개변수

to
수신자 또는 메일 수신자.

이 문자열의 형식은 » RFC 2822를 준수해야 합니다. 몇 가지 예는 다음과 같습니다.

  • user@example.com
  • user@example.com, anotheruser@example.com
  • User <user@example.com>
  • User <user@example.com>, Another User <anotheruser@example.com>
subject
보낼 이메일의 제목입니다.

주의 제목은 » RFC 2047을 충족해야 합니다.

message
보낼 메시지입니다.

각 줄은 CRLF(\r\n)로 구분해야 합니다. 줄은 70자 이하여야 합니다.

주의 (Windows만 해당) PHP가 SMTP 서버와 직접 통신할 때 줄의 시작 부분에서 마침표가 발견되면 제거됩니다. 이에 대응하려면 이러한 발생을 이중 점으로 바꾸십시오.

                        
<?php
$text = str_replace("\n.", "\n..", $text);
?>
                        
                      
additional_headers (optional)
이메일 헤더의 끝에 삽입할 문자열 또는 배열입니다.

이것은 일반적으로 추가 헤더(From, Cc 및 Bcc)를 추가하는 데 사용됩니다. 여러 개의 추가 헤더는 CRLF(\r\n)로 구분해야 합니다. 외부 데이터가 이 헤더를 구성하는 데 사용되는 경우 원치 않는 헤더가 삽입되지 않도록 데이터를 삭제해야 합니다.

배열이 전달되면 해당 키는 헤더 이름이고 값은 각각의 헤더 값입니다.

메모: PHP 5.4.42 및 5.5.27 이전에는 각각 additional_headers에 메일 헤더 삽입 방지 기능이 없었습니다. 따라서 사용자는 지정된 헤더가 안전하고 헤더만 포함하는지 확인해야 합니다. 즉, 여러 줄 바꿈을 넣어 메일 본문을 시작하지 마십시오.

메모:

메일을 보낼 때 메일에는 From 헤더가 포함되어야 합니다. 이는 additional_headers 매개변수로 설정하거나 php.ini에서 기본값을 설정할 수 있습니다.

이렇게 하지 않으면 Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" header missing과 유사한 오류 메시지가 표시됩니다. From 헤더는 SMTP를 통해 직접 보낼 때 Return-Path도 설정합니다(Windows만 해당).

메모:

메시지가 수신되지 않으면 LF(\n)만 사용해 보십시오. 일부 Unix 메일 전송 에이전트(특히 » qmail)는 LF를 자동으로 CRLF로 대체합니다(CRLF를 사용하면 CR이 두 배로 늘어남). » RFC 2822를 준수하지 않으므로 이것은 최후의 수단이어야 합니다.

additional_params (optional)
additional_params 매개변수는 sendmail_path 구성 설정에 정의된 대로 메일을 보낼 때 사용하도록 구성된 프로그램에 명령줄 옵션으로 추가 플래그를 전달하는 데 사용할 수 있습니다. 예를 들어 -f sendmail 옵션과 함께 sendmail을 사용할 때 봉투 발신자 주소를 설정하는 데 사용할 수 있습니다.

이 매개변수는 명령 실행을 방지하기 위해 내부적으로 escapeshellcmd()에 의해 이스케이프됩니다. escapeshellcmd()는 명령 실행을 방지하지만 추가 매개변수를 추가할 수 있습니다. 보안상의 이유로 셸 명령에 원치 않는 매개변수를 추가하지 않도록 사용자가 이 매개변수를 삭제하는 것이 좋습니다.

escapeshellcmd()는 자동으로 적용되기 때문에 인터넷 RFC에서 이메일 주소로 허용하는 일부 문자는 사용할 수 없습니다. mail()은 이러한 문자를 허용할 수 없으므로 이러한 문자의 사용이 필요한 프로그램에서는 이메일을 보내는 대체 수단(예: 프레임워크 또는 라이브러리 사용)을 권장합니다.

이 메서드를 사용하여 봉투 발신자(-f)를 설정할 때 'X-Warning' 헤더가 메시지에 추가되는 것을 방지하려면 웹 서버가 실행되는 사용자를 신뢰할 수 있는 사용자로 sendmail 구성에 추가해야 합니다. sendmail 사용자의 경우 이 파일은 /etc/mail/trusted-users입니다.


반환 값

메일이 성공적으로 배달되면 true를 반환하고 그렇지 않으면 false를 반환합니다.

메일이 배달을 위해 수락되었다고 해서 메일이 실제로 의도한 목적지에 도착한다는 의미는 아닙니다.


변경 로그

버전 설명
7.2.0 additional_headers 매개변수는 이제 배열도 허용합니다.

Examples

예제 #1 Sending mail

mail()을 사용하여 간단한 이메일 보내기:

                  
<?php
// The message
$message = "Line 1\r\nLine 2\r\nLine 3";

// In case any of our lines are larger than 70 characters, we should use wordwrap()
$message = wordwrap($message, 70, "\r\n");

// Send
mail('caffeinated@example.com', 'My Subject', $message);
?>
                  
                

예제 #2 추가 헤더가 있는 메일 보내기.

MUA의 From 및 Reply-To 주소를 알려주는 기본 헤더 추가:

                  
<?php
$to      = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
    'Reply-To: webmaster@example.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?>
                  
                

예제 #3 추가 헤더를 배열로 포함하는 메일 보내기

이 예는 바로 위의 예와 동일한 메일을 보내지만 추가 헤더를 배열로 전달합니다(PHP 7.2.0부터 사용 가능).

                  
<?php
$to      = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = array(
    'From' => 'webmaster@example.com',
    'Reply-To' => 'webmaster@example.com',
    'X-Mailer' => 'PHP/' . phpversion()
);

mail($to, $subject, $message, $headers);
?>
                  
                

예제 #4 추가 명령줄 매개변수를 사용하여 메일 보내기.

additional_params 매개변수는 sendmail_path를 사용하여 메일을 보낼 때 사용하도록 구성된 프로그램에 추가 매개변수를 전달하는 데 사용할 수 있습니다.

                  
<?php
mail('nobody@example.com', 'the subject', 'the message', null,
   '-fwebmaster@example.com');
?>
                  
                

예제 #5 HTML 이메일 보내기

mail()을 사용하여 HTML 이메일을 보내는 것도 가능합니다.

                  
<?php
// Multiple recipients
$to = 'johny@example.com, sally@example.com'; // note the comma

// Subject
$subject = 'Birthday Reminders for August';

// Message
$message = '
<html>
<head>
  <title>Birthday Reminders for August</title>
</head>
<body>
  <p>Here are the birthdays upcoming in August!</p>
  <table>
    <tr>
      <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
    </tr>
    <tr>
      <td>Johny</td><td>10th</td><td>August</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// To send HTML mail, the Content-type header must be set
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859-1';

// Additional headers
$headers[] = 'To: Mary <mary@example.com>, Kelly <kelly@example.com>';
$headers[] = 'From: Birthday Reminder <birthday@example.com>';
$headers[] = 'Cc: birthdayarchive@example.com';
$headers[] = 'Bcc: birthdaycheck@example.com';

// Mail it
mail($to, $subject, $message, implode("\r\n", $headers));
?>
                  
                

메모: HTML 또는 복잡한 메일을 보내려는 경우 PEAR 패키지 » PEAR::Mail_Mime을 사용하는 것이 좋습니다.


메모

메모:

mail()의 SMTP 구현(Windows만 해당)은 sendmail 구현과 여러 면에서 다릅니다. 첫째, 메시지를 작성하는 데 로컬 바이너리를 사용하지 않고 직접 소켓에서만 작동합니다. 즉, MTA가 네트워크 소켓(localhost 또는 원격 시스템에서 가능)에서 수신 대기해야 함을 의미합니다.

둘째, From:, Cc:, Bcc: 및 Date:와 같은 사용자 정의 헤더는 처음에 MTA에서 해석되지 않지만 PHP에서는 구문 분석됩니다.

따라서 to 매개변수는 "Something <someone@example.com>" 형식의 주소가 아니어야 합니다. 메일 명령은 MTA와 통신하는 동안 이를 제대로 구문 분석하지 못할 수 있습니다.

메모:

mail() 함수는 루프에서 대량의 이메일에 적합하지 않습니다. 이 함수는 각 이메일에 대해 SMTP 소켓을 열고 닫는 데 매우 효율적이지 않습니다.

대량의 이메일을 보내는 경우 » PEAR::Mail» PEAR::Mail_Queue 패키지를 참조하세요.

메모:

다음 RFC가 유용할 수 있습니다. » RFC 1896, » RFC 2045, » RFC 2046, » RFC 2047, » RFC 2048, » RFC 2049, 및 » RFC 2822.


기타