Отсылка письма средствами nnCron

Обсуждение программ nnCron и nnCron LITE

Re: Отсылка письма средствами nnCron

Postby Ilya » Wed, 29 Jul 2009, 23:14

AlikasS wrote:немного исправленный плагин, Илье на согласование
Code: Select all
.......... кусь ...........

M: Data&Attach
      ?DO
         I 57 ( 76 )
DUP 2* ALLOCATE THROW >R R@ base64 R> FREE DROP
.......... кусь ...........
;

^^^^^^^^ Ты вроде забыл write ?
Плагин обновляю - тестируем !
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: Отсылка письма средствами nnCron

Postby MAN » Thu, 30 Jul 2009, 07:31

Кодов столько, где же она - суперфинальная, ссылочку для однозначности плиз :)
User avatar
MAN
 
Posts: 145
Joined: Wed, 17 Jun 2009, 21:34

Re: Отсылка письма средствами nnCron

Postby Ilya » Thu, 30 Jul 2009, 09:16

MAN wrote:Кодов столько, где же она - суперфинальная, ссылочку для однозначности плиз :)

Где и положено ему быть
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: Отсылка письма средствами nnCron

Postby MAN » Thu, 30 Jul 2009, 10:56

Протестил с шифрованием логина и пароля , УСЁ ГУТ :!:
Last edited by MAN on Thu, 30 Jul 2009, 10:57, edited 1 time in total.
User avatar
MAN
 
Posts: 145
Joined: Wed, 17 Jun 2009, 21:34

Re: Отсылка письма средствами nnCron

Postby Vitaly_st » Thu, 30 Jul 2009, 10:57

Ilya wrote:
MAN wrote:Кодов столько, где же она - суперфинальная, ссылочку для однозначности плиз :)

Где и положено ему быть


:lol: не работает корректно этот вариант плагина у меня!

Отсылаемый файл 97875 байт, приходит - 92718 байт... сдуру стер работоспособный код... :cry:
Vitaly_st
 
Posts: 24
Joined: Fri, 17 Jul 2009, 10:54

Re: Отсылка письма средствами nnCron

Postby MAN » Thu, 30 Jul 2009, 11:00

И с файлом тоже УСЁ ГУТ :!:
User avatar
MAN
 
Posts: 145
Joined: Wed, 17 Jun 2009, 21:34

Re: Отсылка письма средствами nnCron

Postby Vitaly_st » Thu, 30 Jul 2009, 11:08

Vitaly_st wrote:
Ilya wrote:
MAN wrote:Кодов столько, где же она - суперфинальная, ссылочку для однозначности плиз :)

Где и положено ему быть


:lol: не работает корректно этот вариант плагина у меня!

Отсылаемый файл 97875 байт, приходит - 92718 байт... сдуру стер работоспособный код... :cry:


Не пойму, что делаю не так? Файл экселя никак не хочет приходить нормальным (а раньше ведь приходил!).
Я создал новый плагин, взял его отсюда viewtopic.php?f=23&t=9480#p20607 , далее - перегрузил nnCron, задачу составил так, как указано viewtopic.php?f=23&t=9480#p20607 , получил подтверждение отправки файла... получаю файл покореженный... :cry:
Vitaly_st
 
Posts: 24
Joined: Fri, 17 Jul 2009, 10:54

Re: Отсылка письма средствами nnCron

Postby Ilya » Thu, 30 Jul 2009, 18:59

Vitaly_st wrote:Не пойму, что делаю не так? Файл экселя никак не хочет приходить нормальным (а раньше ведь приходил!).
Я создал новый плагин, взял его отсюда viewtopic.php?f=23&t=9480#p20607 , далее - перегрузил nnCron, задачу составил так, как указано viewtopic.php?f=23&t=9480#p20607 , получил подтверждение отправки файла... получаю файл покореженный... :cry:

А ты попробуй отменить остальные Крон задачи и посмотреть что будет!
Только не забудь перегрузить Крон!!!
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: Отсылка письма средствами nnCron

Postby MAN » Thu, 30 Jul 2009, 20:04

2 Vitaly_st
послал твой файл сам себе - нон проблемос
ну и тебе тоже, проверяй :yawinkle:
User avatar
MAN
 
Posts: 145
Joined: Wed, 17 Jun 2009, 21:34

Re: Отсылка письма средствами nnCron

Postby AlikasS » Sun, 02 Aug 2009, 05:29

как опцию, еще бы отсылаемое/отосланное письмо надо сделать с сохранением в файл.
может например каталог для сохранения указывать,
а имя можно генерить автоматически (например дата-время).
так и до почтового клиента не далеко ;-)
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Отсылка письма средствами nnCron

Postby Ilya » Sat, 15 Aug 2009, 10:16

AlikasS wrote:как опцию, еще бы отсылаемое/отосланное письмо надо сделать с сохранением в файл.
может например каталог для сохранения указывать,
а имя можно генерить автоматически (например дата-время).
так и до почтового клиента не далеко ;-)

