powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - Сохранить аттачи из почты в файл
8 сообщений из 8, страница 1 из 1
Perl - Сохранить аттачи из почты в файл
    #37837512
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть следующий код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
use strict;
use warnings;
use Mail::POP3Client;
use Email::MIME;
use Email::MIME::Attachment::Stripper;
...
my $pop = new Mail::POP3Client ...
my $count = $pop->Count();
for my $i (1 .. $count)
{
	my $msg = $pop->Retrieve($i);
	my $mail = Email::MIME->new($msg);
	my $stripper = Email::MIME::Attachment::Stripper->new($mail);
	my @attachments = $stripper->attachments;
	foreach my $file (grep {$_->{'content_type'} eq 'application/octet-stream'} @attachments)
	{
		if ($file->{'filename'} =~ m/(\d|\w)+\.dbf/i)
		{
			&log("- файл $file->{'filename'}",1,1);
			push @file, $file->{'filename'};
			open (FILE, '>', $file->{'filename'});
			print FILE $file->{'payload'};
			close(FILE);
		}
	}
}
$pop->Close();


Код сохраняет DBF-файлы, прикрепленные к письму.
Однако полученные файлы не читаются.
Если сравнить загруженный таким кодом файл с нормальным (читаемым), то видно, что при сохранении файла вместо 0x0A в файл пишется 0x0A,0x0D.
Подскажите, как сохранить правильно? Или если это баг модуля, какой модуль вместо него использовать?

Используется ActivePerl 5.14.2 на платформе Windows, поменять его нельзя.
Для работы с почтой хотелось бы оставить Mail::POP3Client (т.к. простой, работает с SSL и нет никаких кроссплатформенных особенностей).
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Perl - Сохранить аттачи из почты в файл
    #37837532
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос снимается.
Нужно было сохранять так:
Код: php
1.
2.
3.
open (FILE, '>:raw', $file->{'filename'});
print FILE $file->{'payload'};
close(FILE);
...
Рейтинг: 0 / 0
Perl - Сохранить аттачи из почты в файл
    #37839225
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Вообще-то binmode придумали именно для этого.
...
Рейтинг: 0 / 0
Perl - Сохранить аттачи из почты в файл
    #37900006
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вылезает непонятный глюк.
Есть такой код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
my $pop = new Mail::POP3Client;
my $msg = $pop->Retrieve($i);
my $mail = Email::MIME->new($msg);
my $stripper = Email::MIME::Attachment::Stripper->new($mail);
my @attachments = $stripper->attachments;
foreach my $file (grep {$_->{'content_type'} eq 'application/octet-stream'} @attachments)
{
	if ($file->{'filename'} =~ m/(\d|\w)+\.dbf/i)
	{
		open (FILE, '>', $file->{'filename'});
		binmode FILE;
		print FILE $file->{'payload'};
		close(FILE);
	}
}


Обычно код работает нормально, но иногда сохраненные им DBF-файлы из аттачей не читаются, потому что вместо 0x0A сохраняется 0x0D0A. Почему такое может быть?
...
Рейтинг: 0 / 0
Perl - Сохранить аттачи из почты в файл
    #37901447
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Возможно что binmode не стоит на самом миме. Это бывает. Попробуйте погуглить в сторону syswrite
...
Рейтинг: 0 / 0
Perl - Сохранить аттачи из почты в файл
    #37981247
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем ничего не помогает.
Время от времени (два-три раза в месяц) загруженные файлы нечитаемы, т.к. бинарный файл сохраняется как текстовый. Хотя если аттач сохранить из почтового клиента, то все читается.

Перепробовал разные варианты сохранения, результат не меняется:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#Загрузка файла
my $pop = new Mail::POP3Client(...);
my $msg = $pop->Retrieve($i);
my $mail = Email::MIME->new($msg);
my $stripper = Email::MIME::Attachment::Stripper->new($mail);
my @attachments = $stripper->attachments;
foreach my $file (grep {$_->{'content_type'} eq 'application/octet-stream'} @attachments)

#1. Сохранение, стандартный способ
open (FILE, '>', $file->{'filename'});
binmode FILE;
print FILE $file->{'payload'};
close(FILE);

#2. Сохранение, стандартный способ с указанием кодировки
open (FILE, '>:raw', $file->{'filename'});
binmode FILE;
print FILE $file->{'payload'};
close(FILE);

