Что нового

[Сеть, интернет] Скрипт для приема почты с POP3 сервера. Примеры и решения типичных задач

w3d

Чайник
Сообщения
84
Репутация
3
Никто не сталкивался с такой задачей:
- принять почту с POP3 ящика
- извлечь вложения в отдельную папку
?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: Работа с электропочтой

Предупреждение
1. Тема не информативна
2. Идей нет вообще? Если какие-то были, в чем случился затык? Есть кусок (не)работоспособного кода?
 
Автор
W

w3d

Чайник
Сообщения
84
Репутация
3
Re: Работа с электропочтой

Kaster
Тему можно удалить.
Хотел просто узнать не делал ли кто подобного.
Если возникнут конкретные вопросы - создам новую тему.
 

timsky

Осваивающий
Сообщения
93
Репутация
28
Re: Работа с электропочтой

w3d
ЗАчем удалять? Делись наработками :smile:
Мне скоро подобное понадобится, еще даже не ковырял эту тему.
 
Автор
W

w3d

Чайник
Сообщения
84
Репутация
3
Re: Работа с электропочтой

Для автоматическог приема и выдергивания вложений я вообще-то использую getmail.exe
Но наткнулся на траблу - не воспринимаются (не раскодируются) русские названия вложений.
А наработки и искал сам ))
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
w3d
Если тема с русскими буквами во вложении интересна, могу подкинуть идеи. например,
=XX - озночает что нужно брать BinaryToString(XX) - для правильного отображения буквы
 
Автор
W

w3d

Чайник
Сообщения
84
Репутация
3
Kaster
Имя вложения в письме идет в таком виде:
Content-Disposition: attachment;
filename="=?koi8-r?Q?=F3=D0=2E=D2=C1=D3=D3=D9=CC=5F15027=2E?=
=?koi8-r?Q?doc?="

соответственно файл извлекается с именем
=?koi8-r?Q?=F3=D0=2E=D2=C1=D3=D3=D9=CC=5F15027=2E?=
=?koi8-r?Q?doc?=
что жутко неудобно
 

ASPID

Чайник
Сообщения
1
Репутация
1
Для решения этой задачи пользуюсь zerat.exe,
http://ironfist.at.tut.by/zeratrus.htm

Код:
$line=$Zerat & " pop3host:" & $server & " user:" & $user & " pass:" & $pass & " EXTRACT:YES LOCALDIR:" & $InTmp & $option
$tmp=Run($line, $DPrg, @SW_HIDE, $STDERR_MERGED)
WaitRun($tmp)

Func WaitRun($pid)
	Local $tmpout	
	Local $return=0
	While 1
		$tmpout = StdoutRead($pid)
		IF @error Then ExitLoop
		IF $tmpout <> "" And $Debug>0 Then LogDebug($tmpout)
	Wend
	If ProcessWaitClose($pid,120)==0 Then Logging($subj & " Timeout")
	Return $return
EndFunc
однако столкнулся с траблом когда цикл While 1 StdoutRead Wend висит в ожидании консольного вывода.
Решение пока на знаю, столкнулся с этим траблом только 2003 Server R2, ошибка возникает 1 раз на >100 запусков. Удачи.

-------------------------------------
 
Автор
W

w3d

Чайник
Сообщения
84
Репутация
3
он не бесплатный.
и guiz.exe там с трояном
 

Latoid

