如何从Perl读取Gmail帐户中的邮件正文?

如何从Perl读取Gmail帐户中的邮件正文?,perl,gmail-imap,Perl,Gmail Imap,我已经阅读了3年前在这里发布的内容-> 但是我不能打开身体。。我读过Net::IMAP::Simple和Email::Simple。我正在试着。。但不起作用,它打印的是数据源和主体,而不是身体 use strict; use warnings; # required modules use Net::IMAP::Simple; use Email::Simple; use IO::Socket::SSL; # fill in your details here my $username =

我已经阅读了3年前在这里发布的内容->

但是我不能打开身体。。我读过Net::IMAP::Simple和Email::Simple。我正在试着。。但不起作用,它打印的是数据源和主体,而不是身体

use strict;
use warnings;

# required modules
use Net::IMAP::Simple;
use Email::Simple;
use IO::Socket::SSL;

# fill in your details here
my $username = 'email@gmail.com';
my $password = 'pass';
my $mailhost = 'imap.gmail.com';

# Connect
my $imap = Net::IMAP::Simple->new(
    $mailhost,
    port    => 993,
    use_ssl => 1,
) || die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";

# Log in
if ( !$imap->login( $username, $password ) ) {
    print STDERR "Login failed: " . $imap->errstr . "\n";
    exit(64);
}
# Look in the INBOX
my $nm = $imap->select('INBOX');

# How many messages are there?
my ($unseen, $recent, $num_messages) = $imap->status();
print "unseen: $unseen, recent: $recent, total: $num_messages\n\n";


## Iterate through unseen messages
for ( my $i = 1 ; $i <= $nm ; $i++ ) {
    if ( $imap->seen($i) ) {
        next;
    }
    else {
    my $es = Email::Simple->new( join '', @{ $imap->top($i) } );
    my $text = $es->body;
    printf( "[%03d] %s\n\t%s\n%s", $i, $es->header('From'), $es->header('Subject'),$text);
    }
}


# Disconnect
$imap->quit;

exit;
本刊:

[001] <example@example.com>
     test subject
不是邮件的正文

谁能解决这个问题


提前感谢。

问题在于您正在使用:

$imap->top($i)
我的重点是:

此方法接受消息编号作为其必需参数。那个 将从当前选定的文件夹中检索邮件。在…上 success此方法返回包含以下行的列表引用: 标题。失败和errstr错误时不返回任何内容 已使用错误消息设置处理程序

top不会返回消息的正文。你需要使用get。大概是这样的:

my $es = Email::Simple->new( join '', @{ $imap->get($i) } );
                                                ^^^

不工作意味着什么?“不工作”是一个不足以让我们理解问题的描述。你试的时候发生了什么?你收到错误消息了吗?你得到了不正确的结果吗?你没有得到结果吗?如果结果不正确,是什么导致结果不正确?你在期待什么?你得到正确的结果了吗?如果是,它们是什么?别让我们猜,对不起。当我说不起作用时,我的意思是没有结果。我看到的是来自和主体,但不是身体。$es->body;vs es->body解决了这个问题。没有结果意味着什么都没有打印出来?printf语句一定打印了一些内容,即使是空括号和一些空白。您确定代码块正在执行吗?$es对象中有什么?在实例化$es之后,添加以下内容:use Data::Dumper;打印转储程序$es;假设@Doon的建议修复了它,它告诉我程序没有使用警告;严格使用;在它的顶端,它会抓住问题。Perl程序应该始终具有使用警告;严格使用;在顶端。