Специятельно для тебя ( пре-бета, тестил под СПФ-ом).
Предложения-пожелания!?
Code: Select all
\ smtp_nncron.f (адаптация под nnCron)
\ "Частичная" реализация протокола SMTP с возможностью аттача файлов

\ ADD-ATTACH ( adr n -- ) - Добавить путь к файлу в список

\ приоритеты письма
\ High-priority - высокий приоритет
\ Norm-priority - нормальный приоритет (по умолчанию)
\ Low-priority - низкий приоритет

\ подтверждения доставки и прочтения
\ Confirm-Reading - запрос подтверждения прочтения
\ Non-Confirm-Reading - нет запроса подтверждения прочтения (по умолчанию)

\ Confirm-Sending - запрос подтверждения доставки
\ Non-Confirm-Sending - нет запроса подтверждения доставки (по умолчанию)

\ адрес для обратного ответа установлен = адресу отправителя

\ установлен идентификатор почтовой программы

\ опционально, использование "условно-зашифрованного" логина в adr3-1 n3-1
\ для получения которого -> nncron.exe с ключом -ep <ваш_логин>
\ SECLOGINON \ SECLOGINOFF ( по умолчанию выключен)

\ опционально, использование "условно-зашифрованного" пароля в adr4 n4
\ для получения которого -> nncron.exe с ключом -ep <ваш_пароль>
\ SECPASSON \ SECPASSOFF ( по умолчанию выключен)


\ SMTP-SEND&ATTACH ( adr n adr1 n1 adr2 n2 adr3 n3 adr3-1 n3-1 adr4 n4 adr5 n5 -- err ) - собственно сама отправка

\ adr n     - содержимое письма
\ adr1 n1   - тема письма
\ adr2 n2   - кому!!!
\ adr3 n3   - от кого!!!
\ adr3-1 n3-1   - логин
\ adr4 n4   - пароль. Если пароль задать пустой строкой S" ", то аутентификация производится не будет (например для mail.ru)
\ adr5 n5   - адрес SMTP сервера
\ n6 - порт SMTP сервера
\ err       - 0 - зер гуд, иначе код ошибки
\ REQUIRE POP3 ~nn/lib/net/pop3.f
\ REQUIRE base64 ~nn/lib/base64.f
\ REQUIRE ONLYNAME ~nn/lib/filename.f
\ REQUIRE N>H ~nn/lib/num2s.f
\ REQUIRE AddNode ~nn/lib/list.f
\ REQUIRE DATE>S ~nn/lib/time.f
\ REQUIRE OPEN/CREATE-FILE ~nn/lib/file.f

: CUR-DAY/TIME>S ( -- a u)
     GET-CUR-TIME
     Year@
     Mon@
     Day@
     Hour@
     Min@
     Sec@

    <#
      S" .eml" HOLDS
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # # #
    #>
;
FALSE VALUE SMTPLOGF
FALSE VALUE SECLOGIN
\ Логирование вкл/выкл
: SMTPLOGON TRUE TO SMTPLOGF ;
: SMTPLOGOFF FALSE TO SMTPLOGF ;

: SECLOGINON TRUE TO SECLOGIN ;
: SECLOGINOFF FALSE TO SECLOGIN ;

FALSE VALUE SECPASS
: SECPASSON TRUE TO SECPASS ;
: SECPASSOFF FALSE TO SECPASS ;

3  VALUE X-Priority
: High-priority 2 TO X-Priority ;
: Norm-priority 3 TO X-Priority ;
: Low-priority 4 TO X-Priority ;

FALSE VALUE X-Confirm-Reading-To
: Confirm-Reading TRUE TO X-Confirm-Reading-To ;
: Non-Confirm-Reading FALSE TO X-Confirm-Reading-To ;

FALSE VALUE Return-Receipt-To
: Confirm-Sending TRUE TO Return-Receipt-To ;
: Non-Confirm-Sending FALSE TO Return-Receipt-To ;

VARIABLE attList    \ Указатель на список прикрепляемых файлов

\ Добавить путь к файлу в список
: ADD-ATTACH
        S>ZALLOC attList AddNode
;

: ?free ?DUP IF FREE THROW THEN ;

CREATE vName 255 ALLOT

CLASS: SMTP <SUPER POP3
        var vLogin
        var vFrom
        var vTo
        var vSubj
        var vData
        var vAttach
        var vErr
        var vFB
        var vlfh
        255 chars vBuf


DESTR: free
        vLogin @ ?free
        vFrom @ ?free
        vTo @ ?free
        vSubj @ ?free
        vlfh @ CLOSE-FILE THROW
        free
;

CONSTR: init
init
SMTPLOGF IF CUR-DAY/TIME>S R/W OPEN/CREATE-FILE THROW vlfh ! THEN
;
M: Connect
vPort @ 0= IF 25 vPort ! THEN
Connect
;

