SMTP 서버에서 PHP로 이메일 보내기


131
$from = "someonelse@example.com";
$headers = "From:" . $from;
echo mail ("borutflis1@gmail.com" ,"testmailfunction" , "Oj",$headers);

PHP로 이메일을 보내는 데 문제가 있습니다. 오류가 발생합니다.SMTP server response: 530 SMTP authentication is required .

SMTP없이 이메일을 보내서 확인할 수 있다는 인상을 받았습니다. 이 메일은 제대로 필터링 될 수 있지만 지금은 중요하지 않습니다.

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = someonelse@example.com

이것은 php.ini파일 의 설정입니다 . SMTP를 어떻게 설정해야합니까? 확인이 필요없는 SMTP 서버가 있습니까? 아니면 서버를 직접 설정해야합니까?

답변:


168

SMTP 인증이 필요한 서버를 통해 이메일을 보낼 때는 실제로이를 지정하고 호스트, 사용자 이름 및 비밀번호 (및 기본 포트가 아닌 경우 포트-25)를 설정해야합니다.

예를 들어, 나는 보통 다음과 비슷한 설정으로 PHPMailer를 사용합니다 :

$mail = new PHPMailer();

// Settings
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';

$mail->Host       = "mail.example.com"; // SMTP server example
$mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 25;                    // set the SMTP port for the GMAIL server
$mail->Username   = "username"; // SMTP account username example
$mail->Password   = "password";        // SMTP account password example

// Content
$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';

$mail->send();

PHPMailer에 대한 자세한 내용은 https://github.com/PHPMailer/PHPMailer를 참조 하십시오.


21
phpMailer의 경우 +1-PHP의 기본 제공 mail()기능을 대신 할 수 있습니다.
SDC

8
PHPMailer도 WordPress에 내장되어 있으며 'phpmailer_init'작업 후크를 사용하여 구성 할 수 있다는 점 에서이 답변에 걸림돌이 있음을 주목할 가치가 있습니다 . SMTP 메일 또는 Amazon SES (SMTP 연결을 지원)에 대해 WordPress를 설정하는 편리한 방법입니다.
Matt van Andel

1
유료 스크립트에서 PHP Mailer를 사용할 수 있습니까?
Luka

2
@ 루카 예, 그렇습니다. 라이센스 파일 에 따르면 PHPMailer는 LGPL 2.1 라이센스를 사용하므로 상용으로 사용할 수 있습니다.
Alejandro

이 코드를 사용하려면 특별한 조치가 필요합니까? 이것을 어디에 두어야합니까? POST 요청이있는 HTML5 양식으로 호출 할 수 있습니까? 이 PHPMailer 객체를 생성 한 후 이메일을 보내려면 어떻게해야합니까?
Aaron Franke

53
<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "YOURMAIL@gmail.com");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = YourMail@address.com";

$headers = "From: YOURMAIL@gmail.com";

