PHP를 사용하여 이메일을 보내는 방법은 무엇입니까?


312

웹 사이트에서 PHP를 사용하고 있으며 이메일 기능을 추가하고 싶습니다.

WAMPSERVER가 설치되어 있습니다.

PHP를 사용하여 이메일을 보내려면 어떻게합니까?


답변:


442

PHP의 mail()기능을 사용하면 가능합니다. 메일 기능은 로컬 서버에서 작동하지 않습니다.

<?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);
?> 

참고:


6
로컬 서버에서 이메일을 보내야하는 경우 어떻게해야합니까? 나는 가장 가까운 메일 서버에 액세스하여 나를 위해 메일을 보낼 수있는 방법이 있다는 것을 의미합니다. 야후 메일 서버의 주소를 찾은 다음 해당 서버를 메일 용도로 사용한다는 의미입니다. 이것이 가능합니까?
user590849

19
로컬 서버에서 SMTP를 구성해야합니다. 이 비슷한 게시물을 살펴보십시오. stackoverflow.com/questions/4652566/php-mail-setup-in-xampp
Muthu Kumaran

@MuthuKumaran 님, 스팸으로 들어가면 문제를 해결할 수있는 좋은 해결책이 있습니다.
Muhammad Ashikuzzaman '12

@MuhammadAshikuzzaman PHP에서 스팸 문제를 해결할 수 없습니다. 관련이있는 경우 적절한 StackExchange 사이트에서 새로운 질문을하십시오.
울리 콜러

로컬 서버에서 작동하는지 확인하거나 확인하는 방법은 무엇입니까? 가능한 방법이 없다면, 다른 대안을 제안하십시오. 감사합니다.
abhishah901

120

https://github.com/PHPMailer/PHPMailer 에서 PHPMailer 클래스를 사용할 수도 있습니다 .

메일 기능을 사용하거나 smtp 서버를 투명하게 사용할 수 있습니다. 또한 HTML 기반 전자 메일 및 첨부 파일을 처리하므로 직접 구현할 필요가 없습니다.

수업은 안정적이며 Drupal, SugarCRM, Yii 및 Joomla와 같은 다른 많은 프로젝트에서 사용됩니다!

위 페이지의 예는 다음과 같습니다.

<?php
require 'PHPMailerAutoload.php';

$mail = new PHPMailer;

$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'smtp1.example.com;smtp2.example.com';  // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = 'user@example.com';                 // SMTP username
$mail->Password = 'secret';                           // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable encryption, 'ssl' also accepted

$mail->From = 'from@example.com';
$mail->FromName = 'Mailer';
$mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
$mail->addAddress('ellen@example.com');               // Name is optional
$mail->addReplyTo('info@example.com', 'Information');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');

$mail->WordWrap = 50;                                 // Set word wrap to 50 characters
$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
$mail->isHTML(true);                                  // Set email format to HTML

$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}

4
작곡가를 사용하지 않는 경우 :use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

43

html 형식의 이메일에 관심이 있으시면 Content-type: text/html;헤더를 입력하십시오. 예:

// multiple recipients
$to  = 'aidan@example.com' . ', '; // note the comma
$to .= 'wez@example.com';

// 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>Joe</td><td>3rd</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' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

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

// Mail it
mail($to, $subject, $message, $headers);

자세한 내용은 PHP 메일 기능을 확인하십시오 .


안녕하세요, 저는이 코드를 지쳤습니다. 수신자 3 명, Hotmail 1 개, Gmail 1 개, 웹 사이트 이메일 1 개를 추가했습니다. Hotmail을 제외한 모든 것을 받았습니다. 왜 Hotmail에서 작동하지 않는지 알고 있습니까?
antf

이 경우 스팸 폴더를 확인하십시오.
Sumoanand

나는 이미 스팸에 있지 않고 전혀 도달하지 않았다. 주제에 대해 조금 더 읽고 Hotmail에 특별한 헤더가 필요하거나 이메일이 서버를 통과하지 못하게하는 것 같습니다 ...하지만 여전히 해결책을 찾지 못했습니다.
antf

