2011-07-04 13 views
7

Mam mój e-mail hostowany na Rackspace Email i chciałbym użyć tego jako mojego serwera pocztowego dla formularza kontaktowego na mojej stronie.Jak określić w PHP, że poczta() powinna być wysyłana za pomocą zewnętrznego serwera pocztowego?

Patrząc na plik php.ini, jestem w stanie określić tylko sendmail_path w systemach UNIX, z których czytałem punkty programu, który faktycznie wysyła pocztę na serwer.

Nie chcę wysyłać poczty z mojego serwera Ubuntu, ponieważ nie jestem wystarczająco doświadczony, aby utworzyć bezpieczną konfigurację dla poczty e-mail ... Chciałbym przekazać wszystko do Rackspace na mail.emailsrvr.com.

Moje pytanie brzmi, w jaki sposób mogę określić w PHP na moim serwerze, że funkcja mail() powinna używać zewnętrznego serwera pocztowego?

+3

Rekwizyty dla osób, które nie próbują bezpośrednio wysyłać poczty z Twojego serwera WWW. Chociaż możesz przekonfigurować swój sendmail.cf do korzystania z zewnętrznego serwera pocztowego, łatwiej będzie użyć pakietu PHP, o którym mowa w odpowiedziach. Używam Swiftmailer z zewnętrznym SMTP (SendGrid, usługa chmurowa Rackspace), która jak dotąd wydaje się działać całkiem dobrze. – ldg

+0

Po skonfigurowaniu Swiftmailera za pomocą Rackspace Email, przełączanie do SendGrid przez Rackspace nastąpi później, gdy zwiększy się liczba wiadomości e-mail. Dzięki! – Matt

Odpowiedz

11

mail() jest przeznaczony do przekazywania na lokalny serwer SMTP i wykonuje złą pracę. Aby zapewnić poprawną obsługę poczty, należy użyć Swiftmailer lub PHPMailer, które w pełni obsługują zewnętrzne serwery SMTP i są znacznie łatwiejsze w użyciu (a ponadto umożliwiają takie czynności, jak mieszane wiadomości tekstowe/HTML, załączniki itp.)

+0

Swiftmailer był niezwykle łatwy w konfiguracji, działał od razu z właściwymi ustawieniami SMTP. – Matt

1

Konfigurowanie wewnętrzna funkcja mail do korzystania z protokołu SMTP jest dostępna tylko w systemie Windows. Na innych platformach PHP powinien używać lokalnie dostępnego wysyłania sendmaila lub sendmaila.

Jeśli chcesz używać SMTP pod serwerem innym niż Windows, musisz użyć biblioteki innej firmy, takiej jak moja ulubiona Switfmailer.

Z Swiftmailer wysyłając e-mail wygląda następująco:

require_once 'lib/swift_required.php'; 

//Create the Transport 
$transport = Swift_SmtpTransport::newInstance('smtp.example.org', 25) 
    ->setUsername('your username') 
    ->setPassword('your password') 
    ; 

//Create the Mailer using your created Transport 
$mailer = Swift_Mailer::newInstance($transport); 

//Create a message 
$message = Swift_Message::newInstance('Wonderful Subject') 
    ->setFrom(array('[email protected]' => 'John Doe')) 
    ->setTo(array('[email protected]', '[email protected]' => 'A name')) 
    ->setBody('Here is the message itself') 
    ; 

//Send the message 
$result = $mailer->send($message); 
1

domyślnej funkcji PHP mail() „” dostanie tylko podstawową funkcjonalność, aby wysłać e-mail. W przypadku Rackspace prawdopodobnie będziesz musiał skonfigurować połączenie SMTP z ich serwerem pocztowym. W tym celu najlepiej jest uzyskać bardziej zaawansowaną i rozwiniętą klasę mailingową. Dostępnych jest kilka frameworków kodu. Jeśli szukasz dobrego pakietu, sprawdź PHP Mailer. To prawie standard w dzisiejszych czasach.

http://phpmailer.worxware.com/

require_once('../class.phpmailer.php'); 
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded 

$mail    = new PHPMailer(); 

$body    = file_get_contents('contents.html'); 
$body    = eregi_replace("[\]",'',$body); 

$mail->IsSMTP(); // telling the class to use SMTP 
$mail->Host  = "mail.yourdomain.com"; // SMTP server 
$mail->SMTPDebug = 2;      // enables SMTP debug information (for testing) 
             // 1 = errors and messages 
             // 2 = messages only 
$mail->SMTPAuth = true;     // enable SMTP authentication 
$mail->Host  = "mail.yourdomain.com"; // sets the SMTP server 
$mail->Port  = 26;     // set the SMTP port for the GMAIL server 
$mail->Username = "[email protected]"; // SMTP account username 
$mail->Password = "yourpassword";  // SMTP account password 

$mail->SetFrom('[email protected]', 'First Last'); 

$mail->AddReplyTo("[email protected]","First Last"); 

$mail->Subject = "PHPMailer Test Subject via smtp, basic with authentication"; 