M: smtpOK?
read DROP 3 S>NUM DUP
200 399 WITHIN IF DROP TRUE ELSE vErr ! FALSE THEN
;
M: Hello ( -- flag ) S" HELO localhost" write smtpOK? ;
M: Ehlo ( -- flag ) S" EHLO localhost" write HERE 1024 Read DROP  ( smtpOK?) TRUE ;
M: Auth
S" AUTH LOGIN" write
read 2DROP
vLogin @ ASCIIZ>
SECLOGIN IF
        5 TO 64offset PAD debase64 2DUP + 0! 0 TO 64offset
THEN
HERE base64 write
read 2DROP
vPass @ ASCIIZ>
SECPASS IF
        5 TO 64offset PAD debase64 2DUP + 0! 0 TO 64offset
THEN
HERE base64 write
smtpOK?
;


M: Mail ( a n -- flag ) <# [CHAR] > HOLD vFrom @ ASCIIZ> HOLDS S" MAIL FROM: <" HOLDS 0#> write smtpOK? ;
M: Rcpt ( a n -- flag ) <# [CHAR] > HOLD vTo @ ASCIIZ> HOLDS S" RCPT TO: <" HOLDS 0#> write smtpOK? ;
M: write 2DUP SELF ->CLASS POP3 write SMTPLOGF IF vlfh @ WRITE-LINE THROW ELSE 2DROP THEN ;
M: sData ( adr n -- )   \ Начало передачи
S" DATA" write
smtpOK?
IF
        <# vFrom @ ASCIIZ> HOLDS S" From: " HOLDS 0#> write
        S" X-Priority: %X-Priority%" EVAL-SUBST write
        X-Confirm-Reading-To
IF
        <# vFrom @ ASCIIZ> HOLDS S" X-Confirm-Reading-To: " HOLDS 0#> write
        <# vFrom @ ASCIIZ> HOLDS S" Disposition-Notification-To: " HOLDS 0#> write
THEN

Return-Receipt-To
IF
        <# vFrom @ ASCIIZ> HOLDS S" Return-Receipt-To: " HOLDS 0#> write
THEN

