近日有這樣的需求

收到的傳真, 希望自動發送到固定的 email, 成本是, 傳真電話線, 現有的 WINDOWS PC 加上網路, 不要應用市售的產品.

所以 GOOGLE 了一下, 看看有沒有公開的源碼.
看到了以下 http://win32assembly.online.fr/source1.html
其中有一個 SMSAgent, 裡面有基本 SMTP 發送 email 的方法.

源碼有了可參考, 下一步要找工具, 把源碼變成 XP 可以執行的 EXE. 看到以下免費的工具 MASM32, 可以下載, http://www.masm32.com/, 10年不見, 已經從 6.0 改版到了 10.0

自己新增了一個 BAT, 方便把源碼生出 EXE, 名為 makeit.bat, 內容如下

-------------------------
@echo off

if not exist rsrc.rc goto over1
D:\masm32\bin\RC.EXE /v rsrc.rc
D:\masm32\bin\CVTRES.EXE /machine:ix86 rsrc.res
:over1

if exist %1.obj del SMSAgent.obj
if exist %1.exe del SMSAgent.exe

D:\masm32\bin\ML.EXE /c /coff SMSAgent.asm
if errorlevel 1 goto errasm

if not exist rsrc.obj goto nores

D:\masm32\bin\LINK.EXE /SUBSYSTEM:WINDOWS SMSAgent.obj rsrc.obj
if errorlevel 1 goto errlink

rem dir win32asm
goto TheEnd

:nores
D:\masm32\bin\LINK.EXE /SUBSYSTEM:WINDOWS SMSAgent.obj
if errorlevel 1 goto errlink
dir %1
goto TheEnd

:errlink
echo _
echo Link error
goto TheEnd

:errasm
echo _
echo Assembly Error
goto TheEnd

:TheEnd

pause

-------------------------


另外一個要修改的地方是 rscr.rc 的第一行 -
#include "e:\masm32\include\resource.h"

因為俺的 masm32 是放在 D DRIVE 裡面, 所以改成這樣 -
#include "d:\masm32\include\resource.h"

完成以後, 快速地點兩下 makeit.bat, SMSAgent.exe 產生了, 證明源碼沒有錯誤, 編譯也成功, 下一步就是看看怎樣修修改改, 達到目的. 沒有別的, 自己開發的小工具, 精巧實用, 邊玩邊學. 工具有了, 再來看看有沒有更接近俺目標的公開源碼, 看到這個祖國同胞的解說, 好像更接近了.

http://www.luocong.com/articles/show_article.asp?Article_ID=21

再來, 實驗編譯是否成功, 確認過, 改改 make.bat, 配合一下自己電腦的設定環境就好了. 下面兩個問題, 原文的注解, 或是源碼裡面的資料都是簡體版, 台灣版的電腦看出來是古怪的符號, 所以先翻譯兩個文件, 方便比對.

第一個, read.txt, 翻譯前看到亂碼, 翻譯後的BIG5碼文字如下 -

---------------------------------


                ╭═══════════════╮
                ║                              ║
  ╭══════┤            原創文檔        ├══════╮
  ║            ║                              ║            ║
  ║            ╰═══════════════╯            ║
 ║                                                          ║
 ║                     老羅的繽紛天地                      ║
  ║                http://www.luocong.com              ║
  ║                                                          ║
  ║    ╭───────────────────────╮    ║
  ╰══┤               lcother@163.net                ├══╯
        ╰───────────────────────╯


用匯編語言編寫ESMTP郵件發送程序。


ESMTP協議如下:

Socket連接後,按 ESMTP 協議通訊(注意每條命令結尾符“回車\換行\.\回車\換行”結束):
1、EHLO \r\n
        這條命令可以不要,但是按照標准的寫法,還是加上好。
        Example: EHLO smtp.163.net\r\n
2、AUTH LOGIN\r\n
        告訴服務器,要進行驗證了。
3、Base64_Username\r\n
        發送經過 Base64 編碼的用戶名給服務器。
4、Base64_Password\r\n
        發送經過 Base64 編碼的密碼給服務器。
5、MAIL FROM:\r\n
        發送者的Email地址。
        Example: MAIL FROM: lcother@163.net\r\n
6、RCPT TO:\r\n
        目標Email地址。
        Example: RCPT TO: target@163.net\r\n
7、DATA\r\n
        開始傳送數據。
8、發送數據\r\n.\r\n
        注意:SMTP協議只發送信息,至於如何區分CC、BCC、Subject、Body等不屬於SMTP的范圍,詳情請查看RFC文檔MAIL格式部分
        簡單說一下MAIL格式:Sunject:<主題>\r\n\r\n<內容>,還有好多……
        返回值為“250 ***”表示正常,同時***裡含有MessageID等信息(前面的命令都有相應的返回信息)
9、QUIT\r\n
        Over,走人……



                            老羅
                            2002-11-2

------------------



翻譯/修改完畢, 這個是繁體版的 smtp_cht.rc
--------------------------
#include "d:\masm32\include\resource.h"