Новичок
Сообщения
95
Репутация
11
Kaster сказал(а):
w3d
Если тема с русскими буквами во вложении интересна, могу подкинуть идеи. например,
=XX - озночает что нужно брать BinaryToString(XX) - для правильного отображения буквы
Можно для особо одаренных привести всё-таки пример кода, что превратит вот эту строку filename="=?koi8-r?Q?=F3=D0=2E=D2=C1=D3=D3=D9=CC=5F15027=2E?=
=?koi8-r?Q?doc?="
во что-нибудь читаемое? Не получается у меня (

А по сабжу - есть же UDF соотвествующая Она всё делает что надо
Аттачи выдираются регэкспом и превращаются в первозданный вид функцией _Base64Decode из вот этой UDF
Единственная проблема для меня -получить кириллическое имя аттача
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Latoid

Если название аттача на русском, то сообщение приходит в виде
Код:
=?koi8-r?Q?=F3=D0=2E=D2=C1=D3=D3=D9=CC=5F?=
Это означает что название в кодировке KOI8-R, а коды символов хранятся в 16-ом виде между знаками "=". То есть, надо из название убрать кусок - "=?koi8-r?Q?=", у остатка удалить все знаки "=", а после перекодировать в ту кодировку что надо, например выложенным тобой, Latoid, декодером вот тут
http://autoit-script.ru/index.php/topic,710.msg4884.html#msg4884
вот кусок кода
Код:
$name = '=?koi8-r?Q?=F3=D0=2E=D2=C1=D3=D3=D9=CC=5F'
$name = StringReplace($name, '=?koi8-r?Q?', '')
$name = StringReplace($name, '=', '')
$name = BinaryToString('0x' & $name)

MsgBox(0, '', _KOI2WIN($name))

Func _KOI2WIN($String)
    Local $sResult = "", $iCode
    Local $VarKOIArr = StringSplit($String, "")
    For $i = 1 To $VarKOIArr[0]
        $iCode = Asc($VarKOIArr[$i])
        Select
            Case $iCode = 63
                $VarKOIArr[$i] = Chr (185)
            Case $iCode = 163
                $VarKOIArr[$i] = Chr (184)
            Case $iCode = 179
                $VarKOIArr[$i] = Chr (168)
            Case $iCode >= 233 And $iCode <= 240
                $VarKOIArr[$i] = Chr ($iCode - 33)
            Case $iCode >= 242 And $iCode <= 245
                $VarKOIArr[$i] = Chr ($iCode - 34)
            Case $iCode >= 201 And $iCode <= 208
                $VarKOIArr[$i] = Chr ($iCode + 31)
            Case $iCode >= 210 And $iCode <= 213
                $VarKOIArr[$i] = Chr ($iCode + 30)
            Case $iCode >= 225 And $iCode <= 226
                $VarKOIArr[$i] = Chr ($iCode - 33)
            Case $iCode >= 228 And $iCode <= 229
                $VarKOIArr[$i] = Chr ($iCode - 32)
            Case $iCode >= 193 And $iCode <= 194
                $VarKOIArr[$i] = Chr ($iCode + 31)
            Case $iCode = 247
                $VarKOIArr[$i] = Chr (194)
            Case $iCode = 231
                $VarKOIArr[$i] = Chr (195)
            Case $iCode = 246
                $VarKOIArr[$i] = Chr (198)
            Case $iCode = 250
                $VarKOIArr[$i] = Chr (199)
            Case $iCode = 230
                $VarKOIArr[$i] = Chr (212)
            Case $iCode = 232
                $VarKOIArr[$i] = Chr (213)
            Case $iCode = 227
                $VarKOIArr[$i] = Chr (214)
            Case $iCode = 254
                $VarKOIArr[$i] = Chr (215)
            Case $iCode = 251
                $VarKOIArr[$i] = Chr (216)
            Case $iCode = 253
                $VarKOIArr[$i] = Chr (217)
            Case $iCode = 255
                $VarKOIArr[$i] = Chr (218)
            Case $iCode = 249
                $VarKOIArr[$i] = Chr (219)
            Case $iCode = 248
                $VarKOIArr[$i] = Chr (220)
            Case $iCode = 252
                $VarKOIArr[$i] = Chr (221)
            Case $iCode = 224
                $VarKOIArr[$i] = Chr (222)
            Case $iCode = 241
                $VarKOIArr[$i] = Chr (223)
            Case $iCode = 215
                $VarKOIArr[$i] = Chr (226)
            Case $iCode = 199
                $VarKOIArr[$i] = Chr (227)
            Case $iCode = 196
                $VarKOIArr[$i] = Chr (228)
            Case $iCode = 197
                $VarKOIArr[$i] = Chr (229)
            Case $iCode = 214
                $VarKOIArr[$i] = Chr (230)
            Case $iCode = 218
                $VarKOIArr[$i] = Chr (231)
            Case $iCode = 198
                $VarKOIArr[$i] = Chr (244)
            Case $iCode = 200
                $VarKOIArr[$i] = Chr (245)
            Case $iCode = 195
                $VarKOIArr[$i] = Chr (246)
            Case $iCode = 222
                $VarKOIArr[$i] = Chr (247)
            Case $iCode = 219
                $VarKOIArr[$i] = Chr (248)
            Case $iCode = 221
                $VarKOIArr[$i] = Chr (249)
            Case $iCode = 223
                $VarKOIArr[$i] = Chr (250)
            Case $iCode = 217
                $VarKOIArr[$i] = Chr (251)
            Case $iCode = 216
                $VarKOIArr[$i] = Chr (252)
            Case $iCode = 220
                $VarKOIArr[$i] = Chr (253)
            Case $iCode = 192
                $VarKOIArr[$i] = Chr (254)
            Case $iCode = 209
                $VarKOIArr[$i] = Chr (255)
        EndSelect
        $sResult &= $VarKOIArr[$i]
    Next
    Return $sResult
EndFunc ; _KOI2WIN

аналогично с любой другой кодировкой, которая указывается в начале названия
 

Latoid

Новичок
Сообщения
95
Репутация
11
Спасибо!
Функцию ту специально для этого случая писал. Знал, что пригодится )
 

Latoid

Новичок
Сообщения
95
Репутация
11
Kaster
А вот с такой строкой можно что-нибудь сделать?
=?UTF-8?B?UkU6UmU6INC/0YDQuNCy0LXRgiEgOik=?=
 

Latoid

Новичок
Сообщения
95
Репутация
11
Сам себе отвечаю - это base64. О чем, наверное, можно было раньше догадаться по букве ?B? Так что убираем в начале =?UTF-8?B? и в конце ?=, а дальше - _Base64Decode из этой UDF
 
Верх