\ S" X-Mailer: nncron.exe v %VERSION%" EVAL-SUBST write    \ Для nnCron`
<# VERSION 1000 / S>D # # [CHAR] . HOLD # S" X-Mailer: spf4.exe v: " HOLDS #> write
\ S" spf4.exe v" VERSION 1000 / 0 <# # # [CHAR] . HOLD # #> S+ 2DUP write DROP FREE THROW \ Для SPF4

<# vFrom @ ASCIIZ> HOLDS S" Reply-To: " HOLDS 0#> write

<# vTo @ ASCIIZ> HOLDS S" To: " HOLDS 0#> write
<# vSubj @ ASCIIZ> HOLDS S" Subject: " HOLDS 0#> write
S" MIME-Version: 1.0" write
S" Content-Type: multipart/mixed; boundary=%QUOTE%bounds1%QUOTE%" EVAL-SUBST write
S" --bounds1" write
S" Content-Type: text/plain; charset=windows-1251" write
S" Content-Transfer-Encoding: quoted-printable" write
WriteCRLF
OVER + SWAP
?DO
   S" =" Write
   I C@  N>H Write
LOOP
        WriteCRLF
ELSE 2DROP THEN
;

M: eData
S" --bounds1--" write
WriteCRLF S" ." write WriteCRLF
;

M: Data
sData eData
;

M: MyFILE \ { adr n -- }
  R/O OPEN-FILE-SHARED IF DROP S" " EXIT THEN  >R
  R@ FILE-SIZE THROW D>S DUP ALLOCATE THROW DUP vFB ! ( # a -- )
  DUP ROT R@ READ-FILE THROW
  R> CLOSE-FILE THROW
;

M: MyFILE-free
vFB @ ?DUP IF FREE THROW vFB 0! THEN
;


M: Data&Attach
sData
2DUP
ONLYNAME
vName ZPLACE
2DUP EXIST?
IF
        MyFILE
        S" --bounds1" write
        S" Content-Type: text/plain;" write
        S"  name=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        S" Content-transfer-encoding: base64" write
        S" Content-Disposition: attachment;" write
        S"  filename=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        WriteCRLF
        OVER + SWAP
        ?DO
                I 57 ( 76 )
                DUP 2* ALLOCATE THROW >R R@ base64 R> FREE DROP write
                57 ( 76 )
        +LOOP
ELSE 2DROP THEN

eData
MyFILE-free
;

M: _writeOneAttach
2DUP
ONLYNAME
vName ZPLACE
2DUP EXIST?
IF
        MyFILE
        S" --bounds1" write
        S" Content-Type: plain/text;" write
        S"  name=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        S" Content-transfer-encoding: base64" write
        S" Content-Disposition: attachment;" write
        S"  filename=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        WriteCRLF
        DUP ROT ROT
        OVER + SWAP
        ?DO
                DUP 57 ( 76 ) > IF I 57 ( 76 )  DUP 2* ALLOCATE THROW >R R@ base64 R> FREE DROP write ELSE I SWAP DUP 2* ALLOCATE THROW >R R@ base64 R> FREE DROP write LEAVE THEN
\         DUP 76 > IF I 76  vBuf base64 write ELSE I SWAP vBuf base64 write LEAVE THEN
\         DUP 76 > IF I 76  HERE base64 write ELSE I SWAP HERE base64 write LEAVE THEN
                57 ( 76 ) -
                57 ( 76 )
        +LOOP
ELSE 2DROP THEN
MyFILE-free
;

M: writeOneAttach NodeValue ASCIIZ> _writeOneAttach ;
M: free-node NodeValue FREE DROP ;

M: writeAttach
sData
   ['] writeOneAttach attList DoList
   ['] free-node attList DoList
   attList FreeList
eData
;

;CLASS


: SMTP-SEND&ATTACH { \ p -- }
SMTP NEW TO p

WITH SMTP
        p => vPort !
        p => Addr!
        p => Create
        S>ZALLOC p => vPass !
        S>ZALLOC p => vLogin !
        S>ZALLOC p => vFrom !
        S>ZALLOC p => vTo !
        S>ZALLOC p => vSubj !
        p => Connect
        p => read 2DROP
        p => vPass @ ASCIIZ> NIP
IF
        p => Ehlo
        p => Auth AND
ELSE
        p => Hello
THEN

IF
        p => Mail
        p => Rcpt
OR
IF p =>  writeAttach ELSE 2DROP 2DROP THEN
ELSE
    2DROP
THEN

        p => Logout
        p => vErr @
        p => Delete
ENDWITH
;
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: Отсылка письма средствами nnCron

Postby AlikasS » Sat, 15 Aug 2009, 16:48

пока особо не вникал,
письмо уходит нормально с вложением,
файл создается с именем
20090816003144.eml$TASK%[missed]%
и пустой.
позднее посмотрел, видимо надо кое-какие строки под крон менять.
P.S. в скором времени моими силами не получится
ибо отпуск дикарями (в том числе и без инета) начинается...
недельки этак через 2 вернусь
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Отсылка письма средствами nnCron

Postby Ilya » Wed, 19 Aug 2009, 00:49

AlikasS wrote:пока особо не вникал,
письмо уходит нормально с вложением,
файл создается с именем
20090816003144.eml$TASK%[missed]%
и пустой.
позднее посмотрел, видимо надо кое-какие строки под крон менять.
P.S. в скором времени моими силами не получится
ибо отпуск дикарями (в том числе и без инета) начинается...
недельки этак через 2 вернусь

Всё несколько проще:
Code: Select all
\ smtp_nncron.f (адаптация под nnCron)
\ "Частичная" реализация протокола SMTP с возможностью аттача файлов

\ ADD-ATTACH ( adr n -- ) - Добавить путь к файлу в список

\ приоритеты письма
\ High-priority - высокий приоритет
\ Norm-priority - нормальный приоритет (по умолчанию)
\ Low-priority - низкий приоритет

\ подтверждения доставки и прочтения
\ Confirm-Reading - запрос подтверждения прочтения
\ Non-Confirm-Reading - нет запроса подтверждения прочтения (по умолчанию)

\ Confirm-Sending - запрос подтверждения доставки
\ Non-Confirm-Sending - нет запроса подтверждения доставки (по умолчанию)

\ адрес для обратного ответа установлен = адресу отправителя

\ установлен идентификатор почтовой программы

\ опционально, использование "условно-зашифрованного" логина в adr3-1 n3-1
\ для получения которого -> nncron.exe с ключом -ep <ваш_логин>
\ SECLOGINON \ SECLOGINOFF ( по умолчанию выключен)

\ опционально, использование "условно-зашифрованного" пароля в adr4 n4
\ для получения которого -> nncron.exe с ключом -ep <ваш_пароль>
\ SECPASSON \ SECPASSOFF ( по умолчанию выключен)


\ SMTP-SEND&ATTACH ( adr n adr1 n1 adr2 n2 adr3 n3 adr3-1 n3-1 adr4 n4 adr5 n5 -- err ) - собственно сама отправка

\ adr n     - содержимое письма
\ adr1 n1   - тема письма
\ adr2 n2   - кому!!!
\ adr3 n3   - от кого!!!
\ adr3-1 n3-1   - логин
\ adr4 n4   - пароль. Если пароль задать пустой строкой S" ", то аутентификация производится не будет (например для mail.ru)
\ adr5 n5   - адрес SMTP сервера
\ n6 - порт SMTP сервера
\ err       - 0 - зер гуд, иначе код ошибки


: CUR-DAY/TIME>S ( -- a u)
     GET-CUR-TIME
     Year@
     Mon@
     Day@
     Hour@
     Min@
     Sec@

    <#
        0 HOLD
      S" .eml" HOLDS
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # # #
 \      ModuleDirName HOLDS
    #>
;
FALSE VALUE SMTPLOGF
FALSE VALUE SECLOGIN
\ Логирование вкл/выкл
: SMTPLOGON TRUE TO SMTPLOGF ;
: SMTPLOGOFF FALSE TO SMTPLOGF ;

: SECLOGINON TRUE TO SECLOGIN ;
: SECLOGINOFF FALSE TO SECLOGIN ;

FALSE VALUE SECPASS
: SECPASSON TRUE TO SECPASS ;
: SECPASSOFF FALSE TO SECPASS ;

3  VALUE X-Priority
: High-priority 2 TO X-Priority ;
: Norm-priority 3 TO X-Priority ;
: Low-priority 4 TO X-Priority ;

FALSE VALUE X-Confirm-Reading-To
: Confirm-Reading TRUE TO X-Confirm-Reading-To ;
: Non-Confirm-Reading FALSE TO X-Confirm-Reading-To ;

FALSE VALUE Return-Receipt-To
: Confirm-Sending TRUE TO Return-Receipt-To ;
: Non-Confirm-Sending FALSE TO Return-Receipt-To ;

VARIABLE attList    \ Указатель на список прикрепляемых файлов

\ Добавить путь к файлу в список
: ADD-ATTACH
        S>ZALLOC attList AddNode
;

: ?free ?DUP IF FREE THROW THEN ;

CREATE vName 255 ALLOT

CLASS: SMTP <SUPER POP3
        var vLogin
        var vFrom
        var vTo
        var vSubj
        var vData
        var vAttach
        var vErr
        var vFB
        var vlfh
        255 chars vBuf


DESTR: free
        vLogin @ ?free
        vFrom @ ?free
        vTo @ ?free
        vSubj @ ?free
        vlfh @ CLOSE-FILE THROW
        free
;

CONSTR: init
init
SMTPLOGF IF CUR-DAY/TIME>S R/W CREATE-FILE THROW vlfh ! THEN
;
M: Connect
vPort @ 0= IF 25 vPort ! THEN
Connect
;

M: smtpOK?
read DROP 3 S>NUM DUP
200 399 WITHIN IF DROP TRUE ELSE vErr ! FALSE THEN
;
M: Hello ( -- flag ) S" HELO localhost" write smtpOK? ;
M: Ehlo ( -- flag ) S" EHLO localhost" write HERE 1024 Read DROP  ( smtpOK?) TRUE ;
M: Auth
S" AUTH LOGIN" write
read 2DROP
vLogin @ ASCIIZ>
SECLOGIN IF
        5 TO 64offset PAD debase64 2DUP + 0! 0 TO 64offset
THEN
HERE base64 write
read 2DROP
vPass @ ASCIIZ>
SECPASS IF
        5 TO 64offset PAD debase64 2DUP + 0! 0 TO 64offset
THEN
HERE base64 write
smtpOK?
;


M: Mail ( a n -- flag ) <# [CHAR] > HOLD vFrom @ ASCIIZ> HOLDS S" MAIL FROM: <" HOLDS 0#> write smtpOK? ;
M: Rcpt ( a n -- flag ) <# [CHAR] > HOLD vTo @ ASCIIZ> HOLDS S" RCPT TO: <" HOLDS 0#> write smtpOK? ;
M: write 2DUP SELF ->CLASS POP3 write SMTPLOGF IF vlfh @ WRITE-LINE THROW ELSE 2DROP THEN ;
M: sData ( adr n -- )   \ Начало передачи
S" DATA" write
smtpOK?
IF
        <# vFrom @ ASCIIZ> HOLDS S" From: " HOLDS 0#> write
        S" X-Priority: %X-Priority%" EVAL-SUBST write
        X-Confirm-Reading-To
IF
        <# vFrom @ ASCIIZ> HOLDS S" X-Confirm-Reading-To: " HOLDS 0#> write
        <# vFrom @ ASCIIZ> HOLDS S" Disposition-Notification-To: " HOLDS 0#> write
THEN

Return-Receipt-To
IF
        <# vFrom @ ASCIIZ> HOLDS S" Return-Receipt-To: " HOLDS 0#> write
THEN

\ S" X-Mailer: nncron.exe v %VERSION%" EVAL-SUBST write    \ Для nnCron`
<# VERSION 1000 / S>D # # [CHAR] . HOLD # S" X-Mailer: spf4.exe v: " HOLDS #> write
\ S" spf4.exe v" VERSION 1000 / 0 <# # # [CHAR] . HOLD # #> S+ 2DUP write DROP FREE THROW \ Для SPF4