#3. Сохранение через syswrite
open (FILE, '>:raw', $file->{'filename'});
syswrite (FILE, $file->{'payload'});
close(FILE);
...
Рейтинг: 0 / 0
Perl - Сохранить аттачи из почты в файл
    #37986508
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Или бага в пакете Mail, или у вас приходят кривые данные, однако ваш почтовик сохраняет их правильно. Приведите воспроизводимый пример.
...
Рейтинг: 0 / 0
Perl - Сохранить аттачи из почты в файл
    #38021840
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример.
Из браузера сохраняется нормально, их скрипта при сохранении добавляет LF к CR.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
...
From: ...
To: ...
Subject: 
Date: Wed, 31 Oct 2012 19:00:07 +0400
MIME-Version: 1.0
Content-Type: multipart/mixed;
	boundary="----=_NextPart_000_00D0_01CDB799.F2722AA0"
X-Mailer: Microsoft Office Outlook, Build 11.0.6353
Thread-Index: Ac23eGqAsxSgg5K0SbGbga4hAoeimQ==
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157

This is a multi-part message in MIME format.

------=_NextPart_000_00D0_01CDB799.F2722AA0
Content-Type: multipart/alternative;
	boundary="----=_NextPart_001_00D1_01CDB799.F2722AA0"


------=_NextPart_001_00D1_01CDB799.F2722AA0
Content-Type: text/plain;
	charset="koi8-r"
Content-Transfer-Encoding: 7bit

 


------=_NextPart_001_00D1_01CDB799.F2722AA0
Content-Type: text/html;
	charset="koi8-r"
Content-Transfer-Encoding: quoted-printable

<html xmlns:o=3D"urn:schemas-microsoft-com:office:office" =
xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns=3D" http://www.w3.org/TR/REC-html40"> 

<head>
<meta http-equiv=3DContent-Type content=3D"text/html; charset=3Dkoi8-r">
<meta name=3DGenerator content=3D"Microsoft Word 11 (filtered medium)">
<style>
<!--
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0cm;
	margin-bottom:.0001pt;
	font-size:12.0pt;
	font-family:"Times New Roman";}
a:link, span.MsoHyperlink
	{color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{color:purple;
	text-decoration:underline;}
span.EmailStyle17
	{mso-style-type:personal-compose;
	font-family:Arial;
	color:windowtext;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.Section1
	{page:Section1;}
-->
</style>

</head>

<body lang=3DRU link=3Dblue vlink=3Dpurple>

<div class=3DSection1>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>

</div>

</body>

</html>

------=_NextPart_001_00D1_01CDB799.F2722AA0--

------=_NextPart_000_00D0_01CDB799.F2722AA0
Content-Type: application/octet-stream;
	name="01SK1031.dbf"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="01SK1031.dbf"

=03p=0A=
=1F=15=00=00=00=A1=001=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=
=00&=00=00DNUMLIC=00=00=00=00N=00=00=00=00=0A=
=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00SUMMA=00=00=00=00=00=00N=00=00=
=00=00=14=02=00=00=00=00=00=00=00=00=00=00=00=00=00=00DATA=00=00=00=00=00=
=00=00D=00=00=00=00=08=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00WHO=00=
=00=00=00=00=00=00=00N=00=00=00=00=0A=
=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=0D    1010218             =
1600.0020121031         7    1010453              450.0020121031         =
7    1012052              700.0020121031         7    1011848            =
  650.0020121031         7    1012374             1300.0020121031        =
 7    1011325              292.0020121031         7    1011858           =
   655.0020121031         7    1011308              120.0020121031       =
  7    1012120              700.0020121031         7    1012357          =
    700.0020121031         7    1011484             1900.0020121031      =
   7    1011372              650.0020121031         7    1011981         =
     600.0020121031         7    1011766              700.0020121031     =
    7    1012324             1000.0020121031         7    1011747        =
      700.0020121031         7    1011644              700.0020121031    =
     7    1012053              450.0020121031         7    1010750       =
       300.0020121031         7    1011688              450.0020121031   =
      7    1011571              700.0020121031         7=1A
------=_NextPart_000_00D0_01CDB799.F2722AA0--
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - Сохранить аттачи из почты в файл
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]