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


138
$from = "someonelse@example.com";
$headers = "From:" . $from;
echo mail ("borutflis1@gmail.com" ,"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 = someonelse@example.com

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

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


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", "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/>";
?>

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


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.


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 = '<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>';
}

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


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.


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.


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 <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
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/


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 <sunday@gmail.com>
To: Monday <monday@gmail.com>
Subject: Day

Tuesday Wednesday

i wyślij w ten sposób:

<?php
$a1 = ['monday@gmail.com'];
$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


Witaj, czy testowałeś w systemie Linux?
user2342558
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.