Как мне получить содержимое электронной почты от Mail :: Message? - PullRequest
0 голосов
/ 22 октября 2009

Отредактированный

Теперь мой код выглядит так:

#!/usr/bin/perl

# import packages
use Net::POP3;
use Getopt::Long;
use Mail::Message;
use strict;
use warnings;

# read command line options
# display usage message in case of error
GetOptions ('h|host=s' => \$host,
            'u|user=s' => \$user,
            'p|pass=s' => \$pass) or die("Input error. Try calling me with: -h <host> -u <username> -p <password>");

# file operations
open($email_file, ">>", "Mail.txt");

# initiate connection
# default timeout = 120 sec
$conn = Net::POP3->new($host) or die("ERROR: Unable to connect.\n");

# login
$numMsg = $conn->login($user, $pass) or die("ERROR: Unable to login.\n");

# get message numbers
# iterate over list and print first 20 lines of each
if ($numMsg > 0) {
    $msgList = $conn->list();
    foreach $msg (keys(%$msgList)) {
        $rawdata = $conn->get($msg);
        my $msg_obj = Mail::Message->read($rawdata);
        my $body = $msg_obj->body;
        print $email_file @body;
        print $email_file "\n====================================================\n";
    }
} else {
    print "Mailbox is empty.\n";   
}

# close connection
$conn->quit();
close($email_file);

Но когда я пытаюсь выполнить это, я получаю это:

[ubuntu@eeepc:~/Desktop/mail] ./get.pl -h pop.vix.terra.com.br -u nathanpc -p secret
Global symbol "$host" requires explicit package name at ./get.pl line 12.
Global symbol "$user" requires explicit package name at ./get.pl line 13.
Global symbol "$pass" requires explicit package name at ./get.pl line 14.
Global symbol "$email_file" requires explicit package name at ./get.pl line 17.
Global symbol "$conn" requires explicit package name at ./get.pl line 21.
Global symbol "$host" requires explicit package name at ./get.pl line 21.
Global symbol "$numMsg" requires explicit package name at ./get.pl line 24.
Global symbol "$conn" requires explicit package name at ./get.pl line 24.
Global symbol "$user" requires explicit package name at ./get.pl line 24.
Global symbol "$pass" requires explicit package name at ./get.pl line 24.
Global symbol "$numMsg" requires explicit package name at ./get.pl line 28.
Global symbol "$msgList" requires explicit package name at ./get.pl line 29.
Global symbol "$conn" requires explicit package name at ./get.pl line 29.
Global symbol "$msg" requires explicit package name at ./get.pl line 30.
Global symbol "$msgList" requires explicit package name at ./get.pl line 30.
Global symbol "$rawdata" requires explicit package name at ./get.pl line 31.
Global symbol "$conn" requires explicit package name at ./get.pl line 31.
Global symbol "$msg" requires explicit package name at ./get.pl line 31.
Global symbol "$rawdata" requires explicit package name at ./get.pl line 32.
Global symbol "$email_file" requires explicit package name at ./get.pl line 34.
Global symbol "@body" requires explicit package name at ./get.pl line 34.
Global symbol "$email_file" requires explicit package name at ./get.pl line 35.
Global symbol "$conn" requires explicit package name at ./get.pl line 42.
Global symbol "$email_file" requires explicit package name at ./get.pl line 43.
Execution of ./get.pl aborted due to compilation errors.
[ubuntu@eeepc:~/Desktop/mail]

Оригинал

Здравствуйте,

Я изучаю Perl и в то же время делаю домашний проект, который я буду использовать для событий своей семьи, но когда я использовал Mail :: Message, чтобы получить только тело письма, я ничего не получаю , Смотрите мой код:

#!/usr/bin/perl

# import packages
use Net::POP3;
use Getopt::Long;
use Mail::Message;

# read command line options
# display usage message in case of error
GetOptions ('h|host=s' => \$host,
            'u|user=s' => \$user,
            'p|pass=s' => \$pass) or die("Input error. Try calling me with: -h <host> -u <username> -p <password>");

# file operations
open(file, ">>", "Mail.txt");

# initiate connection
# default timeout = 120 sec
$conn = Net::POP3->new($host) or die("ERROR: Unable to connect.\n");

# login
$numMsg = $conn->login($user, $pass) or die("ERROR: Unable to login.\n");

# get message numbers
# iterate over list and print first 20 lines of each
if ($numMsg > 0) {
    $msgList = $conn->list();
    foreach $msg (keys(%$msgList)) {
        my $msg_obj = Mail::Message::->read($rawdata);
        my $body = $msg_obj->body;
        print file @body;
        print file "\n====================================================\n";
    }
} else {
    print "Mailbox is empty.\n";   
}

# close connection
$conn->quit();
close(file);

И файл, который я использую для хранения писем:

====================================================

====================================================

====================================================

Что я делаю не так? Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 октября 2009

Нет ничего в $raw_data, потому что вы никогда не назначаете на него.

Нет ничего в @body (переменная массива). Вы помещаете вещи в $body (скалярная переменная).

Это проблемы, которые use strict найдет для вас. :)

2 голосов
/ 22 октября 2009

Откуда берется $rawdata? Вы забыли сказать что-то вроде

    $rawdata = $conn->get($msg);

?

use strict и use warnings в верхней части вашего скрипта могли бы помочь вам поймать это.

0 голосов
/ 23 октября 2009

Все сообщения вида:

Global symbol "$host" requires explicit package name at ./get.pl line 12.

Происходит от того, что вы включили строгие переменные с помощью use strict, что требует от вас объявления переменных перед их использованием.

Попробуйте добавить use diagnostics, чтобы получить расширенные пояснения к сообщениям об ошибках.

Вы также можете запустить splain, чтобы объяснить сообщения об ошибках. Запустите ваш скрипт и запишите stderr в файл get.pl 2> errors, затем запустите splain errors.

За вашу ошибку сплайн говорит:

Глобальному символу "$ host" требуется явное имя пакета в строке ./get.pl 12 (# 1) (F) Вы сказали «использовать строгие переменные», что означает, что все переменные должен быть либо лексически ограничен (используя «my»), объявлен заранее с помощью «наш», или явно квалифицированный, чтобы сказать, какой пакет глобальной переменной находится в (используя "::").

Проверьте perldoc строго , perldoc предупреждений , perldoc perllexwarn и наконец perldoc -f my .

Исправлен первый бит вашего скрипта (после всех операторов use):

# read command line options
# display usage message in case of error

# predeclaring all variables with `my`
my $host = 'localhost';  # you can set default values for Getopt::Long this way. 
my $user;
my $pass;

GetOptions ('h|host=s' => \$host,
            'u|user=s' => \$user,
            'p|pass=s' => \$pass,
) or die("Input error. Try calling me with: -h <host> -u <username> -p <password>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...