$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test 

$mail->MsgHTML($body); 

$address = "[email protected]"; 
$mail->AddAddress($address, "John Doe"); 

$mail->AddAttachment("images/phpmailer.gif");  // attachment 
$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment 

if(!$mail->Send()) { 
    echo "Mailer Error: " . $mail->ErrorInfo; 
} else { 
    echo "Message sent!"; 
} 
2

niezwiązane z pytaniem, ale istnieją demony Mailer, że tylko działa jako demona sendmail, ale przekaźniki do zewnętrznego elektroniczną.

http://freshmeat.net/projects/nullmailer/

Jeśli nawet nie potrzebować exim/sendmail zainstalować na komputerze, proponuję spróbować. Oczywiście nadal możesz korzystać z alternatywnych rozwiązań innych firm, jednak jeśli uruchomisz demona lokalnie, będzie on w stanie również w kolejce do poczty, której php lib nie będzie w stanie, jeśli przekazywanie smtp nie będzie dostępne.

Jest to część zwykłego repo dla Debiana, więc domyślam się, że jest to prawdą również dla ubuntu, wystarczy tylko apt-get install nullmailer. Następnie możesz skonfigurować go za pomocą 1 lub więcej przekaźników smtp, których może używać.

Zobacz więcej tutaj: http://packages.ubuntu.com/oneiric/nullmailer

Na marginesie, system linux bez systemu mailera zostaje sparaliżowana na wiele innych sposobów, więc myślę, że to dobry pomysł, albo jak.

9

Od kiedy badałem ten problem i natknąłem się na ten post, a php innej firmy nie był dla mnie opcją.

Jak wiemy, PHP używa komendy sendmail serwera domyślnie Opcja w php.inisendmail_path może zostać zmieniony, aby zastąpić ustawienia do własnego polecenia z jego własnych argumentów itp na przykład: sendmail_path = /usr/bin/unix2dos | /usr/bin/dos2unix | /usr/sbin/sendmail -t -i

SSMTP pozwoli ci skierować wychodzące wiadomości e-mail do serwera poczty z twojego serwera www/php. https://wiki.archlinux.org/index.php/SSMTP

apt-get install ssmtp 

Następnie można użyć sendmail_path = /usr/sbin/ssmtp -t powiedzieć php używać ssmtp zamiast sendmail. Pamiętaj, aby ponownie uruchomić serwer WWW po dokonaniu zmiany w php.ini

także zapewnić skonfigurowaniu ssmtp i zatwierdzone swój SPF, DKIM rekordy DMARC przed dokonaniem zmian w sendmail_path w php.ini

Na przykład serwer poczty Gmail. /etc/ssmtp/ssmtp.conf

# The user that gets all the mails (UID < 1000, usually the admin) 
[email protected] 

# The mail server (where the mail is sent to), both port 465 or 587 should be acceptable 
# See also http://mail.google.com/support/bin/answer.py?answer=78799 
mailhub=smtp.gmail.com:587 

# The address where the mail appears to come from for user authentication. 
rewriteDomain=yourdomain.com 

# The full hostname 
hostname=FQDN.yourdomain.com 

# Use SSL/TLS before starting negotiation 
UseTLS=Yes 
UseSTARTTLS=Yes 

# Username/Password 
[email protected] 
AuthPass=postmaster-password 

# Email 'From header's can override the default domain? 
FromLineOverride=yes 

na pytanie wymiany stosu samo zobaczyć https://unix.stackexchange.com/questions/36982/can-i-set-up-system-mail-to-use-an-external-smtp-server

Aby rozwinąć na ten temat.

W przypadku korzystania z Google każdy adres e-mailowy From: musi zostać skonfigurowany na koncie wysyłającym jako ustawienie "Konto własne" na kontach. W przeciwnym razie google przerobi nagłówki na x-google-original-from i zamiast tego wskaże Od jako konto wysyłające.

2

Dla tych, którzy nie chcą korzystać z biblioteki PHP, takiej jak Swiftmailer (i ostatecznie ci, którzy nie chcą dotykać ich kodu PHP, aby zmienić serwery SMTP), można wykonać jedną z następujących czynności:

1.) Serwery Windows: Zmodyfikuj plik PHP INI tak, aby korzystał z zewnętrznego hosta przekaźnika SMTP. Zobaczysz go w sekcji mailer oznaczonej "Tylko dla serwerów Windows" - lub coś podobnego.

2.) Serwery Linux: Zainstaluj Postfix (usługa przekazywania poczty e-mail) i skonfiguruj, aby używać zewnętrznego hosta SMTP. Twoja instalacja PHP spróbuje użyć tego do wysyłania wiadomości e-mail domyślnie bez dodatkowej konfiguracji.

** Oczywiście nie ma to na celu udzielenia szczegółowych informacji na temat powyższych opcji, ale raczej wskazanie właściwego kierunku, jeśli szukasz rozwiązania, które nie wymaga zmiany instancji w kodzie gdzie wywoływana jest funkcja PHP().

Powiązane problemy