PHPMailer를 사용하고 PHPMailer의 이메일 객체에 SSL을 사용하여 이메일 계정 데이터를 입력하여 문제를 해결했습니다.
antf

메시지에 HTML 및 PHP 내용이있는 경우 어떻게합니까?

14

PEAR 메일 패키지 Pear Mail 페이지 도 살펴보십시오

내장 된 표준 mail () 함수보다 약간 더 강력 해 보입니다 (표준 함수가 적절하지 않은 경우).

다음은이 페이지에서 그 사용법을 보여주는 발췌문입니다. PEAR Mail send () 사용법

<?php
    include('Mail.php');

    $recipients = 'joe@example.com';

    $headers['From']    = 'richard@example.com';
    $headers['To']      = 'joe@example.com';
    $headers['Subject'] = 'Test message';

    $body = 'Test message';

    $smtpinfo["host"] = "smtp.server.com";
    $smtpinfo["port"] = "25";
    $smtpinfo["auth"] = true;
    $smtpinfo["username"] = "smtp_user";
    $smtpinfo["password"] = "smtp_password";


    // Create the mail object using the Mail::factory method
    $mail_object =& Mail::factory("smtp", $smtpinfo); 

    $mail_object->send($recipients, $headers, $body);
?> 

사용 된 mail.php 링크 및 폴더에있는 다른 모든 관련 파일의 다운로드 링크를 제공하십시오. 감사합니다
Muhammad Ashikuzzaman

1
@Ashik이 Mail.php예제에서 참조 된 파일은 Pear Mail 패키지의 일부입니다. Pear Mail 패키지를 다운로드하여 설치하면 포함 할 수 있습니다 Mail.php. 위의 'Pear Mail Page'링크를 클릭하면 지침이있는 다운로드 링크가 있습니다.
Kevin S

12

요즘 에는 대부분의 프로젝트에서 스위프트 메일러를 사용 합니다. 이는 인기있는 Symfony 프레임 워크Twig 템플릿 엔진 을 제공 한 동일한 사람들이 만든 이메일을 보내는 매우 유연하고 우아한 객체 지향 접근 방식 입니다.


기본 사용법 :

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

Swift 메일러 사용 방법에 대한 자세한 내용 은 공식 문서 를 참조하십시오 .


안녕하세요. 당신은 당신의 Swift_MailTransport문서에 대한 링크가라고 말합니다 Swift_SendmailTransport. 그것은 당신이 신속한 메일러의 이전 버전을 언급했거나 오타이거나, 내가 뭔가 잘못 이해했음을 의미합니까? 서버에 php7이 없기 때문에 이전 버전의 swift-mailer를 설치해야합니다. 따라서 현재 버전의 설명서가 이전 버전의 패키지와 함께 제공되는지 알아야합니다. 감사.
Yevgeniy Afanasyev

1
@YevgeniyAfanasyev : 내 대답은 2 년 전 일을하는 올바른 방법이지만 Swiftmailer v5.4.5부터 Swift_MailTransport는 더 이상 사용되지 않습니다 . 어쨌든, 프로젝트에 PHP 7을 사용할 수 없다면 Swiftmailer v5.4.9와 함께 가야합니다. 그것은 여전히 ​​PHP 5를 지원하는 마지막으로 안정적인 버전입니다. 버전 v5.4.9 설명서 또는 v5.4.9와 v6.0.2의 차이점에 대한 자세한 내용은 Fabien Potencier 에 문의 하거나 Github 에서 문제 제기하십시오 .
John Slegers

대단히 감사합니다. 따라서 배포판을 사용할 수있을 때 이전 버전에 사용할 수있는 문서가 없습니다. 알아 둘만 한.
예브게니 아파 나시 예프

7

이것은 메일 기능을 사용하여 일반 텍스트 이메일을 보내는 매우 기본적인 방법입니다.

<?php
$to = 'SomeOtherEmailAddress@Domain.com';
$subject = 'This is subject';
$message = 'This is body of email';
$from = "From: FirstName LastName <SomeEmailAddress@Domain.com>";
mail($to,$subject,$message,$from);

