Wysyłanie wiadomości e-mail z PHP z serwera SMTP

138
$from = "[email protected]";
$headers = "From:" . $from;
echo mail ("[email protected]" ,"testmailfunction" , "Oj",$headers);

Mam problem z wysyłaniem e-maili w PHP. I pojawia się błąd: SMTP server response: 530 SMTP authentication is required.

Miałem wrażenie, że w celu weryfikacji można wysyłać emaile bez SMTP. Wiem, że prawdopodobnie ta poczta zostanie odfiltrowana, ale teraz to nie ma znaczenia.

[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 = [email protected]

To jest konfiguracja w php.inipliku. Jak skonfigurować SMTP? Czy istnieją serwery SMTP, które nie wymagają weryfikacji lub czy muszę samodzielnie skonfigurować serwer?

Borut Flis
źródło

Odpowiedzi:

172

Kiedy wysyłasz wiadomość e-mail przez serwer, który wymaga autoryzacji SMTP, naprawdę musisz to określić i ustawić hosta, nazwę użytkownika i hasło (a może port, jeśli nie jest domyślny - 25).

Na przykład zazwyczaj używam PHPMailera z ustawieniami podobnymi do tych:

$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();

Więcej o PHPMailer można znaleźć tutaj: https://github.com/PHPMailer/PHPMailer

Ivo Pereira
źródło
22
+1 dla phpMailera - to rozsądna alternatywa dla wbudowanej mail()funkcji PHP .
SDC
8
Dla tych, którzy natknęli się na tę odpowiedź, warto zauważyć, że PHPMailer jest również wbudowany w WordPress i można go skonfigurować za pomocą 'phpmailer_init'haka akcji. To wygodny sposób na skonfigurowanie WordPressa dla poczty SMTP lub Amazon SES (który obsługuje połączenia SMTP).
Matt van Andel
1
Czy można używać PHP Mailera w płatnych skryptach?
Luka,
2
@Luka Tak, jest. Zgodnie z ich plikiem licencyjnym PHPMailer korzysta z licencji LGPL 2.1, która umożliwia komercyjne wykorzystanie.
Alejandro
Czy muszę zrobić coś specjalnego, aby użyć tego kodu? Gdzie to umieścić? Czy mogę zadzwonić za pomocą formularza HTML5 z żądaniem POST? Jak wysłać wiadomość e-mail po utworzeniu tego obiektu PHPMailer?
Aaron Franke,
55
<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "[email protected]");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = [email protected]";

$headers = "From: [email protected]";

mail("[email protected]", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

lub, aby uzyskać więcej informacji, czytaj dalej .

Dipesh Parmar
źródło
Adres IP, którego używasz do wysyłania poczty, nie jest upoważniony do wysyłania e-maili bezpośrednio na nasze serwery 550-5.7.1. Otrzymuję ten błąd. wszystko, czego chcę, to otwarty przekaźnik poczty.
Borut Flis
Nie mam statycznego adresu IP. Czy znasz jakiś otwarty przekaźnik poczty.
Borut Flis
1
Ponadto zobacz support.google.com/a/answer/176600?hl=en, aby uzyskać informacje o przekaźnikach SMTP Google.
Will B.
6
To najlepsza odpowiedź na php mail()problemy z funkcją GoDaddy - 2017 - nie powinno być konieczne pobieranie PHPMailera ani innych zasobów strony trzeciej - dzięki
soulshined
4
Link „CZYTAJ DALEJ” jest uszkodzony
vladkras,
46

Dla użytkowników Uniksa, mail () w rzeczywistości używa polecenia Sendmail do wysyłania wiadomości e-mail. Zamiast modyfikować aplikację, możesz zmienić środowisko. msmtp to klient SMTP ze składnią CLI kompatybilną z Sendmail, co oznacza, że ​​może być używany zamiast Sendmaila. Wymaga tylko niewielkiej zmiany w pliku php.ini.

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

Wtedy nawet skromna funkcja mail () może działać z dobrocią SMTP. Jest to bardzo przydatne, jeśli próbujesz połączyć istniejącą aplikację z usługami pocztowymi, takimi jak sendgrid lub mandrill bez modyfikowania aplikacji.

txyoji
źródło
1
Świetne rozwiązanie, używaj go teraz na wielu serwerach!
raice
3
Wdrożenie tego w moich kontenerach Docker dla aplikacji, które nie używają biblioteki pocztowej.
Batandwa
Doskonała ścieżka migracji z wersji waniliowej mail()do czegoś, co obsługuje SMTP. Dziękuję Ci!
rinogo
MSMTP jest również dostępny dla systemu Windows. Oczywiste pliki do pobrania mają wersję 1.4. Wersja, którą gdzieś znalazłem to 1.6.2. Nie wiem, czy istnieje wersja 1.8.6 dla systemu Windows.
Bilbo
Autor przestał udostępniać pliki binarne systemu Windows przed lutym 2016 r.
Bilbo
18

Oto sposób na zrobienie tego z PHP PEAR

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

$from = '<[email protected]>'; //change this to your email address
$to = '<[email protected]>'; // 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' => '[email protected]', //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>';
}

Jeśli korzystasz z Gmaila SMTP, pamiętaj, aby włączyć SMTP na swoim koncie Gmail w ustawieniach

