插件:批量发邮件程序

优质
小牛编辑
119浏览
2023-12-01
此脚本需要nsMailer.dll插件。

引用 SendMail.nsi 的内容:

!AddPluginDir .
!define PRODUCT_NAME "批量发邮件程序"
!define /date BUILD_DATE "%Y-%m-%d"

SetCompressor /SOLID lzma
SetCompressorDictSize 32

!include "MUI2.nsh"
!include "FileFunc.nsh"

!define PBM_GETRANGE 0x0407

!define MUI_CUSTOMFUNCTION_GUIINIT GUIInit

!define MUI_PAGE_HEADER_TEXT "路径选择"
!define MUI_PAGE_HEADER_SUBTEXT "请选择你要发送的文件所在文件夹。"
!define MUI_DIRECTORYPAGE_TEXT_TOP "如果文件比较大,发送时间会较长"
!define MUI_DIRECTORYPAGE_TEXT_DESTINATION "附件文件夹"
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_SHOW InstShow
!define MUI_PAGE_HEADER_TEXT "正在发送"
!define MUI_PAGE_HEADER_SUBTEXT "正在发送,请稍候..."
!define FINISHHEADER_TEXT "任务完成"
!define FINISHHEADER_SUBTEXT "可以发送的文件都已发送完毕。"
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE InstLeave
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "SimpChinese"

Name "${PRODUCT_NAME}"
Caption "${PRODUCT_NAME}"
OutFile "SendMail.exe"
InstallDir "D:\Upload\"
ShowInstDetails show
BrandingText "Build ${BUILD_DATE} by gfm688"
SpaceTexts none
InstallButtonText "发送(&S)"
MiscButtonText "返回(&B)"

Var Pos
Var AddPos
Var retry
!define MaxReTry 3  ;定义最大重试次数

# 不用插件检查文件是否小于50M
; 小于50M则返回1, 大于50M则返回0
!macro IsLessthan50 File Result
	Push $R0
	Push $R1
	FileOpen $R0 "${File}" r
	FileSeek $R0 "" END $R1
	FileClose $R0
	${If} $R1  52428800
	    Push 0
	${Else}
	    Push 1
	${EndIf}
	Exch 2
	Pop $R0
	Pop $R1
	Pop ${Result}
!macroend
# 用了${Locate}或${GetSize}就会将System.dll打包进去, 而这个脚本实际上并没使用System.dll, 所以System.dll总不会释放出来

Section
StrCmp $1 "" SecEnd
${Locate} "$INSTDIR" "/L=F /G=0" "SendMail"
SecEnd:
Call InstFinish
SectionEnd

Function SendMail
SetDetailsPrint both
	!insertmacro IsLessthan50 "$R9" $R0
	${If} $R0 = 0
		DetailPrint "$R7大于50M, 跳过..."
		Goto continue
	${EndIf}
	DetailPrint "正在发送: $R7..."
trysend:
	nsMailer::InitConfig "smtp.qq.com" "Username" "Password"
	Pop $R0
	nsMailer::From "xxx@qq.com"
	nsMailer::To "xxx@qq.com"
	nsMailer::Subject "$R7"
	nsMailer::TextBody ""
	nsMailer::AddAttachment "$R9"
	nsMailer::Send
	Pop $R0
	${If} $R0 != 0
	    ${If} $retry = ${MaxReTry}
	   		DetailPrint "超过重试次数, $R7 发送失败!"
	        Goto continue
	    ${EndIf}
        DetailPrint "$R7 发送失败, 正在重试..."
        IntOp $retry $retry + 1
        Goto trysend
	${EndIf}
	DetailPrint "$R7 发送成功!"
continue:
    IntOp $Pos $Pos + $AddPos
	SendMessage $mui.InstFilesPage.ProgressBar ${PBM_SETPOS} $Pos 0
	Push $0
FunctionEnd

Function InstShow
	EnableWindow $mui.Button.Cancel 1
	${GetSize} "$INSTDIR" "/G=0" $0 $1 $2
	SendMessage $mui.InstFilesPage.ProgressBar ${PBM_GETRANGE} 0 0 $2
	IntOp $AddPos $2 / $1
	StrCpy $Pos 0
	StrCpy $retry 0
FunctionEnd

Function InstFinish
    SendMessage $mui.Button.Next ${WM_SETTEXT} 0 "STR:完成(&F)"
    EnableWindow $mui.Button.Back 1
    EnableWindow $mui.Button.Next 1
    EnableWindow $mui.Button.Cancel 0
    DetailPrint "$(^Completed)"
    !insertmacro MUI_HEADER_TEXT "${FINISHHEADER_TEXT}" "${FINISHHEADER_SUBTEXT}"
    NotifyIcon::Icon /NOUNLOAD "b" "${FINISHHEADER_TEXT}" "${FINISHHEADER_SUBTEXT}"
    SendMessage $mui.InstFilesPage.ProgressBar ${PBM_GETRANGE} 0 0 $0
    SendMessage $mui.InstFilesPage.ProgressBar ${PBM_SETPOS} $0 0
    Sleep 0xFFFFFF
FunctionEnd

Function InstLeave
    IfAbort +2
    Quit
FunctionEnd

Function GUIInit
 NotifyIcon::Icon /NOUNLOAD "iy" 103
FunctionEnd

Function .onGUIEnd
 NotifyIcon::Icon "r"
FunctionEnd

# 加个命令行参数,集成到右键菜单,再加个自定义页面配置就帅呆了^_^