使用PHP管理GMail邮件过滤器XML文件

时间:2010-10-28 13:04:37

标签: php xml gmail simplexml

由于GMail可以导入和导出邮件过滤器,我想管理使用PHP脚本从GMail导出的XML文件,因为有一些known issues包含字符数搜索过滤器。

我在PHP中找到了simplexml_load_file函数,并针对执行的导出执行了var_dump(),但我现在似乎无法访问生成的XML文件中的apps命名空间。

在PHP手册中的各个页面之后,我创建了这个非常简单的脚本来读取XML,这样我就可以开始处理我已经创建的过滤器了。不幸的是,它似乎缺少关键部分!

<pre><?php

if(file_exists("mailfilters.xml")) {
  $xml = simplexml_load_file("mailfilters.xml");
  $namespaces = $xml->getNamespaces(true);
  foreach ($namespaces as $prefix => $ns) {
      $xml->registerXPathNamespace($prefix, $ns);
  }
  var_dump($xml);
} else {
  die("Failed to open filter file");
}

?></pre>

返回此数据(提取)

["entry"]=>
array(268) {
  [0]=>
  object(SimpleXMLElement)#3 (5) {
    ["category"]=>
    object(SimpleXMLElement)#271 (1) {
      ["@attributes"]=>
      array(1) {
        ["term"]=>
        string(6) "filter"
      }
    }
    ["title"]=>
    string(11) "Mail Filter"
    ["id"]=>
    string(45) "tag:mail.google.com,2008:filter:1284991916868"
    ["updated"]=>
    string(20) "2010-10-28T11:59:31Z"
    ["content"]=>
    object(SimpleXMLElement)#272 (0) {
    }
  }
  [1]=>
  object(SimpleXMLElement)#4 (5) {
    ["category"]=>
    object(SimpleXMLElement)#272 (1) {
      ["@attributes"]=>
      array(1) {
        ["term"]=>
        string(6) "filter"
      }
    }
    ["title"]=>
    string(11) "Mail Filter"
    ["id"]=>
    string(45) "tag:mail.google.com,2008:filter:1284991925003"
    ["updated"]=>
    string(20) "2010-10-28T11:59:31Z"
    ["content"]=>
    object(SimpleXMLElement)#271 (0) {
    }
  }

这是我今天下载的XML文件的摘录,用于创建上述输出:

<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:apps='http://schemas.google.com/apps/2006'>
    <title>Mail Filters</title>
<id>tag:mail.google.com,2008:filters:1284991916868,...,1287734777820</id>
<updated>2010-10-28T11:59:31Z</updated>
<author>
    <name>My Name</name>
    <email>my@email.addr.es</email>
</author>
<entry>
    <category term='filter'></category>
    <title>Mail Filter</title>
    <id>tag:mail.google.com,2008:filter:1284991916868</id>
    <updated>2010-10-28T11:59:31Z</updated>
    <content></content>
    <apps:property name='from' value='an@email.addr.es'/>
    <apps:property name='shouldArchive' value='true'/>
    <apps:property name='shouldTrash' value='true'/>
</entry>
<entry>
    <category term='filter'></category>
    <title>Mail Filter</title>
    <id>tag:mail.google.com,2008:filter:1284993579743</id>
    <updated>2010-10-28T11:59:31Z</updated>
    <content></content>
    <apps:property name='subject' value='Some Relevant Subject'/>
    <apps:property name='label' value='MyCoolLabel'/>
    <apps:property name='shouldArchive' value='true'/>
</entry>

其他“app:property”动词包括:

<apps:property name='hasTheWord' value=''/>
<apps:property name='shouldAlwaysMarkAsImportant' value=''/>
<apps:property name='doesNotHaveTheWord' value=''/>

2 个答案:

答案 0 :(得分:2)

我最近有类似的“问题”。我试图从Google Apps获取电子邮件签名设置。这就是来自Google的XML响应:

<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns='http://www.w3.org/2005/Atom' xmlns:apps='http://schemas.google.com/apps/2006'>
<id>https://apps-apis.google.com/a/feeds/emailsettings/2.0/domain.com/user/signature</id>
<updated>2012-08-31T15:22:03.067Z</updated>
<link rel='self' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/emailsettings/2.0/domain.com/user/signature?xoauth_requestor_id=user@domain.com'/>
<link rel='edit' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/emailsettings/2.0/domain.com/user/signature?xoauth_requestor_id=user@domain.com'/>
<apps:property name='signature' value='Here goes the email signature...'/>
</entry>

我无法使用SimpleXMLElement从app:property中获取属性。这就是我最终解决它的方式:

    // create SimpleXMLElement with XML input as string
    $xml = new SimpleXMLElement($feed);

    // get namespace from XML
    $namespaces = $xml->getNamespaces(true);

    // get children (using namespace) and attributes
    $appsProperty = $xml->children($namespaces['apps'])->attributes();

    // attributes are now stored in array $appsProperty and can be accessed
    echo "Name: ".$appsProperty['name'];
    echo "Signature: ".$appsProperty['value'];

答案 1 :(得分:1)

乔,

从Facebook上链接这个标记的满分,我从来没有见过它,我昨天做的确实是这样,对于谷歌服务!我认为使用XPath有点像红色鲱鱼,让我告诉你如何访问这些元素,并希望它能为你提供足够的信息以便你做什么。

你在$ xml-&gt; getNamespaces()的正确轨道上 - 但是不要在那里进行迭代,你需要在你想要的父元素上使用你想要的命名空间。首先,你需要只对入口元素进行操作,因为这些元素占多数,你可以循环检查你是否有正确的元素:

foreach($xml as $tag) {
  if($tag->getName() == "entry") {
    // awesome, do Cool Stuff (TM) here
  }
}

现在,您拥有$ tag变量中的元素,并且您需要apps:namespaced子元素。所以这样做:

$tag->getChildren($namespaces['apps']);

当您遍历该集合时,您将看到所需的信息。

HTH,

洛娜