mail("Sending@provider.com", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

또는 자세한 내용 은를 참조하십시오 .


메일을 보내는 데 사용하는 IP는 550-5.7.1 서버로 직접 이메일을 보낼 수있는 권한이 없습니다. 이 오류가 발생합니다. 내가 원하는 것은 오픈 메일 릴레이입니다.
Borut Flis

고정 IP가 없습니다. Open mail relay를 알고 있습니까?
Borut Flis

1
또한 참조 Google SMTP 릴레이에 support.google.com/a/answer/176600?hl=ko 를 .
fyrye

5
이것은 godaddy php mail()기능 문제에 대한 최고의 답변입니다
-2017

4
"읽기"링크가 끊어짐
vladkras

46

Unix 사용자의 경우 mail ()은 실제로 Sendmail 명령을 사용하여 전자 메일을 보냅니다. 응용 프로그램을 수정하는 대신 환경을 변경할 수 있습니다. msmtp 는 Sendmail 호환 CLI 구문을 사용하는 SMTP 클라이언트로 Sendmail 대신 사용할 수 있습니다. php.ini를 약간만 변경하면됩니다.

sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"

그런 다음 low-mail () 함수조차도 SMTP 양호와 함께 작동 할 수 있습니다. 응용 프로그램을 수정하지 않고 기존 응용 프로그램을 sendgrid 또는 mandrill과 같은 메일 서비스에 연결하려는 경우 매우 유용합니다.


1
훌륭한 솔루션, 지금 여러 서버에서 사용하십시오!
raice

3
메일 링 라이브러리를 사용하지 않는 앱의 Docker 컨테이너에서 이것을 구현합니다.
Batandwa 2016 년

바닐라 mail()에서 SMTP를 지원하는 것으로의 훌륭한 마이그레이션 경로 . 감사합니다!
rinogo

MSMTP는 Windows에서도 사용할 수 있습니다. 명백한 다운로드 버전은 1.4입니다. 내가 찾은 버전은 1.6.2입니다. Windows 용 1.8.6이 있는지 알 수 없습니다.
Bilbo

저자는 2016 년 2 월 이전에 Windows 바이너리 제공을 중단했습니다.
Bilbo

17

문제는 PHP mail()함수는 기능이 매우 제한되어 있다는 것입니다. PHP에서 메일을 보내는 방법에는 여러 가지가 있습니다.

  1. mail()시스템에서 SMTP 서버를 사용합니다. Windows에서 사용할 수있는 서버는 적어도 두 개입니다. hMailServerxmail 입니다. 몇 시간 동안 구성하고 시작했습니다. 첫 번째는 내 의견으로는 더 간단합니다. 현재 hMailServer는 Windows 7 x64에서 작동합니다.
  2. mail()Linux가있는 원격 또는 가상 머신에서 SMTP 서버를 사용합니다. 물론 Gmail과 같은 실제 메일 서비스는 자격 증명이나 키가 없으면 직접 연결을 허용하지 않습니다. 가상 머신을 설정하거나 LAN에있는 가상 머신을 사용할 수 있습니다. 대부분의 Linux 배포판에는 기본적으로 메일 서버가 있습니다. 그것을 구성하고 재미있게 보내십시오. LAN 인터페이스를 수신하는 데비안 7에서 기본 exim4를 사용합니다.
  3. 메일 링 라이브러리는 직접 연결을 사용합니다. 립을 설정하기가 더 쉽습니다. SwiftMailer를 사용했으며 Gmail 계정에서 메일을 완벽하게 보냅니다. PHPMailer도 꽤 좋다고 생각합니다.

어떤 선택을 하든지 추상화 계층을 사용하는 것이 좋습니다. Windows를 실행하는 개발 시스템에서 PHP 라이브러리를 사용 mail()하고 Linux가있는 프로덕션 시스템에서 간단하게 작동 할 수 있습니다 . 추상화 계층을 사용하면 응용 프로그램이 실행되는 시스템에 따라 메일 드라이버를 교환 할 수 있습니다. MyMailer추상 send()메소드를 사용하여 추상 클래스 또는 인터페이스를 작성하십시오 . 상속이 개 클래스 MyPhpMailerMySwiftMailer. send()적절한 방법으로 방법을 구현하십시오 .


17

PHP PEAR로 수행하는 방법은 다음과 같습니다.

// Pear Mail Library
require_once "Mail.php";

$from = '<your@mail.com>'; //change this to your email address
$to = '<someone@mail.com>'; // change to address
$subject = 'Insert subject here'; // subject of mail
$body = "Hello world! this is the content of the email"; //content of mail

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => 'your@gmail.com', //your gmail account
        'password' => 'snip' // your password
    ));

// Send the mail
$mail = $smtp->send($to, $headers, $body);

//check mail sent or not
if (PEAR::isError($mail)) {
    echo '<p>'.$mail->getMessage().'</p>';
} else {
    echo '<p>Message successfully sent!</p>';
}

Gmail SMTP를 사용하는 경우 설정 아래의 Gmail 계정에서 SMTP를 활성화해야합니다.

편집 : 데비안 / 우분투에서 Mail.php를 찾을 수 없다면 php-pear를 설치하십시오.

sudo apt install php-pear

그런 다음 메일 확장을 설치하십시오.

sudo pear install mail
sudo pear install Net_SMTP
sudo pear install Auth_SASL
sudo pear install mail_mime

그런 다음 require_once "Mail.php" 여기에있는 다른 방법 으로로드 할 수 있어야합니다 ./usr/share/php/Mail.php


1
require_once ( '/usr/share/somewhere/Mail.php');

10

인증없이 작동하는 일부 SMTP 서버가 있지만 서버에 인증이 필요한 경우이를 우회 할 방법이 없습니다.

PHP의 내장 메일 기능은 매우 제한적입니다. SMTP 서버 지정은 WIndows에서만 가능합니다. * nix에서mail() OS 바이너리를 사용합니다.

인터넷의 임의의 SMTP 서버로 전자 메일을 보내려면 SwiftMailer 와 같은 라이브러리를 사용하십시오 . 이를 통해 예를 들어 Google Mail의 발신 서버를 사용할 수 있습니다.


2

Linux에서 Wordpress 사이트를 호스팅하고 서버에 액세스 할 수있는 경우 msmtp를 설치하여 표준 PHP mail () 함수에서 smtp를 통해 보낼 수있는 두통을 줄일 수 있습니다. msmtp는 postfix에 대한 간단한 대안으로 약간 더 많은 구성이 필요합니다.

단계는 다음과 같습니다.

msmtp 설치

sudo apt-get install msmtp-mta ca-certificates

새 구성 파일을 작성하십시오.

sudo nano /etc/msmtprc

... 다음 구성 정보 포함 :

# Set defaults.    
defaults

# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
syslog LOG_MAIL

"<"및 ">"내의 모든 항목으로 표시되는 구성 데이터를 교체해야합니다 (이를 포함하여 제거). 호스트 / 사용자 이름 / 비밀번호의 경우 메일 제공 업체를 통해 메일을 발송하려면 일반 자격 증명을 사용하십시오.

PHP에게 사용하도록 지시하십시오

sudo nano /etc/php5/apache2/php.ini

이 한 줄을 추가하십시오 :

sendmail_path = /usr/bin/msmtp -t

전체 문서는 여기에서 찾을 수 있습니다.

https://marlam.de/msmtp/


ssmtp도 해결책입니다 (프랑스어 안내서) : elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
ıɾuǝʞ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.