Hướng dẫn how can i get imap and php email? - làm cách nào để nhận email imap và php?

Các nhà phát triển đôi khi chạy vào các nhiệm vụ yêu cầu truy cập vào hộp thư email. Trong hầu hết các trường hợp, điều này được thực hiện bằng giao thức truy cập tin nhắn Internet hoặc IMAP. Là một nhà phát triển PHP, lần đầu tiên tôi chuyển sang Php, được xây dựng trong thư viện IMAP, nhưng thư viện này là lỗi và không thể gỡ lỗi hoặc sửa đổi. Cũng không thể tùy chỉnh các lệnh IMAP để sử dụng đầy đủ các khả năng của giao thức.

Vì vậy, hôm nay, chúng tôi sẽ tạo một ứng dụng email IMAP hoạt động từ đầu bằng cách sử dụng PHP. Chúng ta cũng sẽ xem cách sử dụng các lệnh đặc biệt của Gmail.

Chúng tôi sẽ triển khai IMAP trong một lớp tùy chỉnh,

line_number command arg1 arg2 ...
1. Tôi sẽ giải thích từng bước trong khi xây dựng lớp học. Bạn có thể tải xuống toàn bộ
line_number command arg1 arg2 ...
2 ở cuối bài viết.

Thiết lập một kết nối

IMAP là giao thức dựa trên kết nối và thường hoạt động qua TCP/IP với SSL Security, vì vậy trước khi chúng tôi có thể thực hiện bất kỳ cuộc gọi IMAP nào, chúng tôi phải mở kết nối.

Chúng ta cần biết URL và số cổng của máy chủ IMAP mà chúng ta muốn kết nối. Thông tin này thường được quảng cáo trong trang web hoặc tài liệu dịch vụ. Ví dụ, đối với Gmail, URL là

line_number command arg1 arg2 ...
3 trên cổng 993.

Vì chúng tôi muốn biết liệu khởi tạo có thành công hay không, chúng tôi sẽ để lại hàm xây dựng lớp và tất cả các kết nối sẽ được thực hiện theo phương thức

line_number command arg1 arg2 ...
4 tùy chỉnh, sẽ trả về
line_number command arg1 arg2 ...
5 nếu kết nối không thể được thiết lập:

class imap_driver
{
    private $fp;                      // file pointer
    public $error;                    // error message
    ...
    public function init[$host, $port]
    {
        if [![$this->fp = fsockopen[$host, $port, $errno, $errstr, 15]]] {
            $this->error = "Could not connect to host [$errno] $errstr";
            return false;
        }
        if [!stream_set_timeout[$this->fp, 15]] {
            $this->error = "Could not set timeout";
            return false;
        }
        $line = fgets[$this->fp];     // discard the first line of the stream
        return true;
    }
    
    private function close[]
    {
        fclose[$this->fp];
    }
    ...
}

Trong mã trên, tôi đã đặt thời gian chờ 15 giây, cả hai cho

line_number command arg1 arg2 ...
6 để thiết lập kết nối và chính luồng dữ liệu để trả lời các yêu cầu khi nó được mở. Điều quan trọng là phải có thời gian chờ cho mỗi cuộc gọi đến mạng bởi vì, thường là đủ, máy chủ đã giành được phản hồi và chúng ta phải có thể xử lý việc đóng băng như vậy.

Tôi cũng lấy dòng đầu tiên của luồng và bỏ qua nó. Thông thường đây chỉ là một thông điệp chào hỏi từ máy chủ hoặc xác nhận rằng nó được kết nối. Kiểm tra tài liệu dịch vụ thư cụ thể của bạn để đảm bảo đây là trường hợp.

Bây giờ chúng tôi muốn chạy mã trên để thấy rằng

line_number command arg1 arg2 ...
4 đã thành công:

include["imap_driver.php"];

// test for init[]
$imap_driver = new imap_driver[];
if [$imap_driver->init['ssl://imap.gmail.com', 993] === false] {
    echo "init[] failed: " . $imap_driver->error . "\n";
    exit;
}

Cú pháp IMAP cơ bản

Bây giờ chúng tôi có một ổ cắm hoạt động mở cho máy chủ IMAP của chúng tôi, chúng tôi có thể bắt đầu gửi các lệnh IMAP. Chúng ta hãy xem cú pháp IMAP.

Tài liệu chính thức có thể được tìm thấy trong Lực lượng đặc nhiệm kỹ thuật Internet [IETF] RFC3501. Các tương tác IMAP thường bao gồm các lệnh gửi máy khách và máy chủ phản hồi với một dấu hiệu thành công, cùng với bất kỳ dữ liệu nào có thể được yêu cầu.

Cú pháp cơ bản cho các lệnh là:

line_number command arg1 arg2 ...

Số dòng, hoặc Tag Tag, là một định danh duy nhất cho lệnh, mà máy chủ sử dụng để chỉ ra lệnh nào nó phản hồi nếu nó xử lý nhiều lệnh cùng một lúc.

Dưới đây là một ví dụ, hiển thị lệnh

line_number command arg1 arg2 ...
8:

00000001 LOGIN  password

Phản hồi của máy chủ có thể bắt đầu với phản hồi dữ liệu không được gắn thẻ. Chẳng hạn, Gmail trả lời đăng nhập thành công với phản hồi không được tính toán có chứa thông tin về khả năng và tùy chọn của máy chủ và một lệnh để lấy tin nhắn email sẽ nhận được phản hồi không được tính toán có chứa thân thông báo. Trong cả hai trường hợp, một phản hồi phải luôn luôn kết thúc bằng một dòng phản hồi hoàn thành lệnh được gắn thẻ của người dùng, xác định số dòng của lệnh mà phản hồi áp dụng, chỉ báo trạng thái hoàn thành và siêu dữ liệu bổ sung về lệnh, nếu có:

line_number status metadata1 metadata2 ...

Dưới đây là cách Gmail trả lời lệnh

line_number command arg1 arg2 ...
8:

  • Success:
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS 
COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS

00000001 OK  authenticated [Success]
  • Failure:
00000001 NO [AUTHENTICATIONFAILED] Invalid credentials [Failure]

Trạng thái có thể là

00000001 LOGIN  password
0, biểu thị thành công,
00000001 LOGIN  password
1, biểu thị sự thất bại hoặc
00000001 LOGIN  password
2, chỉ ra một lệnh không hợp lệ hoặc cú pháp xấu.

Thực hiện các lệnh cơ bản:

Hãy để một chức năng gửi lệnh đến máy chủ IMAP và truy xuất phản hồi và kết thúc:

class imap_driver
{
    private $command_counter = "00000001";
    public $last_response = array[];
    public $last_endline = "";

    private function command[$command]
    {
        $this->last_response = array[];
        $this->last_endline  = "";
        
        fwrite[$this->fp, "$this->command_counter $command\r\n"];            // send the command
        
        while [$line = fgets[$this->fp]] {                                   // fetch the response one line at a time
            $line = trim[$line];                                             // trim the response
            $line_arr = preg_split['/\s+/', $line, 0, PREG_SPLIT_NO_EMPTY];  // split the response into non-empty pieces by whitespace
            
            if [count[$line_arr] > 0] {
                $code = array_shift[$line_arr];                              // take the first segment from the response, which will be the line number
                
                if [strtoupper[$code] == $this->command_counter] {
                    $this->last_endline = join[' ', $line_arr];              // save the completion response line to parse later
                    break;
                } else {
                    $this->last_response[] = $line;                          // append the current line to the saved response
                }
                
            } else {
                $this->last_response[] = $line;
            }
        }
        
        $this->increment_counter[];
    }

    private function increment_counter[]
    {
        $this->command_counter = sprintf['%08d', intval[$this->command_counter] + 1];
    }
    ...
}

Lệnh
line_number command arg1 arg2 ...
8

Bây giờ chúng ta có thể viết các chức năng cho các lệnh cụ thể gọi hàm

00000001 LOGIN  password
4 của chúng ta dưới mui xe. Hãy để viết một chức năng cho lệnh
line_number command arg1 arg2 ...
8:

class imap_driver
{ 
    ...
    public function login[$login, $pwd]
    {
        $this->command["LOGIN $login $pwd"];
        if [preg_match['~^OK~', $this->last_endline]] {
            return true;
        } else {
            $this->error = join[', ', $this->last_response];
            $this->close[];
            return false;
        }
    }
    ...
}

Bây giờ chúng ta có thể kiểm tra nó như thế này. [Lưu ý rằng bạn phải có tài khoản email hoạt động để kiểm tra.]

...
// test for login[]
if [$imap_driver->login['', 'password'] === false] {
    echo "login[] failed: " . $imap_driver->error . "\n";
    exit;
}

Lưu ý rằng Gmail rất nghiêm ngặt về bảo mật theo mặc định: Nó sẽ không cho phép chúng tôi truy cập tài khoản email bằng IMAP nếu chúng tôi có cài đặt mặc định và cố gắng truy cập nó từ một quốc gia khác ngoài quốc gia hồ sơ tài khoản. Nhưng nó đủ dễ dàng để sửa chữa; Chỉ cần đặt cài đặt ít an toàn hơn trong tài khoản Gmail của bạn, như được mô tả ở đây.

Lệnh
00000001 LOGIN  password
6

Bây giờ, hãy để xem cách chọn một thư mục IMAP để làm điều gì đó hữu ích với email của chúng tôi. Cú pháp tương tự như

line_number command arg1 arg2 ...
8, nhờ phương thức
00000001 LOGIN  password
4 của chúng tôi. Chúng tôi sử dụng lệnh
00000001 LOGIN  password
6 thay thế và chỉ định thư mục.

include["imap_driver.php"];

// test for init[]
$imap_driver = new imap_driver[];
if [$imap_driver->init['ssl://imap.gmail.com', 993] === false] {
    echo "init[] failed: " . $imap_driver->error . "\n";
    exit;
}
0

Để kiểm tra nó, hãy để Lôi cố gắng chọn hộp thư đến:

include["imap_driver.php"];

// test for init[]
$imap_driver = new imap_driver[];
if [$imap_driver->init['ssl://imap.gmail.com', 993] === false] {
    echo "init[] failed: " . $imap_driver->error . "\n";
    exit;
}
1

Thực hiện các lệnh nâng cao

Hãy cùng xem xét cách thực hiện một vài lệnh IMAP, các lệnh nâng cao hơn.

Lệnh
line_number status metadata1 metadata2 ...
0

Một thói quen phổ biến trong phân tích email là tìm kiếm email trong một phạm vi ngày nhất định hoặc tìm kiếm các email được gắn cờ, v.v. Các tiêu chí tìm kiếm phải được chuyển đến lệnh

line_number status metadata1 metadata2 ...
0 như một đối số, với không gian như một dấu phân cách. Ví dụ: nếu chúng tôi muốn nhận tất cả các email kể từ ngày 20 tháng 11 năm 2015, chúng tôi phải chuyển lệnh sau:

include["imap_driver.php"];

// test for init[]
$imap_driver = new imap_driver[];
if [$imap_driver->init['ssl://imap.gmail.com', 993] === false] {
    echo "init[] failed: " . $imap_driver->error . "\n";
    exit;
}
2

Và phản hồi sẽ là một cái gì đó như thế này:

include["imap_driver.php"];

// test for init[]
$imap_driver = new imap_driver[];
if [$imap_driver->init['ssl://imap.gmail.com', 993] === false] {
    echo "init[] failed: " . $imap_driver->error . "\n";
    exit;
}
3

Tài liệu chi tiết về các thuật ngữ tìm kiếm có thể có thể được tìm thấy ở đây, đầu ra của lệnh

line_number status metadata1 metadata2 ...
0 là danh sách UID của các email, được phân tách bằng khoảng trắng. UID là một định danh duy nhất của một email trong tài khoản người dùng, theo thứ tự thời gian, trong đó 1 là email lâu đời nhất. Để thực hiện lệnh
line_number status metadata1 metadata2 ...
0, chúng tôi chỉ cần trả lại UID kết quả:

include["imap_driver.php"];

// test for init[]
$imap_driver = new imap_driver[];
if [$imap_driver->init['ssl://imap.gmail.com', 993] === false] {
    echo "init[] failed: " . $imap_driver->error . "\n";
    exit;
}
4

Để kiểm tra lệnh này, chúng tôi sẽ nhận được email từ ba ngày qua:

include["imap_driver.php"];

// test for init[]
$imap_driver = new imap_driver[];
if [$imap_driver->init['ssl://imap.gmail.com', 993] === false] {
    echo "init[] failed: " . $imap_driver->error . "\n";
    exit;
}
5

Lệnh
line_number status metadata1 metadata2 ...
4 với
line_number status metadata1 metadata2 ...
5

Một nhiệm vụ phổ biến khác là nhận các tiêu đề email mà không đánh dấu email là

line_number status metadata1 metadata2 ...
6. Từ hướng dẫn sử dụng IMAP, lệnh để lấy tất cả hoặc một phần của email là
line_number status metadata1 metadata2 ...
4. Đối số đầu tiên cho biết phần nào chúng tôi quan tâm và thường
line_number status metadata1 metadata2 ...
8 được thông qua, sẽ trả về toàn bộ tin nhắn cùng với các tiêu đề của nó và đánh dấu nó là
line_number status metadata1 metadata2 ...
6. Đối số thay thế
line_number status metadata1 metadata2 ...
5 sẽ làm điều tương tự, mà không đánh dấu thông điệp là
line_number status metadata1 metadata2 ...
6.

Cú pháp IMAP yêu cầu yêu cầu của chúng tôi cũng chỉ định, trong dấu ngoặc vuông, phần của email mà chúng tôi muốn tìm nạp, trong ví dụ này là

* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS 
COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS

00000001 OK  authenticated [Success]
2. Kết quả là, lệnh của chúng tôi sẽ trông như thế này:

include["imap_driver.php"];

// test for init[]
$imap_driver = new imap_driver[];
if [$imap_driver->init['ssl://imap.gmail.com', 993] === false] {
    echo "init[] failed: " . $imap_driver->error . "\n";
    exit;
}
6

Và chúng tôi sẽ mong đợi một phản hồi trông như thế này:

include["imap_driver.php"];

// test for init[]
$imap_driver = new imap_driver[];
if [$imap_driver->init['ssl://imap.gmail.com', 993] === false] {
    echo "init[] failed: " . $imap_driver->error . "\n";
    exit;
}
7

Để xây dựng một hàm cho các tiêu đề tìm nạp, chúng ta cần có khả năng trả về phản hồi trong cấu trúc băm [cặp khóa/giá trị]:

include["imap_driver.php"];

// test for init[]
$imap_driver = new imap_driver[];
if [$imap_driver->init['ssl://imap.gmail.com', 993] === false] {
    echo "init[] failed: " . $imap_driver->error . "\n";
    exit;
}
8

Và để kiểm tra mã này, chúng tôi chỉ cần chỉ định UID của thông báo mà chúng tôi quan tâm:

include["imap_driver.php"];

// test for init[]
$imap_driver = new imap_driver[];
if [$imap_driver->init['ssl://imap.gmail.com', 993] === false] {
    echo "init[] failed: " . $imap_driver->error . "\n";
    exit;
}
9

Phần mở rộng IMAP Gmail

Gmail cung cấp một danh sách các lệnh đặc biệt có thể làm cho cuộc sống của chúng ta dễ dàng hơn nhiều. Danh sách các lệnh mở rộng IMAP của Gmail có sẵn ở đây. Theo tôi, hãy xem xét một lệnh mà theo tôi, là điều quan trọng nhất:

* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS 
COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS

00000001 OK  authenticated [Success]
3. Nó cho phép chúng tôi sử dụng cú pháp tìm kiếm Gmail với IMAP. Ví dụ: chúng ta có thể tìm kiếm các email trong danh mục chính, xã hội, khuyến mãi, cập nhật hoặc diễn đàn.

Về mặt chức năng,

* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS 
COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS

00000001 OK  authenticated [Success]
3 là một phần mở rộng của lệnh
line_number status metadata1 metadata2 ...
0, vì vậy chúng tôi có thể sử dụng lại mã mà chúng tôi có ở trên cho lệnh
line_number status metadata1 metadata2 ...
0. Tất cả những gì chúng ta cần làm là thêm từ khóa
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS 
COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS

00000001 OK  authenticated [Success]
3 và tiêu chí:

line_number command arg1 arg2 ...
0

Mã trên sẽ trả về tất cả các UID được liệt kê trong danh mục chính của Cameron.

Lưu ý: Tính đến tháng 12 năm 2015, Gmail thường nhầm lẫn danh mục chính của nhóm với danh mục cập nhật trên mạng trên một số tài khoản. Đây là một lỗi Gmail chưa được sửa.

Sự kết luận

Bạn có thư. Giờ thì sao? Đọc cách xây dựng một ứng dụng email IMAP tùy chỉnh trong PHP và kiểm tra thư trên các điều khoản của bạn.

Nhìn chung, cách tiếp cận ổ cắm tùy chỉnh cung cấp nhiều tự do hơn cho nhà phát triển. Nó cho phép thực hiện tất cả các lệnh trong IMAP RFC3501. Nó cũng sẽ cung cấp cho bạn quyền kiểm soát tốt hơn đối với mã của bạn, vì bạn không phải tự hỏi những gì mà xảy ra trên mạng.

Lớp

line_number command arg1 arg2 ...
1 đầy đủ mà chúng tôi đã triển khai trong bài viết này có thể được tìm thấy ở đây. Nó có thể được sử dụng AS-IS và sẽ chỉ mất vài phút để nhà phát triển viết một chức năng mới hoặc yêu cầu cho máy chủ IMAP của họ. Tôi cũng bao gồm một tính năng gỡ lỗi trong lớp cho đầu ra dài dòng.

Làm thế nào tôi có thể nhận được email trong PHP?

Có thể nhận email trong PHP bằng cách chạy một máy chủ thư và thực hiện tập lệnh PHP với email được chuyển cho Stdin. Với CloudMailin, bạn không cần phải làm bất cứ điều gì, email của bạn được gửi đến ứng dụng của bạn qua [các] HTTP.running a mail server and executing a PHP script with the email passed to STDIN. With CloudMailin you don't need to do any of that, your email is delivered to your application over HTTP[S].

Làm thế nào để tôi biết nếu IMAP PHP được cài đặt?

Theo mặc định, IMAP cho PHP bị vô hiệu hóa.Đầu tiên, bạn cần kiểm tra xem PHP IMAP có được cài đặt hay không.Hãy kiểm tra với hàm phpinfo [] ...
Chuyển đến tệp \ xampp \ php \ php.....
tìm; mở rộng = php_imap.dll ..
Xóa dấu chấm phẩy khỏi; Extension = php_imap ..

PHP IMAP là gì?

PHP-IMAP là một trình bao bọc cho giao tiếp IMAP phổ biến mà không cần phải cài đặt / bật / bật mô-đun PHP-Imap "gốc".Giao thức IMAP được tích hợp hoàn toàn và do đó hỗ trợ tất cả các lệnh IMAP bao gồm hoạt động nhàn rỗi và quy trình xác thực OAuth "mới" mới.a wrapper for common IMAP communication without the need to have the "native" php-imap module installed / enabled. The IMAP protocol is completely integrated and therefore supports all IMAP commands including the IDLE operation and the "new" oAuth authentication process.

Làm thế nào tôi có thể truy cập gmail trong PHP?

Cấu hình IMAP trong môi trường PHP và Gmail..
Cài đặt thư viện PHP IMAP.....
Bật tiện ích mở rộng thư viện IMAP trong tệp cấu hình PHP xóa dấu chấm phẩy [;] ở đầu dòng.....
Tăng giới hạn cho Chỉ thị MAX_EXECATION_TIME trong tệp php.ini ..
Khởi động lại Apache để làm cho những thay đổi này hiệu quả ..

Bài Viết Liên Quan

Chủ Đề