EDYCJA: Jeśli nie możesz znaleźć Mail.php na debianie / ubuntu, możesz zainstalować php-pear za pomocą

sudo apt install php-pear

Następnie zainstaluj rozszerzenie poczty:

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

Wtedy powinieneś móc go załadować, po prostu require_once "Mail.php" inaczej znajduje się tutaj:/usr/share/php/Mail.php

Bolli
źródło
1
require_once ('/usr/share/somewhere/Mail.php');
17

Problem w tym, że mail()funkcja PHP ma bardzo ograniczoną funkcjonalność. Istnieje kilka sposobów wysyłania poczty z PHP.

  1. mail()używa serwera SMTP w twoim systemie. Istnieją co najmniej dwa serwery można używać w systemie Windows: hMailServer i xmail . Spędziłem kilka godzin na ich konfigurowaniu i ustawianiu. Pierwsza jest moim zdaniem prostsza. W tej chwili hMailServer działa na Windows 7 x64.
  2. mail()używa serwera SMTP na maszynie zdalnej lub wirtualnej z systemem Linux. Oczywiście prawdziwa usługa pocztowa, taka jak Gmail, nie pozwala na bezpośrednie połączenie bez żadnych danych uwierzytelniających ani kluczy. Możesz skonfigurować maszynę wirtualną lub użyć maszyny znajdującej się w Twojej sieci LAN. Większość dystrybucji Linuksa ma serwer pocztowy po wyjęciu z pudełka. Skonfiguruj to i baw się dobrze. Używam domyślnego exim4 na Debianie 7, który nasłuchuje interfejsu LAN.
  3. Biblioteki pocztowe używają połączeń bezpośrednich. Biblioteki są łatwiejsze do skonfigurowania. Użyłem SwiftMailer i doskonale wysyła pocztę z konta Gmail. Myślę, że PHPMailer też jest całkiem niezły.

Bez względu na to, jaki wybór wybierzesz, polecam użycie warstwy abstrakcji. Możesz używać biblioteki PHP na swojej maszynie deweloperskiej z systemem Windows i po prostu mail()działać na maszynie produkcyjnej z systemem Linux. Warstwa abstrakcji umożliwia wymianę sterowników poczty w zależności od systemu, w którym działa aplikacja. Utwórz MyMailerklasę abstrakcyjną lub interfejs z send()metodą abstrakcyjną . Dziedzicz dwie klasy MyPhpMaileri MySwiftMailer. Implementuj send()metodę w odpowiedni sposób.

George Sovetov
źródło
10

Istnieją serwery SMTP, które działają bez uwierzytelniania, ale jeśli serwer wymaga uwierzytelnienia, nie można tego obejść.

Wbudowane funkcje pocztowe PHP są bardzo ograniczone - określenie serwera SMTP jest możliwe tylko w systemie Windows. Na * nix mail()użyje plików binarnych systemu operacyjnego.

Jeśli chcesz wysłać wiadomość e-mail na dowolny serwer SMTP w sieci, rozważ użycie biblioteki takiej jak SwiftMailer . Umożliwi to na przykład korzystanie z serwerów wychodzących Google Mail.

Pekka
źródło
2

W przypadkach, gdy hostujesz witrynę Wordpress w systemie Linux i masz dostęp do serwera, możesz zaoszczędzić sobie bólu głowy, instalując msmtp, który umożliwia wysyłanie przez smtp ze standardowej funkcji php mail (). msmtp to prostsza alternatywa dla Postfix, która wymaga nieco więcej konfiguracji.

Oto kroki:

Zainstaluj msmtp

sudo apt-get install msmtp-mta ca-certificates

Utwórz nowy plik konfiguracyjny:

sudo nano /etc/msmtprc

... z następującymi informacjami o konfiguracji:

# 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 <[email protected]>
password <password>
from <[email protected]>
syslog LOG_MAIL

Musisz zastąpić dane konfiguracyjne reprezentowane przez wszystko w „<” i „>” (włącznie, usuń je). W przypadku hosta / nazwy użytkownika / hasła użyj zwykłych poświadczeń do wysyłania poczty za pośrednictwem dostawcy poczty.

Powiedz PHP, aby go użył

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

Dodaj tę pojedynczą linię:

sendmail_path = /usr/bin/msmtp -t

Pełną dokumentację można znaleźć tutaj:

https://marlam.de/msmtp/

Peter Drinnan
źródło
ssmtp jest również rozwiązaniem patrz (francuski przewodnik): elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
ıɾuǝʞ
0

W innym podejściu możesz wziąć taki plik:

From: Sunday <[email protected]>
To: Monday <[email protected]>
Subject: Day

Tuesday Wednesday

i wyślij w ten sposób:

<?php
$a1 = ['[email protected]'];
$r1 = fopen('a.txt', 'r');
$r2 = curl_init('smtps://smtp.gmail.com');
curl_setopt($r2, CURLOPT_MAIL_RCPT, $a1);
curl_setopt($r2, CURLOPT_NETRC, true);
curl_setopt($r2, CURLOPT_READDATA, $r1);
curl_setopt($r2, CURLOPT_UPLOAD, true);
curl_exec($r2);

https://php.net/function.curl-setopt

Steven Penny
źródło
Witaj, czy testowałeś w systemie Linux?
user2342558