7

이 시도:

<?php
$to = "somebody@example.com";
$subject = "My subject";
$txt = "Hello world!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: somebodyelse@example.com";

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

5

전체 코드 예 ..

한 번 해봐 ..

<?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));
?>

5

향후 독자 : 다른 답변이 효과가없는 경우이 방법을 시도하십시오 (나와 마찬가지로).

1.) PHPMailer를 다운로드 하고 zip 파일을 열고 폴더를 프로젝트 디렉토리로 추출하십시오.

3.) 압축을 푼 디렉토리의 이름을 PHPMailer로 바꾸고 아래 코드를 PHP 스크립트 안에 작성하십시오 (스크립트는 PHPMailer 폴더 외부에 있어야 합니다)

<?php
// PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer; 
use PHPMailer\PHPMailer\Exception;
// Base files 
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
// create object of PHPMailer class with boolean parameter which sets/unsets exception.
$mail = new PHPMailer(true);                              
try {
    $mail->isSMTP(); // using SMTP protocol                                     
    $mail->Host = 'smtp.gmail.com'; // SMTP host as gmail 
    $mail->SMTPAuth = true;  // enable smtp authentication                             
    $mail->Username = 'sender@gmail.com';  // sender gmail host              
    $mail->Password = 'password'; // sender gmail host password                          
    $mail->SMTPSecure = 'tls';  // for encrypted connection                           
    $mail->Port = 587;   // port for SMTP     

    $mail->setFrom('sender@gmail.com', "Sender"); // sender's email and name
    $mail->addAddress('receiver@gmail.com', "Receiver");  // receiver's email and name

    $mail->Subject = 'Test subject';
    $mail->Body    = 'Test body';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) { // handle error.
    echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}
?>

5

기본 PHP 기능 mail()이 작동 하지 않습니다. 다음 메시지를 발행합니다.

503이 메일 서버는 로컬이 아닌 이메일 주소로 전송을 시도 할 때 인증이 필요합니다

그래서 저는 보통 PHPMailer패키지를 사용 합니다

GitHub 에서 버전 5.2.23을 다운로드했습니다 .

방금 2 파일을 골라 내 소스 PHP 루트에 넣었습니다.

class.phpmailer.php
class.smtp.php

PHP에서는 파일을 추가해야합니다

require_once('class.smtp.php');
require_once('class.phpmailer.php');

그 후에는 코드 일뿐입니다.

require_once('class.smtp.php');
require_once('class.phpmailer.php');
... 
//----------------------------------------------
// Send an e-mail. Returns true if successful 
//
//   $to - destination
//   $nameto - destination name
//   $subject - e-mail subject
//   $message - HTML e-mail body
//   altmess - text alternative for HTML.
//----------------------------------------------
function sendmail($to,$nameto,$subject,$message,$altmess)  {

  $from  = "yourcontact@yourdomain.com";
  $namefrom = "yourname";
  $mail = new PHPMailer();  
  $mail->CharSet = 'UTF-8';
  $mail->isSMTP();   // by SMTP
  $mail->SMTPAuth   = true;   // user and password
  $mail->Host       = "localhost";
  $mail->Port       = 25;
  $mail->Username   = $from;  
  $mail->Password   = "yourpassword";
  $mail->SMTPSecure = "";    // options: 'ssl', 'tls' , ''  
  $mail->setFrom($from,$namefrom);   // From (origin)
  $mail->addCC($from,$namefrom);      // There is also addBCC
  $mail->Subject  = $subject;
  $mail->AltBody  = $altmess;
  $mail->Body = $message;
  $mail->isHTML();   // Set HTML type
//$mail->addAttachment("attachment");  
  $mail->addAddress($to, $nameto);
  return $mail->send();
}

그것은 매력처럼 작동합니다


2
답변 주셔서 감사합니다. 당신은 그의 대답에 표시된 @norteo와 동일한 제안을했습니다. v5.2는 더 이상 사용되지 않으며 보안 업데이트를 수신하지 않습니다. v6의 경우 다음을 직접 요구할 수 있습니다.use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

