2010-10-04 64 views
12

Tôi đang cố gắng để gửi một email với CodeIgniter như thế này:không thể CodeIgniter để gửi email bằng PHP mail()

$this->load->library('email'); 

$this->email->from("[email protected]"); 
$this->email->reply_to("[email protected]"); 
$this->email->to("[email protected]"); 
$this->email->subject("Test mail"); 
$this->email->message("Email body"); 
$this->email->set_alt_message("Email body txt"); 
$this->email->send(); 

và tôi đã nhận này trên debugger email: Không thể gửi email bằng PHP thư(). Máy chủ của bạn có thể không được định cấu hình để gửi thư bằng phương pháp này.

Nếu tôi thực hiện chức năng e mail PHP đơn giản() với cùng địa chỉ, nó hoạt động nhưng khi tôi sử dụng CodeIgniter nó sẽ cho tôi lỗi. Vậy tại sao nó làm việc với thư đơn giản() nhưng không phải với CodeIgniter? Bất kỳ ý tưởng?

Cảm ơn.

+0

bạn đang sử dụng giao thức nào? –

+0

var $ protocol = "mail"; –

+0

Tham chiếu trong biểu mẫu [PHP mail() không hoàn thành việc gửi e-mail] (https://stackoverflow.com/questions/43766055/php-mail-form-doesnt-complete-sending-e-mail) thường áp dụng với trình bao bọc CodeIgniter. – mario

Trả lời

7

Bạn có tệp email.php trong thư mục cấu hình của mình không? Có thể có sự cố với cấu hình của bạn trong đó.

+0

Có, tôi có cấu hình email.php, mặc định và chỉ giữ các cấu hình này: $ config ['mailtype'] = 'html'; $ config ['charset'] = 'utf-8'; $ config ['newline'] = '\ r \ n'; –

+0

Có thể bạn nên thử $ config ['mailtype'] = 'text'; Html mailtype đã gây ra một số vấn đề cho tôi. Hoặc thử xóa toàn bộ tệp cấu hình để sử dụng cài đặt mặc định. – mseo

+0

Tôi sẽ thử điều đó, cảm ơn. Nhưng tôi không nên có vấn đề này, tôi muốn có thể gửi tin nhắn HTML nếu cần thiết. Và tôi có thể làm điều đó với mail(), và nó là xấu mà tôi không thể làm điều đó với khuôn khổ lớn như vậy. Tôi vẫn tự hỏi liệu tôi có làm điều gì sai không. –

3

Thêm biến giao thức vào mảng cấu hình và gán giá trị "sendmail". Tệp email.php trong thư mục cấu hình nên đọc như hình dưới đây. Mỏ hoạt động như thế này:

$config['protocol'] = 'sendmail'; 
$config['mailtype'] = 'html'; 
$config['charset'] = 'utf-8'; 
$config['newline'] = "\r\n"; 
14

Có vấn đề tương tự.

Đó là làm việc mã từ bộ điều khiển:

 $config = array(); 
     $config['useragent']   = "CodeIgniter"; 
     $config['mailpath']   = "/usr/bin/sendmail"; // or "/usr/sbin/sendmail" 
     $config['protocol']   = "smtp"; 
     $config['smtp_host']   = "localhost"; 
     $config['smtp_port']   = "25"; 
     $config['mailtype'] = 'html'; 
     $config['charset'] = 'utf-8'; 
     $config['newline'] = "\r\n"; 
     $config['wordwrap'] = TRUE; 

     $this->load->library('email'); 

     $this->email->initialize($config); 

     $this->email->from($fromEmail, $fromName); 
     $this->email->to($email); 

     $this->email->subject('Тест Email'); 
     $this->email->message($this->load->view('email/'.$type.'-html', $data, TRUE)); 

     $this->email->send(); 
+0

Vị trí của 'sendmail' đã giải quyết được vấn đề của tôi, tôi đã sử dụng' bin' mặc định khi nó thực sự ở 'sbin' –

7

Không ai dường như thực sự tìm thấy một câu trả lời dứt khoát, vì vậy tôi đã làm một số đào bới xung quanh và phát hiện ra lý do tại sao.

trong hệ thống/thư viện/Email.php, cái nhìn đầu tiên tại dòng 1552:

if (! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, "-f ".$this->clean_email($this->_headers['From']))) 

có vẻ như để gửi tất cả mọi thứ tất cả peachy như thế nào. Tôi cũng có các triệu chứng giống hệt nhau. Để xem tôi có phát điên hay không, tôi đã chèn ngay trước khi ...

mail($this->_recipients, $this->_subject, $this->_finalbody) 

vì vậy, về cơ bản, tôi đã xóa tất cả các tiêu đề và để PHP đặt mặc định. Chơi lô tô! Nếu không có tiêu đề của CI, nó hoạt động. Với các tiêu đề CI, nó không. Vậy đo la cai gi?

Đào xung quanh một số chi tiết khác, tôi đã tìm đến nơi html được khởi tạo và sử dụng. Hóa ra nó không thực sự làm bất cứ điều gì cho đến khoảng 1046, nơi nó xây dựng cơ thể thông điệp.

từ dòng 1048:

if ($this->send_multipart === FALSE) 
{ 
    $hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline; 
    $hdr .= "Content-Transfer-Encoding: quoted-printable"; 
} 
else 
{ 
    $hdr .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline . $this->newline; 

    $body .= $this->_get_mime_message() . $this->newline . $this->newline; 
    $body .= "--" . $this->_alt_boundary . $this->newline; 

    $body .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline; 
    $body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline; 
    $body .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline; 

    $body .= "Content-Type: text/html; charset=" . $this->charset . $this->newline; 
    $body .= "Content-Transfer-Encoding: quoted-printable" . $this->newline . $this->newline; 
} 

Flipping send_multipart giữa TRUE và FALSE sẽ làm cho công việc lớp đường bưu điện hoặc không hoạt động.

Nhìn qua Code Ignitor's email class docs không hiển thị gì cả. Đi tới dòng 52:

var $send_multipart = TRUE; // TRUE/FALSE - Yahoo does not like multipart alternative, so this is an override. Set to FALSE for Yahoo. 

Vì vậy, bạn có nó. Có thể là lỗi trong cách CI thực hiện nhiều thông điệp? Tùy chọn cấu hình ẩn

$config['send_multipart'] = FALSE; 

trong email.php có vẻ như là lừa.

+1

Điểm tốt, và nhận xét này từ tập lệnh email codeigniter" Đây là thông báo đa phần trong định dạng MIME. Ứng dụng email của bạn có thể không hỗ trợ định dạng này. " –

+0

Tôi thấy rằng thư ($ this -> _ recipient, $ this -> _ subject, $ this -> _ finalbody) kết hợp với $ config ['send_multipart'] = FALSE; $ config ['mailpath'] = "/ usr/sbin/sendmail"; Giải quyết vấn đề của tôi. –

4

Hãy chắc chắn tên miền trong

$this->email->from("[email protected]**email.com**"); 

trận đấu đến máy chủ tên miền

+0

Đây là giải pháp thực sự. Tôi cũng sắp đăng nó. –

0

Đã cùng một vấn đề, Hãy chắc chắn rằng bạn 'từ' địa chỉ là một địa chỉ email hợp lệ.

8

Rõ ràng, dường như không có câu trả lời 'một kích thước phù hợp nhất định'. Có gì làm việc đối với tôi là thay đổi

$config['protocol'] = 'smtp'; 

TO:

$config['protocol'] = 'mail'; 

Hope this helps ...

+0

Huh, hài hước. Điều gì làm việc cho tôi hoàn toàn ngược lại, tức là, thay đổi giao thức _from_ 'mail' _to_ 'smtp' (và thêm 'smtp_host' và 'smtp_port' như được hiển thị trong câu trả lời của @ Fedir). Như đã nói, một kích thước không phù hợp với tất cả - chủ yếu là vì mỗi cái đang làm điều này trong một môi trường máy chủ khác nhau. Đạo đức của câu chuyện: xem _all_ của các câu trả lời này và thử các biến thể. (Các đầu mối cho tôi đã lưu ý rằng tài liệu về hàm PHP mail() '- hoạt động cho tôi - đề cập đến việc nó sử dụng SMTP.) – Hephaestus

+0

điều này đã làm việc rất tốt cho tôi! – Limon

0

tôi đọc một bình luận trong file email.php:

// most documentation of sendmail using the "-f" flag lacks a space after it, however 
     // we've encountered servers that seem to require it to be in place. 
     return mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, '-f '.$this->clean_email($this->_headers['Return-Path'])); 

"-f" cờ - vấn đề này !!!

0

tôi đã cùng một vấn đề và mặc dù nó có vẻ ngớ ngẩn với tôi bây giờ, tôi đã có một số các cấu hình tùy chọn mảng vốn khi tất cả họ đều cần phải được chữ thường:

là:

$mail_config['smtp_host'] = 'mail.example.com'; 
$mail_config['smtp_port'] = '587'; 
$mail_config['smtp_user'] = '[email protected]'; 
$mail_config['smtp_pass'] = 'password'; 
$mail_config['smtp_crypto'] = 'TLS'; //ERROR 
$mail_config['protocol'] = 'SMTP'; //ERROR 
$mail_config['mailtype'] = 'HTML'; //ERROR 
$mail_config['send_multipart'] = FALSE; 
$this->email->initialize($mail_config); 

Cố định:

$mail_config['smtp_host'] = 'mail.example.com'; 
$mail_config['smtp_port'] = '587'; 
$mail_config['smtp_user'] = '[email protected]'; 
$mail_config['smtp_pass'] = 'password'; 
$mail_config['smtp_crypto'] = 'tls'; //FIXED 
$mail_config['protocol'] = 'smtp'; //FIXED 
$mail_config['mailtype'] = 'html'; //FIXED 
$mail_config['send_multipart'] = FALSE; 
$this->email->initialize($mail_config); 

Đó làm việc cho tôi

0
$config = Array(
     'protocol' => 'smtp', 
     'smtp_host' => 'ssl://smtp.googlemail.com', 
     'smtp_port' => 465, 
     'smtp_user' => 'email', 
     'smtp_pass' => 'pass', 
     'mailtype' => 'html', 
     'charset' => 'iso-8859-1' 
    ); 

    $this->load->library('email',$config); 
**$this->email->set_newline("\r\n");** <- add this line 
    this code worked for me. 
0

Giá trị của nó nói rằng nếu bạn đang sử dụng WAMP (Windows), bạn sẽ cần phải cài đặt sendmail nếu không không có phương thức gửi SMTP mặc định. Tôi muốn sử dụng Gmail nhưng không thể vì không có cơ chế gửi thư mặc định.

Các vấn đề liên quan