近日有這樣的需求
收到的傳真, 希望自動發送到固定的 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
--------------------------
最終的結論, 源碼編譯成功, 繁體版, 簡體版的比對....還是差異點點.
餘下的工作, 繼續在這樣的基礎上修改修改就能搞定
今天的功課就教到這裡. 日後繼續
收到的傳真, 希望自動發送到固定的 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
--------------------------
最終的結論, 源碼編譯成功, 繁體版, 簡體版的比對....還是差異點點.
餘下的工作, 繼續在這樣的基礎上修改修改就能搞定
今天的功課就教到這裡. 日後繼續
文章標籤
全站熱搜
