?? sendmail.cls
字號:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "clsSendMail"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
Option Compare Text
' API Constants
Private Const REG_SZ = 1&
Private Const ERROR_SUCCESS As Long = 0
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const WS_VERSION_REQD As Long = &H101
Private Const MIN_SOCKETS_REQD As Long = 1
Private Const DATA_SIZE = 32
Private Const MAX_WSAD = 256
Private Const MAX_WSAS = 128
Private Const PING_TIMEOUT = 255
Private Const TIME_ZONE_ID_UNKNOWN As Long = 1
Private Const TIME_ZONE_ID_STANDARD As Long = 1
Private Const TIME_ZONE_ID_DAYLIGHT As Long = 2
Private Const TIME_ZONE_ID_INVALID As Long = &HFFFFFFFF
' Winsock API Type defs...
Private Type ICMP_OPTIONS
Ttl As Byte
Tos As Byte
flags As Byte
OptionsSize As Byte
OptionsData As Long
End Type
Private Type ICMP_ECHO_REPLY
Address As Long
Status As Long
RoundTripTime As Long
DataSize As Long
DataPointer As Long
options As ICMP_OPTIONS
Data As String * 250
End Type
Private Type HostEnt
hName As Long
hAliases As Long
hAddrType As Integer
hLen As Integer
hAddrList As Long
End Type
Private Type WSADATA
wVersion As Integer
wHighVersion As Integer
szDescription(MAX_WSAD) As Byte
szSystemStatus(MAX_WSAS) As Byte
wMaxSockets As Integer
wMaxUDPDG As Integer
dwVendorInfo As Long
End Type
' SystemTime and TimeZone API Type defs...
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Type TIME_ZONE_INFORMATION
Bias As Long
StandardName(63) As Byte
StandardDate As SYSTEMTIME
StandardBias As Long
DaylightName(63) As Byte
DaylightDate As SYSTEMTIME
DaylightBias As Long
End Type
' Class Enum for host name string validation
Public Enum VALIDATE_HOST_METHOD
VALIDATE_HOST_NONE = 0
VALIDATE_HOST_SYNTAX = 1
VALIDATE_HOST_PING = 2
VALIDATE_HOST_DNS = 3
End Enum
' Class Enum for email address string validation
Public Enum VALIDATE_METHOD
validate_none = 0
VALIDATE_SYNTAX = 1
End Enum
' Class Enum for email encoding method
Public Enum ENCODE_METHOD
MIME_ENCODE = 0
UU_ENCODE = 1
End Enum
' Class Enum for mail priority
Public Enum MAIL_PRIORITY
HIGH_PRIORITY = 1
NORMAL_PRIORITY = 3
LOW_PRIORITY = 5
End Enum
' Structure to hold mail elements
Private Type MAIL_DATA
sToAddr() As String ' To: email address
sToDisplayName() As String ' To: display name
sCcAddr() As String ' Cc: email address
sCcDisplayName() As String ' Cc: display name
sBccAddr() As String ' Bcc: email address
sFromAddr As String ' From: email address
sFromDisplayName As String ' From: display name
sReplyToAddr As String ' ReplyTo: email address
sSubject As String ' Subject
sMailMessage As String ' email message body
sAttachment() As String ' attachment path\filename
sAttachNameOnly() As String ' attachment name only
bAttachCID() As Boolean ' attachment has an assigned CID in an HTML document
lAttachNameSize As Long ' sum of the lenght of all attachment names
lAttachFileSize As Long ' sum of all file lenghts
lAttachCount As Long ' number of attachments
End Type
' Class Property var's
Private utMail As MAIL_DATA ' see above type def
Private etPriority As MAIL_PRIORITY ' mail priority, Normal - High - Low
Private psDelimiter As String ' string to delimit multiple entries
Private psSMTPHost As String ' remote host name or IP number
Private plSMTPPort As Long ' remote host port number
Private pbUseAuthentication As Boolean ' flag, use login authentication with host
Private pbHtmlText As Boolean ' flag, send plain text / html text
Private psContentBase As String ' Content base for HTML text
Private plConnectTimeout As Long ' timeout value for connection attempts
Private plConnectRetry As Long ' number of times to attempt a connection
Private plMessageTimeOut As Long ' timeout value for sending a message
Private pbPersistentSettings As Long ' flag, persistent/non-persistent settings
Private etEncodeType As ENCODE_METHOD ' MIME / UUEncode flag
Private etEmailValidation As VALIDATE_METHOD ' type of email address validation to use
Private etSMTPHostValidation As VALIDATE_METHOD ' type of Host validation to use
Private pbReceipt As Boolean ' flag, request a return receipt
' Class local var's
Private psTimeZoneBias As String ' time zone offset bias
Private pColErrors As Collection ' errors collection
Private pbBase64Byt(0 To 63) As Byte ' base 64 encoder byte array
Private psUUEncodeChr(0 To 63) As String ' UU encoder string array
Private pb8BitMail As Boolean ' flag, 7/8 bit message body
Private pbExitImmediately As Boolean ' flag - unrecoverable error
Private pbConnected As Boolean ' flag, connection to host established
Private pbManualDisconnect As Boolean ' flag, stay connected until 'Disconnect' called
Private pbRequestAccepted As Boolean ' flag, host accepted request
Private pbDataOK As Boolean ' flag, received "OK" from host
Private pbAuthLoginSupported As Boolean ' flag, host supports auth login
Private pbAuthMailFromOK As Boolean ' flag, host accepts 'mail from' auth
Private pbAuthLoginSuccess As Boolean ' flag, Auth login accepted by remote host
Private plBytesSent As Long ' running total of bytes sent
Private plBytesRemaining As Long ' bytes remaining to be sent in sock send buffer
Private pbSendProgress As Boolean ' flag indicating that the send progress event has fired
Private plMailSize As Long ' total size of email session
Private psUserName As String ' Auth username - optional, not supported by all servers
Private psPassword As String ' Auth password - optional, not supported by all servers
Private psPriority As String ' string version of priority Property for MSMail
Private plPop3Status As Long ' POP3 connection status
Private pbUsePopAuthentication As Boolean ' server requires Pop authorization (before SMTP)
Private pbPopAuthOk As Boolean ' POP3 auth OK
Private psPop3Host As String ' POP3 server name
Private WithEvents sckMail As CSocket ' project must include the Winsock control
Attribute sckMail.VB_VarHelpID = -1
' or a reference to the mswinsck.ocx
Private psDay() As String ' day name array
Private psMonth() As String ' month name array
' Class Constants
' base 64 encoder string
Private Const BASE64CHR As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
' error strings used with 'pColErrors' collection to report errors to the user
Private Const ERR_INVALID_HOST = "Invalid or Missing SMTP Host Name"
Private Const ERR_INVALID_POP_HOST = "Invalid or Missing POP3 Host Name"
Private Const ERR_INVALID_PORT = "Invalid Remote Port"
Private Const ERR_INVALID_REC_EMAIL = "Missing or Invalid Recipient E-mail Address"
Private Const ERR_NO_REC_EMAIL = "No Recipient E-mail Address Specified"
Private Const ERR_INVALID_CC_EMAIL = "Invalid Cc: Recipient E-mail Address"
Private Const ERR_INVALID_BCC_EMAIL = "Invalid Bcc: Recipient E-mail Address"
Private Const ERR_INVALID_SND_EMAIL = "Missing or Invalid Sender E-mail Address"
Private Const ERR_TIMEOUT = "Timeout occurred: The SMTP Host did not respond to the request"
Private Const ERR_FILE_NOT_EXIST = "The file you tried to attach does not exist"
Private Const ERR_RECIPIENT_COUNT = "Too many recipients"
Private Const ERR_HTML_REQUIRES_MIME = "Sending HTML requires MIME encoding"
' misc startup defaults
Private Const CONNECT_TIMEOUT = 30 ' seconds to wait before giving up
Private Const CONNECT_RETRY = 4 ' number of times to try before giving up
Private Const MSG_TIMEOUT = 60 ' seconds before timing out on message transmission
Private Const REG_KEY = "vbSendMail" ' registry key
Private Const SETTINGS_KEY = "Settings" ' registry sub key
Private Const DEFAULT_PORT As Long = 25 ' default socket port for SMTP
Private Const POP3_PORT As Long = 110 ' default socket port for POP3
Private Const Q_CODE_HDR As String = "=?ISO-8859-1?Q?"
Private Const B_CODE_HDR As String = "=?ISO-8859-1?B?"
Private Const CODE_END As String = "?="
Private Const CHAR_SET As String = "iso-8859-1"
' maximums per RFC 821...
Private Const MAX_TEXTLINE_LEN = 1000 ' maximum total lenght of a text line
Private Const MAX_RECIPIENTS = 100 ' maximum number of recipients that must be buffered
' list of top level Domains, obtained from www.IANA.com.
' Can and will change, used in host name syntax checking
Private Const TOP_DOMAINS = "COM ORG NET EDU GOV MIL INT AF AL DZ AS " & _
"AD AO AI AQ AG AR AM AW AC AU AT AZ BS BH BD BB BY BZ BT BJ " & _
"BE BM BO BA BW BV BR IO BN BG BF BI KH CM CA CV KY CF TD CL " & _
"CN CX CC CO KM CD CG CK CR CI HR CU CY CZ DK DJ DM DO TP EC " & _
"EG SV GQ ER EE ET FK FO FJ FI FR GF PF TF GA GM GE DE GH GI " & _
"GR GL GD GP GU GT GG GN GW GY HT HM VA HN HK HU IS IN ID IR " & _
"IQ IE IM IL IT JM JP JE JO KZ KE KI KP KR KW KG LA LV LB LS " & _
"LR LY LI LT LU MO MK MG MW MY MV ML MT MH MQ MR MU YT MX FM " & _
"MD MC MN MS MA MZ MM NA NR NP NL AN NC NZ NI NE NG NU NF MP " & _
"NO OM PK PW PA PG PY PE PH PN PL PT PR QA RE RO RU RW KN LC " & _
"VC WS SM ST SA SN SC SL SG SK SI SB SO ZA GS ES LK SH PM SD " & _
"SR SJ SZ SE CH SY TW TJ TZ TH TG TK TO TT TN TR TM TC TV UG " & _
"UA AE GB US UM UY UZ VU VE VN VG VI WF EH YE YU ZR ZM ZW UK"
' Class Events
Public Event SendSuccesful()
Public Event SendFailed(Explanation As String)
Public Event Status(Status As String)
Public Event Progress(PercentComplete As Long)
' API prototypes...
' winsock
Private Declare Function WSAGetLastError Lib "wsock32.dll" () As Long
Private Declare Function WSAStartup Lib "wsock32.dll" _
(ByVal wVersionRequired As Long, lpWSAData As WSADATA) As Long
Private Declare Function WSACleanup Lib "wsock32.dll" () As Long
Private Declare Function gethostname Lib "wsock32.dll" _
(ByVal szHost As String, ByVal dwHostLen As Long) As Long
Private Declare Function gethostbyname Lib "wsock32.dll" (ByVal szHost As String) As Long
Private Declare Function IcmpCreateFile Lib "icmp.dll" () As Long
Private Declare Function IcmpCloseHandle Lib "icmp.dll" (ByVal IcmpHandle As Long) As Long
Private Declare Function IcmpSendEcho Lib "icmp.dll" _
(ByVal IcmpHandle As Long, ByVal DestinationAddress As Long, _
ByVal RequestData As String, ByVal RequestSize As Long, _
ByVal RequestOptions As Long, ReplyBuffer As ICMP_ECHO_REPLY, _
ByVal ReplySize As Long, ByVal Timeout As Long) As Long
' registry
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, ByVal RESERVED As Long, _
ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
' misc
Private Declare Function GetTimeZoneInformation Lib "kernel32" _
(lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Class_Initialize()
Dim iPtr As Integer ' loop counter
Dim utTZ As TIME_ZONE_INFORMATION ' api time zone type
Dim dwBias As Long
' instantiate the Error collection
Set pColErrors = New Collection
' instantiate the Winsock Control
Set sckMail = New CSocket
' alternate method of instantiating Winsock without a Form.
' use a project Reference instead of the included frmSck & Winsock control
' *** currently has unresolved deployment issues ***
'Set sckMail = New Winsock
' initialize default values...
pbPersistentSettings = CLng(RegGet("PersistentSettings", "0"))
If pbPersistentSettings Then
' load defaults from the registry
utMail.sFromAddr = RegGet("From", "")
utMail.sFromDisplayName = RegGet("FromDisplayName", "")
psPop3Host = RegGet("Pop3Host", "")
psSMTPHost = RegGet("RemoteHost", "")
plSMTPPort = CLng(RegGet("RemotePort", DEFAULT_PORT))
etSMTPHostValidation = RegGet("SMTPHostValidation", VALIDATE_HOST_DNS)
etEmailValidation = CLng(RegGet("EmailValidation", VALIDATE_SYNTAX))
plConnectTimeout = CLng(RegGet("ConnectTimeout", CONNECT_TIMEOUT))
plMessageTimeOut = CLng(RegGet("MessageTimeout", MSG_TIMEOUT))
plConnectRetry = CLng(RegGet("ConnectRetry", CONNECT_RETRY))
etEncodeType = RegGet("EncodeType", MIME_ENCODE)
psUserName = RegGet("Username", "")
pbUseAuthentication = RegGet("UseAuthentication", False)
pbUsePopAuthentication = RegGet("UsePopAuthentication", False)
Else
' load standard defaults
plSMTPPort = DEFAULT_PORT
etSMTPHostValidation = VALIDATE_HOST_DNS
etEmailValidation = VALIDATE_SYNTAX
plConnectTimeout = CONNECT_TIMEOUT
plMessageTimeOut = MSG_TIMEOUT
plConnectRetry = CONNECT_RETRY
etEncodeType = MIME_ENCODE
pbHtmlText = False
End If
' initialize the arrays for base64 & uu encoders
For iPtr = 0 To 63
pbBase64Byt(iPtr) = Asc(Mid$(BASE64CHR, iPtr + 1, 1))
psUUEncodeChr(iPtr) = Chr$(iPtr + &H20)
Next iPtr
psUUEncodeChr(0) = Chr$(&H60)
' calculate the time zone offset bias
Select Case GetTimeZoneInformation(utTZ)
Case TIME_ZONE_ID_DAYLIGHT
dwBias = utTZ.Bias + utTZ.DaylightBias
Case Else
dwBias = utTZ.Bias + utTZ.StandardBias
End Select
psTimeZoneBias = Format$(-dwBias \ 60, "00") & Format$(Abs(dwBias - (dwBias \ 60) * 60), "00")
If InStr(psTimeZoneBias, "-") = 0 Then psTimeZoneBias = "+" & psTimeZoneBias
' init mail recipient arrays (sets Ubound to -1)
utMail.sToAddr = Split("")
utMail.sToDisplayName = utMail.sToAddr
utMail.sCcAddr = utMail.sToAddr
utMail.sCcDisplayName = utMail.sToAddr
utMail.sBccAddr = utMail.sToAddr
utMail.sAttachment = utMail.sToAddr
' set default delimiter
psDelimiter = ";"
' set default priority
etPriority = NORMAL_PRIORITY
' initialize the day/month arrays needed to support non-English systems.
' some email clients/servers will not accept non-English words in the
' date field so we need to guarantee that the day & month are English.
' These arrays are used in the Send Sub to format the current time/date.
psDay() = Split(",Sun,Mon,Tue,Wed,Thu,Fri,Sat", ",")
psMonth() = Split(",Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", ",")
End Sub
Private Sub Class_Terminate()
' make sure sckMail is closed
If sckMail.State <> sckClosed Then
DisconnectFromHost
End If
' release memory
Set sckMail = Nothing
Set pColErrors = Nothing
End Sub
' ******************************************************************************
' * Class Properties *
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -