zoukankan      html  css  js  c++  java
  • zend framework 获取邮箱内容 编码转换 quoted_printable_decode | base64_decode

    内容来源:https://profiles.google.com/112420231281452842795/buzz/8xTqKtusZ27
     
    Fetching mail from a POP3 server with Zend_Mail

    I was in a need for a class to get mails from a pop server to process them, so I’ve decided to leverage the Zend_Mail class, what I did was to create a wrapper around the Zend_Mail, to return all the messages from the server in a manageable way.

    The first step was to put the needed Zend files in my library folder:

    lib/Zend/Mail.php
    Mail
    |-- Exception.php
    |-- Message
    |   |-- File.php
    |   `-- Interface.php
    |-- Message.php
    |-- Part
    |   |-- File.php
    |   `-- Interface.php
    |-- Part.php
    |-- Protocol
    |   |-- Abstract.php
    |   |-- Exception.php
    |   |-- Imap.php
    |   |-- Pop3.php
    |   |-- Smtp
    |   |   `-- Auth
    |   |       |-- Crammd5.php
    |   |       |-- Login.php
    |   |       `-- Plain.php
    |   `-- Smtp.php
    |-- Storage
    |   |-- Abstract.php
    |   |-- Exception.php
    |   |-- Folder
    |   |   |-- Interface.php
    |   |   |-- Maildir.php
    |   |   `-- Mbox.php
    |   |-- Folder.php
    |   |-- Imap.php
    |   |-- Maildir.php
    |   |-- Mbox.php
    |   |-- Pop3.php
    |   `-- Writable
    |       |-- Interface.php
    |       `-- Maildir.php
    |-- Storage.php
    `-- Transport
        |-- Abstract.php
        |-- Exception.php
        |-- Sendmail.php
        `-- Smtp.php
    

    Then I started writing my class:

    < ?php
     
    set_include_path('lib' . PATH_SEPARATOR . get_include_path());
     
    include_once 'Zend/Mail.php';
    include_once 'Zend/Mail/Storage/Pop3.php';
    include_once 'Zend/Mail/Transport/Smtp.php';
    include_once 'Zend/Mime/Part.php';
     
    /**
     * Class to get mails from a server
     */
    class mailFetcher
    {
        private $_emailHost = 'pop.server.com';
        private $_emailUser = 'ivan@ivanvillareal.com';
        private $_emailPass = 'password';
    	/**
    	 * Zend_Mail_Storage
    	 */
        private $_mail;
    	/**
    	 * Inbox wrapper
    	 */
    	private $_inbox = array();
     
    	/**
    	 * on class instantiation we fire connect
    	 * to the pop server and start fetching the mails
    	 */
        public function __construct()
        {
            try {
                $this->_mail = new Zend_Mail_Storage_Pop3(array(
                                                 'host' => $this->_emailHost,
                                                 'user' => $this->_emailUser,
                                                 'password' => $this->_emailPass));
            } catch (Exception $e) {
                echo 'Mail Retrieval Failed...' . PHP_EOL;
                die();
            }      
            $this->processMail();
        }
     
     
    	private function _contentDecoder($encoding, $content)
    	{
    		switch ($encoding) {
    			case 'quoted-printable':
    				$result = quoted_printable_decode($content);
    			break;
    			case 'base64':
    				$result = base64_decode($content);
    			break;
    			default:
    				$result = $content;
    			break;
    		}
    		return $result;
    	}
     
    	/**
    	 * This is where everything is done
    	 */
    	public function processMail()
    	{
    		if ($this->_mail instanceof Zend_Mail_Storage_Pop3 && $this->_mail->countMessages() > 0) {
    			$messageNum = 0;
    			foreach ($this->_mail as $message) {
    				$messageNum++;
    				$rawMail      = $this->_mail->getRawHeader($messageNum) . $this->_mail->getRawContent($messageNum);
    				$received     = $message->received;
    				$date         = date('Y-m-d H:i:s', strtotime($message->date));
    				$messageId    = $message->headerExists('message-id') ? $message->getHeader('message-id') : null;
    				//remove <> from message id
    				$messageId    = (preg_match('|< (.*?)>|', $messageId, $regs)) ? $regs[1] : $messageId;
    				$inReplyTo    = $message->headerExists('in-reply-to') ? $message->getHeader('in-reply-to') : null;
    				//remove <> from in-reply-to
    				$inReplyTo    = (preg_match('|< (.*?)>|', $inReplyTo, $regs)) ? $regs[1] : $inReplyTo;
    				$references   = $message->headerExists('References')  ? $message->getHeader('References') : null;
    				//remove <> from references
    				$references   = (preg_match('|< (.*?)>|', $references, $regs)) ? $regs[1] : $references;
    				$from         = $message->from;
    				$subject      = $message->subject;
    				$to           = $message->to;
    				$plainContent = null;
    				$htmlContent  = null;
    				$attachments = array();
     
    				/**
    				 * Check if the message has multiple parts
    				 */
    		        if ($message->isMultipart()) {
    					/**
    					 * We have a multipart message
    					 * lets extract the plain content,
    					 * html content, and attachments
    					 */
    					foreach (new RecursiveIteratorIterator($message) as $part) {
    						try {
    							switch (strtok($part->contentType, ';')) {
    								case 'text/plain':
    									$plainContent = $this->_contentDecoder($part->getHeader('content-transfer-encoding'), $part->getContent());
    								break;
    								case 'text/html':
    									$htmlContent = $this->_contentDecoder($part->getHeader('content-transfer-encoding'), $part->getContent());
    								break;
    								default: //attachment handle
    									$type       = strtok($part->contentType, ';');
    									$fileName   = $part->getHeader('content-description');
    									$attachment = $this->_contentDecoder($part->getHeader('content-transfer-encoding'), $part->getContent());
    									$attachments[] = array(
    													   'file_name' => $fileName,
    													   'type'      => $type,
    													   'content'	=> $attachment);
    								break;
    							}
    						} catch (Zend_Mail_Exception $e) {
    							echo "$e \n";
    						}
    					}
    				} else {
    					$plainContent = $message->getContent();
    				}
    				$this->_inbox[] = array('messageNumber' => $messageNum,
    									    'rawMail'       => $rawMail,
    										'received'		=> $received,
    										'date'			=> $date,
    										'messageId'		=> $messageId,
    										'inReplyTo'		=> $inReplyTo,
    										'references'	=> $references,
    										'from'			=> $from,
    										'subject'		=> $subject,
    										'to'			=> $to,
    										'plainContent'	=> $plainContent,
    										'htmlContent'	=> $htmlContent,
    										'attachments'	=> $attachments);
    			}
    		} else {
    			$this->_inbox = false;
    		}
    	}
    	public function getInbox()
    	{
    		return $this->_inbox;
    	}
    }

    My fetch class does everything on instantiation, and it will have all the mails retreived, so for example if I need to get all messages I can do this:

    < ?php
    include_once 'mailFetcher.php';
     
    $inbox = new mailFetcher();
    print_r($inbox->getInbox());

    And this would be the result:

    Array
    (
        [0] => Array
            (
                [messageNumber] => 1
                [rawMail] => Received: from gate55.gate.iad.mailserver.com (11.1.111.1) by
     IAD2HUB01.mex02.mailserver.com (111.11.11.65) with Microsoft SMTP Server (TLS) id
     8.2.247.2; Wed, 9 Jun 2010 17:56:16 -0400
    Received: from mail-yw0-f186.google.com (mail-yw0-f186.google.com
     [111.11.111.186])	by gate55.gate.iad.mailserver.com (SMTP Server) with ESMTP id
     B1F6E31D0171	for <asdfasdf @ivanvillareal.com>; Wed,  9 Jun 2010
     17:56:15 -0400 (EDT)
    Received: by ywh16 with SMTP id 16so5309053ywh.32        for
     </asdfasdf><asdfasdf @ivanvillareal.com>; Wed, 09 Jun 2010 14:56:15 -0700 (PDT)
    Received: by 10.111.111.111 with SMTP id jz1mr465966qcb.170.1276120573865;
     	Wed, 09 Jun 2010 14:56:13 -0700 (PDT)
    Received: by 11.111.111.11 with HTTP; Wed, 9 Jun 2010 14:56:13 -0700 (PDT)
    From: Ivan Villareal <ivaano @gmail.com>
    To: "asdfasdf@ivanvillareal.com" <asdfasdf @ivanvillareal.com>
    Date: Wed, 9 Jun 2010 17:56:13 -0400
    Subject: attachment test
    Thread-Topic: attachment test
    Thread-Index: AcsIHpXuE+vWJJMfTGyqikgD2kYkng==
    Message-ID: <aanlktingkmpbkefog5kxxoq8wrib7tj1pt1rsy -1ug-1@mail.gmail.com>
    Accept-Language: en-US
    Content-Language: en-US
    X-MS-Exchange-Organization-AuthAs: Anonymous
    X-MS-Exchange-Organization-AuthSource: IAD2HUB01.mex02.mailserver.com
    X-MS-Has-Attach: yes
    X-MS-TNEF-Correlator:
    x-virus-scanned: OK, catchall
    x-originating-ip: [111.11.111.186]
    dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed;        d=gmail.com;
     s=gamma;
            h=domainkey-signature:mime-version:received:received:date:message-id
             :subject:from:to:content-type;
            bh=IvMOHmKRabcJ2PrUHPHB/NbNpgQubvvgGprC6gtDY9E=;
            b=cA5Pjycedt9Pylic7CTk4HCF6HXV9eEFpr086KwcMepGKJEv4DWU6d4iFt4Gp7R42V
             +4rVmrmwj2j9yj1vbEUqVMI6/m+Kkwt1r+MAtN/0qZsvEaVBBbbjTBxFLO9cQ7xlaSSm
             eGTHv9mR0qCcBZGLOVFeWUNiYDkhY2F0eDUbU=
    domainkey-signature: a=rsa-sha1; c=nofws;        d=gmail.com; s=gamma;
            h=mime-version:date:message-id:subject:from:to:content-type;
            b=VKdlRSfBz/Swij0xE0c7Su8TOwcc2YGmw0K8dvVxoS9TJf0p8nIqtR6nQtmKqabSu4
             g2ALFFHXuVOhGpP+JdvI3wQJ1k9N5EZhcWtSRECrikOlLnaDA8/4z3SYckY6hs7Q+KIe
             qG0IbY+QkuZh7yymcyAN5omTaFDFT2GIPs+1c=
    x-orig-to: catchall@ivanvillareal.com
    Content-Type: multipart/mixed;
    	boundary="_004_AANLkTingkMPbKeFog5kxXoq8WRib7tJ1pT1Rsy1ug1mailgmailcom_"
    MIME-Version: 1.0
     
    --_004_AANLkTingkMPbKeFog5kxXoq8WRib7tJ1pT1Rsy1ug1mailgmailcom_
    Content-Type: multipart/alternative;
    	boundary="_000_AANLkTingkMPbKeFog5kxXoq8WRib7tJ1pT1Rsy1ug1mailgmailcom_"
     
    --_000_AANLkTingkMPbKeFog5kxXoq8WRib7tJ1pT1Rsy1ug1mailgmailcom_
    Content-Type: text/plain; charset="utf-8"
    Content-Transfer-Encoding: base64
     
    amhnamhnamhnDQo=
     
    --_000_AANLkTingkMPbKeFog5kxXoq8WRib7tJ1pT1Rsy1ug1mailgmailcom_
    Content-Type: text/html; charset="utf-8"
    Content-Transfer-Encoding: base64
     
    amhnamhnamhnDQo=
     
    --_000_AANLkTingkMPbKeFog5kxXoq8WRib7tJ1pT1Rsy1ug1mailgmailcom_--
     
    --_004_AANLkTingkMPbKeFog5kxXoq8WRib7tJ1pT1Rsy1ug1mailgmailcom_
    Content-Type: image/jpeg; name="2010-05-28-112655.jpg"
    Content-Description: 2010-05-28-112655.jpg
    Content-Disposition: attachment; filename="2010-05-28-112655.jpg"; size=15004;
    	creation-date="Wed, 09 Jun 2010 17:56:16 GMT";
    	modification-date="Wed, 09 Jun 2010 17:56:16 GMT"
    Content-Transfer-Encoding: base64
     
    /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
    gq4UlFJmmKwtHakzS0DsMNFLikIxQAUmKKM0AFLSUtABRRRQAlFGeaKACiikouAtGaKPrQAmaKDS
    4oASgClxRQKwUUUlAxaKKM0AFBNFGM0AGalHzIKiIp6HgigQuKKKKQyZDlaJAcU2I09+VP0qWSRK
    R0zTGXBpuec1IDvX3qihqNhhV5WG0Vn9DUocgUMTJpyCpIqsKezZXmoqENDqQ0dqBmmMBS0UmKAF
    oFJS0AJ3oIpQKQk0AAp4JxTBTxQwYE0oFNNOU8UhCkDGKaRin0EZoEiLIpcUuzuKMUyrje9FKQet
    J2oGf//Z
     
    --_004_AANLkTingkMPbKeFog5kxXoq8WRib7tJ1pT1Rsy1ug1mailgmailcom_--
     
                [received] => from gate55.gate.iad.mailserver.com (11.1.111.1) by IAD2HUB01.mex02.mailserver.com (111.11.11.15) with Microsoft SMTP Server (TLS) id 1.1.147.2; Wed, 9 Jun 2010 17:56:16 -0400
    from mail-yw0-f186.google.com (mail-yw0-f186.google.com [209.85.211.186])	by gate55.gate.iad.mailserver.com (SMTP Server) with ESMTP id B1F6E31D0171	for <asdfasdf @ivanvillareal.com>; Wed,  9 Jun 2010 17:56:15 -0400 (EDT)
    by ywh16 with SMTP id 16so5309053ywh.32        for </asdfasdf><asdfasdf @ivanvillareal.com>; Wed, 09 Jun 2010 14:56:15 -0700 (PDT)
    by 10.229.233.193 with SMTP id jz1mr465966qcb.170.1276120573865; Wed, 09 Jun 2010 14:56:13 -0700 (PDT)
    by 10.229.192.82 with HTTP; Wed, 9 Jun 2010 14:56:13 -0700 (PDT)
                [date] => 2010-06-09 14:56:13
                [messageId] => AANLkTingkMPbKeFog5kxXoq8WRib7tJ1pT1Rsy-1ug-1@mail.gmail.com
                [inReplyTo] => 
                [references] => 
                [from] => Ivan Villareal <ivaano @gmail.com>
                [subject] => attachment test
                [to] => "asdfasdf@ivanvillareal.com" <asdfasdf @ivanvillareal.com>
                [plainContent] => jhgjhgjhg
     
                [htmlContent] => jhgjhgjhg
     
                [attachments] => Array
                    (
                        [0] => Array
                            (
                                [file_name] => 2010-05-28-112655.jpg
                                [type] => image/jpeg
                            )
     
                    )
     
            )
     
    )</asdfasdf></ivaano></asdfasdf></aanlktingkmpbkefog5kxxoq8wrib7tj1pt1rsy></asdfasdf></ivaano></asdfasdf>

    From this point I can iterate the inbox easily saving the email results or applying other logic to it,

  • 相关阅读:
    [原]three.js 地形法向量生成
    C# 创建XML文档
    <转载>在C#中操作XML(基础操作)
    <转载>Visual C#.NetSocket篇
    <转载>批处理重定向中的秘密
    <转载>最基本的Socket编程C#版
    <转载>在.NET中运行外部程序的3种方法
    <转载>修改Win7远程桌面端口
    <转载>Visual C#.NetTCP篇
    <转载>C#中的委托和事件(续)
  • 原文地址:https://www.cnblogs.com/wangjiangze/p/3024446.html
Copyright © 2011-2022 走看看