2011-07-04 15 views
7

Tôi có email của tôi được lưu trữ tại Rackspace Email và muốn sử dụng email đó làm máy chủ thư của tôi cho biểu mẫu liên hệ trên trang web của tôi.Làm cách nào để chỉ định cho PHP rằng thư() phải được gửi bằng máy chủ thư bên ngoài?

Nhìn vào tệp php.ini, tôi chỉ có thể chỉ định sendmail_path trên hệ thống UNIX, từ đó tôi đã đọc điểm đến chương trình thực sự gửi thư trên máy chủ.

Tôi không muốn gửi thư từ máy chủ Ubuntu vì tôi không đủ kinh nghiệm để thiết lập bảo mật cho email ... Tôi muốn chuyển tiếp mọi thứ tới số mail.emailsrvr.com của Rackspace.

Câu hỏi của tôi là, làm cách nào để chỉ định thiết lập PHP trên máy chủ của tôi rằng chức năng mail() sẽ sử dụng máy chủ thư bên ngoài?

+3

Đạo cụ không cố gửi thư trực tiếp từ máy chủ web của bạn. Trong khi bạn có thể cấu hình lại sendmail.cf của mình để sử dụng một máy chủ mail bên ngoài, nó sẽ dễ dàng hơn khi sử dụng một gói PHP như được đề cập trong các câu trả lời. Tôi sử dụng Swiftmailer với một SMTP bên thứ 3 (SendGrid, một dịch vụ dựa trên đám mây của Rackspace) cho đến nay dường như hoạt động khá tốt. – ldg

+0

Got Swiftmailer được thiết lập với Rackspace Email, sẽ chuyển sang SendGrid thông qua Rackspace sau khi tăng dung lượng email. Cảm ơn! – Matt

Trả lời

11

mail() được thiết kế để bàn giao cho máy chủ SMTP cục bộ và thực hiện công việc kém. Để được hỗ trợ thư thích hợp, hãy sử dụng Swiftmailer hoặc PHPMailer, cả hai đều hỗ trợ đầy đủ các máy chủ SMTP bên ngoài và dễ sử dụng hơn (cho phép bạn thực hiện những việc như thư hỗn hợp/html, tệp đính kèm, v.v.)

+0

Swiftmailer cực kỳ dễ cài đặt, hoạt động ngay lập tức với các cài đặt SMTP thích hợp. – Matt

1

Thiết lập chức năng nội bộ mail để sử dụng SMTP chỉ khả dụng trên Windows. Trên các nền tảng khác, PHP nên sử dụng địa chỉ gửi thư hoặc sendmail có sẵn tại địa phương tốt.

Nếu bạn muốn sử dụng SMTP dưới máy chủ không phải Windows, bạn sẽ phải sử dụng thư viện của bên thứ ba chẳng hạn như số Switfmailer yêu thích của tôi.

Với Swiftmailer gửi một email trông như thế này:

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

Các PHP chức năng mặc định 'mail()' sẽ chỉ nhận được các chức năng cơ bản để gửi email. Đối với Rackspace, có thể bạn sẽ cần phải thiết lập kết nối SMTP đến máy chủ thư của họ. Để làm được điều này, tốt nhất bạn nên có một lớp thư phát triển hơn và phát triển hơn. Một số khung mã có sẵn. Nếu bạn đang tìm kiếm một gói tốt, hãy kiểm tra PHP Mailer. Nó gần như là một tiêu chuẩn những ngày này.

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

Không liên quan đến câu hỏi, nhưng có daemon bưu phẩm mà chỉ đóng vai trò như một daemon sendmail, nhưng rơle đến một thư bên ngoài.

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

Nếu bạn thậm chí không cần một exim/sendmail cài đặt trên máy tính của bạn, tôi khuyên bạn nên cố gắng đó. Tất nhiên, bạn vẫn có thể sử dụng các lựa chọn thay thế của bên thứ ba khác, tuy nhiên nếu bạn chạy một daemon cục bộ, nó cũng có thể xếp hàng thư, mà một thư viện php không thể, nếu smtp chuyển tiếp không có sẵn.

Nó là một phần của repo bình thường cho Debian vì vậy tôi đoán điều đó cũng đúng với ubuntu, chỉ cần apt-get install nullmailer là đủ. Sau đó, bạn có thể cấu hình nó với 1 hoặc nhiều rơle smtp mà nó được phép sử dụng.

Xem thêm ở đây: http://packages.ubuntu.com/oneiric/nullmailer

Là một lưu ý phụ, một hệ thống Linux mà không có một hệ thống bưu phẩm bị tê liệt trong nhiều cách khác, vì vậy tôi nghĩ rằng đó là một ý tưởng tốt trong hai cách.

9

Vì tôi đã nghiên cứu vấn đề này và tình cờ gặp bài đăng này và thư viện php của bên thứ ba không phải là một lựa chọn cho tôi.

Như chúng ta đã biết, php sử dụng lệnh sendmail của máy chủ theo mặc định Các sendmail_path tùy chọn trong php.ini có thể được thay đổi để ghi đè lên các thiết lập để chỉ huy của riêng bạn với lý lẽ riêng của nó, vv Ví dụ: sendmail_path = /usr/bin/unix2dos | /usr/bin/dos2unix | /usr/sbin/sendmail -t -i

SSMTP sẽ cho phép bạn chuyển tiếp các email gửi đến một mailhost từ máy chủ web/php của bạn. https://wiki.archlinux.org/index.php/SSMTP

apt-get install ssmtp 

Sau đó, bạn có thể sử dụng sendmail_path = /usr/sbin/ssmtp -t nói với php sử dụng ssmtp thay vì sendmail. Hãy chắc chắn để khởi động lại máy chủ web của bạn sau khi bạn đã thực hiện những thay đổi để php.ini

Cũng đảm bảo bạn đã cấu hình ssmtp và xác nhận SPF, DKIM, hồ sơ DMARC trước khi bạn thực hiện những thay đổi để sendmail_path trong php.ini

Ví dụ: gmail Mail server. /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 

Đối với một câu hỏi trao đổi chồng với cùng thấy https://unix.stackexchange.com/questions/36982/can-i-set-up-system-mail-to-use-an-external-smtp-server

Để mở rộng về vấn đề này.

Nếu sử dụng Google, mỗi địa chỉ email From: phải được thiết lập trên tài khoản gửi dưới dạng cài đặt "Tài khoản bạn sở hữu" trong tài khoản. Nếu không, google sẽ ghi lại tiêu đề bằng x-google-original-from và chỉ định từ làm tài khoản gửi thay thế.

2

Đối với những người không muốn sử dụng thư viện PHP như Swiftmailer (và cuối cùng những người không muốn chạm vào codebase PHP của mình chỉ để chuyển đổi máy chủ SMTP), bạn có thể thực hiện một trong các thao tác sau:

1.) Máy chủ Windows: Sửa đổi tệp INI PHP của bạn để sử dụng máy chủ chuyển tiếp SMTP bên ngoài. Bạn sẽ thấy nó trong phần gửi thư có nhãn "Chỉ dành cho máy chủ Windows" - hoặc một cái gì đó tương tự.

2.) Máy chủ Linux: Cài đặt Postfix (dịch vụ chuyển tiếp email) và định cấu hình để sử dụng máy chủ SMTP bên ngoài. Cài đặt PHP của bạn sẽ cố gắng sử dụng điều này để gửi e-mail theo mặc định mà không cần bất kỳ cấu hình bổ sung nào.

** Đây rõ ràng là không có ý định để cung cấp cho bạn từng chi tiết bước vào một trong hai tùy chọn trên, nhưng thay vì để chỉ cho bạn đi đúng hướng nếu bạn đang tìm kiếm một giải pháp mà không cần thay đổi các trường hợp trong mã của bạn nơi mail của PHP() được gọi.