<# vFrom @ ASCIIZ> HOLDS S" Reply-To: " HOLDS 0#> write

<# vTo @ ASCIIZ> HOLDS S" To: " HOLDS 0#> write
<# vSubj @ ASCIIZ> HOLDS S" Subject: " HOLDS 0#> write
S" MIME-Version: 1.0" write
S" Content-Type: multipart/mixed; boundary=%QUOTE%bounds1%QUOTE%" EVAL-SUBST write
S" --bounds1" write
S" Content-Type: text/plain; charset=windows-1251" write
S" Content-Transfer-Encoding: quoted-printable" write
WriteCRLF
OVER + SWAP
?DO
   S" =" Write
   I C@  N>H Write
LOOP
        WriteCRLF
ELSE 2DROP THEN
;

M: eData
S" --bounds1--" write
WriteCRLF S" ." write WriteCRLF
;

M: Data
sData eData
;

M: MyFILE \ { adr n -- }
  R/O OPEN-FILE-SHARED IF DROP S" " EXIT THEN  >R
  R@ FILE-SIZE THROW D>S DUP ALLOCATE THROW DUP vFB ! ( # a -- )
  DUP ROT R@ READ-FILE THROW
  R> CLOSE-FILE THROW
;

M: MyFILE-free
vFB @ ?DUP IF FREE THROW vFB 0! THEN
;


M: Data&Attach
sData
2DUP
ONLYNAME
vName ZPLACE
2DUP EXIST?
IF
        MyFILE
        S" --bounds1" write
        S" Content-Type: text/plain;" write
        S"  name=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        S" Content-transfer-encoding: base64" write
        S" Content-Disposition: attachment;" write
        S"  filename=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        WriteCRLF
        OVER + SWAP
        ?DO
                I 57 ( 76 )
                DUP 2* ALLOCATE THROW >R R@ base64 R> FREE DROP write
                57 ( 76 )
        +LOOP
ELSE 2DROP THEN

eData
MyFILE-free
;

M: _writeOneAttach
2DUP
ONLYNAME
vName ZPLACE
2DUP EXIST?
IF
        MyFILE
        S" --bounds1" write
        S" Content-Type: plain/text;" write
        S"  name=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        S" Content-transfer-encoding: base64" write
        S" Content-Disposition: attachment;" write
        S"  filename=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        WriteCRLF
        DUP ROT ROT
        OVER + SWAP
        ?DO
                DUP 57 ( 76 ) > IF I 57 ( 76 )  DUP 2* ALLOCATE THROW >R R@ base64 R> FREE DROP write ELSE I SWAP DUP 2* ALLOCATE THROW >R R@ base64 R> FREE DROP write LEAVE THEN
\         DUP 76 > IF I 76  vBuf base64 write ELSE I SWAP vBuf base64 write LEAVE THEN
\         DUP 76 > IF I 76  HERE base64 write ELSE I SWAP HERE base64 write LEAVE THEN
                57 ( 76 ) -
                57 ( 76 )
        +LOOP
ELSE 2DROP THEN
MyFILE-free
;

M: writeOneAttach NodeValue ASCIIZ> _writeOneAttach ;
M: free-node NodeValue FREE DROP ;

M: writeAttach
sData
   ['] writeOneAttach attList DoList
   ['] free-node attList DoList
   attList FreeList
eData
;

;CLASS


: SMTP-SEND&ATTACH { \ p -- }
SMTP NEW TO p

WITH SMTP
        p => vPort !
        p => Addr!
        p => Create
        S>ZALLOC p => vPass !
        S>ZALLOC p => vLogin !
        S>ZALLOC p => vFrom !
        S>ZALLOC p => vTo !
        S>ZALLOC p => vSubj !
        p => Connect
        p => read 2DROP
        p => vPass @ ASCIIZ> NIP
IF
        p => Ehlo
        p => Auth AND
ELSE
        p => Hello
THEN

IF
        p => Mail
        p => Rcpt
OR
IF p =>  writeAttach ELSE 2DROP 2DROP THEN
ELSE
    2DROP
THEN

        p => Logout
        p => vErr @
        p => Delete
ENDWITH
;
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: Отсылка письма средствами nnCron

Postby Ilya » Thu, 27 Aug 2009, 16:50

Более стабильная/правильная версия!
Code: Select all
\ smtp_nncron.f (адаптация под nnCron)
\ "Частичная" реализация протокола SMTP с возможностью аттача файлов

\ ADD-ATTACH ( adr n -- ) - Добавить путь к файлу в список

\ приоритеты письма
\ High-priority - высокий приоритет
\ Norm-priority - нормальный приоритет (по умолчанию)
\ Low-priority - низкий приоритет

\ подтверждения доставки и прочтения
\ Confirm-Reading - запрос подтверждения прочтения
\ Non-Confirm-Reading - нет запроса подтверждения прочтения (по умолчанию)

\ Confirm-Sending - запрос подтверждения доставки
\ Non-Confirm-Sending - нет запроса подтверждения доставки (по умолчанию)

\ адрес для обратного ответа установлен = адресу отправителя

\ установлен идентификатор почтовой программы

\ опционально, использование "условно-зашифрованного" логина в adr3-1 n3-1
\ для получения которого -> nncron.exe с ключом -ep <ваш_логин>
\ SECLOGINON \ SECLOGINOFF ( по умолчанию выключен)

\ опционально, использование "условно-зашифрованного" пароля в adr4 n4
\ для получения которого -> nncron.exe с ключом -ep <ваш_пароль>
\ SECPASSON \ SECPASSOFF ( по умолчанию выключен)


\ SMTP-SEND&ATTACH ( adr n adr1 n1 adr2 n2 adr3 n3 adr3-1 n3-1 adr4 n4 adr5 n5 -- err ) - собственно сама отправка

\ adr n     - содержимое письма
\ adr1 n1   - тема письма
\ adr2 n2   - кому!!!
\ adr3 n3   - от кого!!!
\ adr3-1 n3-1   - логин
\ adr4 n4   - пароль. Если пароль задать пустой строкой S" ", то аутентификация производится не будет (например для mail.ru)
\ adr5 n5   - адрес SMTP сервера
\ n6 - порт SMTP сервера
\ err       - 0 - зер гуд, иначе код ошибки


: CUR-DAY/TIME>S ( -- a u)
     GET-CUR-TIME
     Year@
     Mon@
     Day@
     Hour@
     Min@
     Sec@

    <#
       0 HOLD
       S" .eml" HOLDS
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # 2DROP
       S>D # # # #
\       ModuleDirName HOLDS
    #>
;

FALSE VALUE SMTPLOGF
FALSE VALUE SECLOGIN

\ Логирование вкл/выкл
: SMTPLOGON TRUE TO SMTPLOGF ;
: SMTPLOGOFF FALSE TO SMTPLOGF ;


: SECLOGINON TRUE TO SECLOGIN ;
: SECLOGINOFF FALSE TO SECLOGIN ;

FALSE VALUE SECPASS
: SECPASSON TRUE TO SECPASS ;
: SECPASSOFF FALSE TO SECPASS ;

3  VALUE X-Priority
: High-priority 2 TO X-Priority ;
: Norm-priority 3 TO X-Priority ;
: Low-priority 4 TO X-Priority ;

FALSE VALUE X-Confirm-Reading-To
: Confirm-Reading TRUE TO X-Confirm-Reading-To ;
: Non-Confirm-Reading FALSE TO X-Confirm-Reading-To ;

FALSE VALUE Return-Receipt-To
: Confirm-Sending TRUE TO Return-Receipt-To ;
: Non-Confirm-Sending FALSE TO Return-Receipt-To ;

VARIABLE attList    \ Указатель на список прикрепляемых файлов

\ Добавить путь к файлу в список
: ADD-ATTACH
        S>ZALLOC attList AddNode
;



: ?free ?DUP IF FREE THROW THEN ;

CREATE vName 255 ALLOT

CLASS: SMTP <SUPER POP3
        var vLogin
        var vFrom
        var vTo
        var vSubj
        var vData
        var vAttach
        var vErr
        var vFB
        var vlfh
        255 chars vBuf


DESTR: free
        vLogin @ ?free
        vFrom @ ?free
        vTo @ ?free
        vSubj @ ?free
        vlfh @ CLOSE-FILE THROW
        free
;

CONSTR: init
init
SMTPLOGF IF CUR-DAY/TIME>S R/W CREATE-FILE THROW vlfh ! THEN
;
M: Connect
vPort @ 0= IF 25 vPort ! THEN
Connect
;

M: smtpOK?
read DROP 3 S>NUM DUP
200 399 WITHIN IF DROP TRUE ELSE vErr ! FALSE THEN
;
M: Hello ( -- flag ) S" HELO localhost" write smtpOK? ;
M: Ehlo ( -- flag ) S" EHLO localhost" write HERE 1024 Read DROP  ( smtpOK?) TRUE ;
M: Auth ( -- flag )
S" AUTH LOGIN" write
read 2DROP
vLogin @ ASCIIZ>
SECLOGIN IF
        5 TO 64offset PAD debase64 2DUP + 0! 0 TO 64offset
THEN
HERE base64 write
read 2DROP
vPass @ ASCIIZ>
SECPASS IF
        5 TO 64offset PAD debase64 2DUP + 0! 0 TO 64offset
THEN
HERE base64 write
smtpOK?
;


M: Mail ( a n -- flag ) <# [CHAR] > HOLD vFrom @ ASCIIZ> HOLDS S" MAIL FROM: <" HOLDS 0#> write smtpOK? ;
M: Rcpt ( a n -- flag ) <# [CHAR] > HOLD vTo @ ASCIIZ> HOLDS S" RCPT TO: <" HOLDS 0#> write smtpOK? ;
M: write 2DUP SELF ->CLASS POP3 write SMTPLOGF IF vlfh @ WRITE-LINE THROW ELSE 2DROP THEN ;
M: sData ( adr n -- )   \ Начало передачи
S" DATA" write
smtpOK?
IF
        <# vFrom @ ASCIIZ> HOLDS S" From: " HOLDS 0#> write
        S" X-Priority: %X-Priority%" EVAL-SUBST write
        X-Confirm-Reading-To
        IF
                <# vFrom @ ASCIIZ> HOLDS S" X-Confirm-Reading-To: " HOLDS 0#> write
                <# vFrom @ ASCIIZ> HOLDS S" Disposition-Notification-To: " HOLDS 0#> write
        THEN

        Return-Receipt-To
        IF
                <# vFrom @ ASCIIZ> HOLDS S" Return-Receipt-To: " HOLDS 0#> write
        THEN

S" X-Mailer: nncron.exe v %VERSION%" EVAL-SUBST write    \ Для nnCron`
\ <# VERSION 1000 / S>D # # [CHAR] . HOLD # S" X-Mailer: spf4.exe v: " HOLDS #> write \ Для SPF4


<# vFrom @ ASCIIZ> HOLDS S" Reply-To: " HOLDS 0#> write

<# vTo @ ASCIIZ> HOLDS S" To: " HOLDS 0#> write
<# vSubj @ ASCIIZ> HOLDS S" Subject: " HOLDS 0#> write
S" MIME-Version: 1.0" write
S" Content-Type: multipart/mixed; boundary=%QUOTE%bounds1%QUOTE%" EVAL-SUBST write
S" --bounds1" write
S" Content-Type: text/plain; charset=windows-1251" write
S" Content-Transfer-Encoding: quoted-printable" write
SELF ->CLASS Socket WriteCRLF

OVER + SWAP
?DO
   S" =" SELF ->CLASS Socket Write
   I C@  N>H SELF ->CLASS Socket Write
LOOP
        SELF ->CLASS Socket WriteCRLF
ELSE 2DROP THEN
;

M: eData
S" --bounds1--" write
SELF ->CLASS Socket WriteCRLF S" ." write SELF ->CLASS Socket WriteCRLF
;

M: Data
sData eData
;

M: MyFILE \ { adr n -- }
  R/O OPEN-FILE-SHARED IF DROP S" " EXIT THEN  >R
  R@ FILE-SIZE THROW D>S DUP ALLOCATE THROW DUP vFB ! ( # a -- )
  DUP ROT R@ READ-FILE THROW
  R> CLOSE-FILE THROW
;

M: MyFILE-free
vFB @ ?DUP IF FREE THROW vFB 0! THEN
;


M: Data&Attach
sData
2DUP
ONLYNAME
vName ZPLACE
2DUP EXIST?
IF
        MyFILE
        S" --bounds1" write
        S" Content-Type: text/plain;" write
        S"  name=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        S" Content-transfer-encoding: base64" write
        S" Content-Disposition: attachment;" write
        S"  filename=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        SELF ->CLASS Socket WriteCRLF
        OVER + SWAP
        ?DO
                I 57 ( 76 )
                DUP 2* ALLOCATE THROW >R R@ base64 R> FREE DROP write
                57 ( 76 )
        +LOOP
ELSE 2DROP THEN

eData
MyFILE-free
;

M: _writeOneAttach
2DUP
ONLYNAME
vName ZPLACE
2DUP EXIST?
IF
        MyFILE
        S" --bounds1" write
        S" Content-Type: plain/text;" write
        S"  name=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        S" Content-transfer-encoding: base64" write
        S" Content-Disposition: attachment;" write
        S"  filename=%QUOTE%%vName ASCIIZ>%%QUOTE%" EVAL-SUBST write
        SELF ->CLASS Socket WriteCRLF
        DUP ROT ROT
        OVER + SWAP
        ?DO
                DUP 57 ( 76 ) > IF I 57 ( 76 )  DUP 2* ALLOCATE THROW >R R@ base64 R> FREE DROP write ELSE I SWAP DUP 2* ALLOCATE THROW >R R@ base64 R> FREE DROP write LEAVE THEN
\         DUP 76 > IF I 76  vBuf base64 write ELSE I SWAP vBuf base64 write LEAVE THEN
\         DUP 76 > IF I 76  HERE base64 write ELSE I SWAP HERE base64 write LEAVE THEN
                57 ( 76 ) -
                57 ( 76 )
        +LOOP
ELSE 2DROP THEN
MyFILE-free
;

M: writeOneAttach NodeValue ASCIIZ> _writeOneAttach ;
M: free-node NodeValue FREE DROP ;

M: writeAttach
sData
   ['] writeOneAttach attList DoList
   ['] free-node attList DoList
   attList FreeList
eData
;

;CLASS



: SMTP-SEND&ATTACH { \ p -- }
SMTP NEW TO p

WITH SMTP
        p => vPort !
        p => Addr!
        S>ZALLOC p => vPass !
        S>ZALLOC p => vLogin !
        S>ZALLOC p => vFrom !
        S>ZALLOC p => vTo !
        S>ZALLOC p => vSubj !
[NONAME
        p => Create
        p => Connect
        p => read 2DROP
        p => vPass @ ASCIIZ> NIP
IF
        p => Ehlo
        p => Auth AND
ELSE
        p => Hello
THEN

IF
        p => Mail
        p => Rcpt
OR
IF p =>  writeAttach ELSE 2DROP 2DROP THEN
ELSE
    2DROP
THEN
NONAME] CATCH ?DUP IF p => vErr ! THEN
        p => Logout
        p => vErr @
        p => Delete
ENDWITH
;

Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: Отсылка письма средствами nnCron

Postby AlikasS » Fri, 28 Aug 2009, 18:38

P.S. ближайший тест думаю не раньше среды, сорри, еще не на "рабочем" режиме
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests

cron