#define IDI_LC                1
#define IDC_BUTTON_SEND        3000
#define IDC_EDIT_SMTPSERVER    3001
#define IDC_EDIT_USERNAME    3002
#define IDC_EDIT_PASSWORD    3003
#define IDC_EDIT_FROM        3004
#define IDC_EDIT_TO            3005
#define IDC_EDIT_SUBJECT    3006
#define IDC_EDIT_CONTENT    3007
#define IDC_EDIT_ATTACHMENT    3008
#define IDC_BUTTON_BROWSE    3009
#define IDC_STATIC            -1

IDI_LC    ICON    "lc.ico"

LC_DIALOG DIALOGEX 10, 10, 200, 280
STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "ESmtp demo by LC, 2002-11-2"
FONT 9, "宋體", 0, 0, 0x0
BEGIN
    GROUPBOX        "服務器信息", IDC_STATIC, 5, 5, 190, 60
    LTEXT           "SMTP服務器:", IDC_STATIC, 15, 20, 50, 10
    LTEXT            "用  戶  名:", IDC_STATIC, 15, 35, 50, 10
    LTEXT            "密      碼:", IDC_STATIC, 15, 50, 50, 10
    GROUPBOX        "郵件信息", IDC_STATIC, 5, 75, 190, 170
    LTEXT            "發信人電郵:", IDC_STATIC, 15, 90, 50, 10
    LTEXT            "收信人電郵:", IDC_STATIC, 15, 105, 50, 10
    LTEXT            "主      題:", IDC_STATIC, 15, 120, 50, 10
    LTEXT            "附      件:", IDC_STATIC, 15, 135, 50, 10
    EDITTEXT        IDC_EDIT_SMTPSERVER, 65, 20, 120, 10, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
    EDITTEXT        IDC_EDIT_USERNAME, 65, 35, 120, 10, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
    EDITTEXT        IDC_EDIT_PASSWORD, 65, 50, 120, 10, ES_PASSWORD | ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
    EDITTEXT        IDC_EDIT_FROM, 65, 90, 120, 10, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
    EDITTEXT        IDC_EDIT_TO, 65, 105, 120, 10, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
    EDITTEXT        IDC_EDIT_SUBJECT, 65, 120, 120, 10, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
    EDITTEXT        IDC_EDIT_ATTACHMENT, 65, 135, 100, 10, ES_AUTOHSCROLL | NOT WS_BORDER | ES_READONLY | NOT WS_TABSTOP, WS_EX_STATICEDGE
    PUSHBUTTON        "..", IDC_BUTTON_BROWSE, 170, 135, 15, 10, BS_FLAT | BS_RIGHT | BS_BOTTOM
    EDITTEXT        IDC_EDIT_CONTENT, 15, 150, 170, 85, ES_AUTOVSCROLL | NOT WS_BORDER | WS_VSCROLL | ES_WANTRETURN | ES_MULTILINE, WS_EX_STATICEDGE
    DEFPUSHBUTTON   "發送(&G)", IDC_BUTTON_SEND, 70, 255, 50, 15, BS_FLAT
END
--------------------------


翻譯/修改完畢, 這個是簡體版和繁體版的 makeit.bat
--------------------------

@echo off

if not exist rsrc.rc goto over1
D:\masm32\bin\RC.EXE /v rsrc_cht.rc
D:\masm32\bin\RC.EXE /v rsrc_chs.rc
D:\masm32\bin\CVTRES.EXE /machine:ix86 rsrc_chs.res
D:\masm32\bin\CVTRES.EXE /machine:ix86 rsrc_cht.res
:over1

if exist %1.obj del smtp.obj
if exist %1.exe del smtp_chs.exe
if exist %1.exe del smtp_cht.exe

D:\masm32\bin\ML.EXE /c /coff smtp.asm
if errorlevel 1 goto errasm

if not exist rsrc.obj goto nores

D:\masm32\bin\LINK.EXE /SUBSYSTEM:WINDOWS smtp.obj rsrc_chs.res /OUT:smtp_chs.exe
D:\masm32\bin\LINK.EXE /SUBSYSTEM:WINDOWS smtp.obj rsrc_cht.res /OUT:smtp_cht.exe
if errorlevel 1 goto errlink

rem dir win32asm
goto TheEnd

:nores
D:\masm32\bin\LINK.EXE /SUBSYSTEM:WINDOWS smtp.obj
if errorlevel 1 goto errlink
dir %1
goto TheEnd

:errlink
echo _
echo Link error
goto TheEnd

:errasm
echo _
echo Assembly Error
goto TheEnd

:TheEnd

pause



--------------------------




最終的結論, 源碼編譯成功, 繁體版, 簡體版的比對....還是差異點點.
餘下的工作, 繼續在這樣的基礎上修改修改就能搞定



今天的功課就教到這裡. 日後繼續
文章標籤
全站熱搜
創作者介紹
創作者 xiaolabaDIY 的頭像
xiaolabaDIY

xiaolabaDIY 的部落格

xiaolabaDIY 發表在 痞客邦 留言(0) 人氣(10)