【问题标题】:Perl - IMAP search unicode string with X-GM-RAWPerl - IMAP 使用 X-GM-RAW 搜索 unicode 字符串
【发布时间】:2015-04-14 20:04:19
【问题描述】:

我正在使用 PerlMail::IMAPClient 模块来搜索电子邮件并从 Gmail 服务器获取它们,但遇到了 X-GM 中的 unicode 字符串问题-生的。

当我发送命令时:

搜索字符集 UTF-8 X-GM-RAW "Новости"

它不起作用:(

但是

搜索字符集 UTF-8 X-GM-RAW“新闻”

正常工作并返回消息 ID 列表

我的 perl 脚本如下所示:

#!/usr/bin/env perl

use utf8::all;
use strict;
use warnings;
use feature 'say';
use Mail::IMAPClient;

my $imap = Mail::IMAPClient->new(
    Server   => 'imap.gmail.com',
    User     => 'username@gmail.com',
    Password => 'secr3t',
    Ssl      => 1,
    Uid      => 0,
    Debug    => 1
);

$imap->select('[Gmail]/All Mail');
my $news = $imap->search('CHARSET UTF-8 X-GM-RAW "Новости"');
print "@$news"; # print message ids

调试消息:

Started at Wed Apr 15 00:25:43 2015
Using Mail::IMAPClient version 3.35 on perl 5.020002
Connecting with IO::Socket::SSL PeerAddr imap.gmail.com PeerPort 993 Proto tcp Timeout 600 Debug 1
Connected to imap.gmail.com
Read:   * OK Gimap ready for requests from 178.47.31.152 e1mb42229459lab
Sending: 1 LOGIN username@gmail.com secr3t
Sent 43 bytes
Read:   * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT
    1 OK username@gmail.com authenticated (Success)
Sending: 2 SELECT "[Gmail]/All Mail"
Sent 29 bytes
Read:   * FLAGS (\Answered \Flagged \Draft \Deleted \Seen $label3 $Phishing $Forwarded $MDNSent Old $NotJunk NotJunk NonJunk $NotPhishing Junk)
    * OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen $label3 $Phishing $Forwarded $MDNSent Old $NotJunk NotJunk NonJunk $NotPhishing Junk \*)] Flags permitted.
    * OK [UIDVALIDITY 596378645] UIDs valid.
    * 36992 EXISTS
    * 0 RECENT
    * OK [UIDNEXT 99973] Predicted next UID.
    * OK [HIGHESTMODSEQ 3390697]
    2 OK [READ-WRITE] [Gmail]/All Mail selected. (Success)
Sending: 3 SEARCH CHARSET UTF-8 X-GM-RAW "Новости"
Sent 41 bytes
...

并没有停止... 直到我用 Ctrl+C 杀了他

如果你已经解决了这个问题,请帮忙!)

谢谢!

【问题讨论】:

    标签: perl encoding utf-8 gmail imap


    【解决方案1】:

    发送

    0 ENABLE UTF8=ACCEPT
    

    首先。 enable 命令启用特定的服务器功能,在这种情况下,相关功能是能够在带引号的字符串(“Новости”)中使用 UTF-8。如果您想阅读更多内容,RFC 5161 和 6855 也适用,但这并不是必需的。

    所有 IMAP 服务器都允许您在文字 ({14}CRLFНовости) 或非同步文字 ({14+}CRLFНовости) 中使用 UTF8,但带引号的字符串要方便得多,而且 gmail 确实支持 enable

    【讨论】:

      【解决方案2】:

      找到的方法引用,照你说的做:

      将其参数作为正确引用的字符串或文字字符串返回。

      并添加了带有 no utf8 pragma 的块,以切换回将源文本视为当前词法范围内的文字字节。

      #!/usr/bin/env perl
      
      use utf8;
      use strict;
      use warnings;
      use feature 'say';
      use Mail::IMAPClient;
      
      my $imap = Mail::IMAPClient->new(
          Server   => 'imap.gmail.com',
          User     => 'username@gmail.com',
          Password => 'secr3t',
          Ssl      => 1,
          Uid      => 0,
          Debug    => 1
      );
      
      $imap->select('[Gmail]/All Mail');
      
      my $newsid_ref;
      {
          no utf8;
          my $string = $imap->Quote("Новости");
          $newsid_ref = $imap->search('CHARSET UTF-8 X-GM-RAW ' . $string);
      }
      say for @$newsid_ref;
      

      现在脚本可以正常工作了。

      【讨论】:

        猜你喜欢
        • 2012-10-17
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        • 2015-08-27
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 2014-04-23
        相关资源
        最近更新 更多