4

PHP에서 이메일을 보내는 핵심 방법은 내장 mail()기능 을 사용하는 것이지만 통합을 쉽게 할 수있는 바로 사용할 수있는 몇 가지 SDK가 있습니다.

  1. 스위프트 메일러
  2. PHPMailer
  3. Pepipost (HTTP를 통해 작동하므로 SMTP 포트 차단 문제를 피할 수 있음)
  4. 메일을 보내다

추신 : 나는 Pepipost와 함께 일하고 있습니다.


3
Pepipost와 함께 일하며 Pepipost를 3 위에 둡니다. +1
유전자 코드

2
@GeneCode, 뭔가가 최고라면, 그렇게됩니다. Swiftmailer와 PHPMailer는 이메일을 보내기위한 최고의 오픈 소스 도구 중 하나입니다 (따라서 1과 2에 보관했습니다). 그러나 동시에 Pepipost SDK에서 해결하려는 특정 제한 사항 및 차단 기능이 있습니다.
Dibya Sahoo


1

이 스크립트와 함께 이메일을 보냈습니다

<h2>Test Mail</h2>
<?php

if (!isset($_POST["submit"]))
  {
  ?>
  <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
  From: <input type="text" name="from"><br>
  Subject: <input type="text" name="subject"><br>
  Message: <textarea rows="10" cols="40" name="message"></textarea><br>
  <input type="submit" name="submit" value="Click To send mail">
  </form>
  <?php
  }

else

  {

  if (isset($_POST["from"]))
    {
    $from = $_POST["from"]; // sender
    $subject = $_POST["subject"];
    $message = $_POST["message"];

    $message = wordwrap($message, 70);

    mail("Test@example.com",$subject,$message,"From: $from\n");
    echo "Thank you for sending an email";
    }
  }
?>

이메일 보내기 버튼을 누르면 이메일이 Test@example.com으로 전송됩니다.


1
<?php
include "db_conn.php";//connection file
require "PHPMailerAutoload.php";// it will be in PHPMailer
require "class.smtp.php";// it will be in PHPMailer
require "class.phpmailer.php";// it will be in PHPMailer


$response = array();
$params = json_decode(file_get_contents("php://input"));

if(!empty($params->email_id)){

    $email_id = $params->email_id;
    $flag=false;
    echo "something";
    if(!filter_var($email_id, FILTER_VALIDATE_EMAIL))
    {
        $response['ERROR']='EMAIL address format error'; 
        echo json_encode($response,JSON_UNESCAPED_SLASHES);
        return;
    }
    $sql="SELECT * from sales where email_id ='$email_id' ";

    $result = mysqli_query($conn,$sql);
    $count = mysqli_num_rows($result);

    $to = "demo@gmail.com";
    $subject = "DEMO Subject";
    $messageBody ="demo message .";

    if($count ==0){
        $response["valid"] = false;
        $response["message"] = "User is not registered yet";
        echo json_encode($response);
        return;
    }

    else {

        $mail = new PHPMailer();
        $mail->IsSMTP();
        $mail->SMTPAuth = true; // authentication enabled
        $mail->IsHTML(true); 
        $mail->SMTPSecure = 'ssl';//turn on to send html email
        // $mail->Host = "ssl://smtp.zoho.com";
        $mail->Host = "p3plcpnl0749.prod.phx3.secureserver.net";//you can use gmail 
        $mail->Port = 465;
        $mail->Username = "demousername@example.com";
        $mail->Password = "demopassword";
        $mail->SetFrom("demousername@example.com", "Any demo alert");
        $mail->Subject = $subject;

        $mail->Body = $messageBody;
        $mail->AddAddress($to);
        echo "yes";

        if(!$mail->send()) {
           echo "Mailer Error: " . $mail->ErrorInfo;
       } 
       else {
           echo "Message has been sent successfully";
      }
    }

}
else{
    $response["valid"] = false;
    $response["message"] = "Required field(s) missing";
    echo json_encode($response);
}


?>

위의 코드는 저에게 효과적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.