转自 http://www.jishuzh.com/program/vb-smtp%E7%94%A8%E6%88%B7%E9%AA%8C%E8%AF%81%E5%8F%91%E9%80%81mail.html

这几天技术宅在捣鼓怎么发送“垃圾邮件”,呵呵其实是想做一个群发邮件的小软件,希望通过vb来应用smtp进行发信息。怎耐自己功夫其实还不到家,折腾了好久也没有成功。倒是在这个过程中学习到了一些东西,也找到了一些比较不错的源码,有很多都是花费了九牛二虎之力才找到的,不能说不辛苦。今天的,技术宅给大家分享一份源码:VB SMTP用户验证发送mail。

这封源码技术宅因为后来实在弄到焦头烂额了,没有仔细研究,不过他的注释都是很清楚的,肯定有值得大家学习的地方。

  1. Option Explicit
  2. Private WithEvents Sock As MSWinsockLib.Winsock
  3. Private StrCharset As String '语言编码
  4. Private StrContentType As String '邮件编码
  5. Private StrServerAddress As String 'SMTP服务器地址
  6. Private StrMailServerUserName As String 'SMTP验证用户名
  7. Private StrMailServerPassword As String 'SMTP验证密码
  8. Private StrFrom As String '发信人地址
  9. Private StrFromName As String '发信人姓名
  10. Private StrSubject As String '邮件标题
  11. Private StrBody As String '邮件内容
  12. Private StrRecipient As String '收件人地址
  13. Private LngPriority As Long '邮件级别
  14. Private LngPort As Long 'SMTP服务器端口
  15. Private ErrInt As Integer
  16. Private ErrStr As String
  17. '语言编码
  18. Public Property Let Charset(ByVal Str As String)
  19. StrCharset = Str
  20. End Property
  21. '邮件编码
  22. Public Property Let ContentType(ByVal Str As String)
  23. StrContentType = Str
  24. End Property
  25. 'SMTP服务器地址
  26. Public Property Let ServerAddress(ByVal Str As String)
  27. StrServerAddress = Str
  28. End Property
  29. 'SMTP服务器端口
  30. Public Property Let Port(ByVal II As Long)
  31. LngPort = II
  32. End Property
  33. 'SMTP验证用户名
  34. Public Property Let MailServerUserName(ByVal Str As String)
  35. StrMailServerUserName = Base64(Trim(Str))
  36. End Property
  37. 'SMTP验证密码
  38. Public Property Let MailServerPassword(ByVal Str As String)
  39. StrMailServerPassword = Base64(Str)
  40. End Property
  41. '发信人地址
  42. Public Property Let From(ByVal Str As String)
  43. StrFrom = Str
  44. End Property
  45. '发信人姓名
  46. Public Property Let FromName(ByVal Str As String)
  47. StrFromName = Str
  48. End Property
  49. '邮件标题
  50. Public Property Let Subject(ByVal Str As String)
  51. StrSubject = Str
  52. End Property
  53. '收件人地址,可以多个收件人
  54. Public Sub AddRecipient(ByVal Str As String)
  55. StrRecipient = Str
  56. End Sub
  57. '邮件内容
  58. Public Property Let Body(ByVal Str As String)
  59. StrBody = Str
  60. End Property
  61. '邮件级别
  62. Public Property Let Priority(ByVal II As Long)
  63. LngPriority = II
  64. End Property
  65. '应该在执行过可能产生错误的函数后及时调用此函数,获取最新的错误信息。
  66. Public Property Get OnErr() As Integer
  67. OnErr = ErrInt
  68. End Property
  69. Public Property Get Description() As String
  70. Description = ErrStr
  71. End Property
  72. Private Sub Class_Initialize()
  73. Set Sock = New MSWinsockLib.Winsock
  74. End Sub
  75. Private Sub Class_Terminate()
  76. Sock.Close
  77. Set Sock = Nothing
  78. End Sub
  79. Public Sub Send() '发送
  80. If LngPort < 1 Then LngPort = 25
  81. If LngPriority < 1 Or LngPriority > 5 Then LngPriority = 2
  82. If StrCharset = "" Then StrCharset = "GB2312"
  83. If StrC Then StrC
  84. If Right(StrRecipient, 1) <> ";" Then StrRecipient = StrRecipient & ";"
  85. Sock.Close '关闭连接
  86. Sock.Connect StrServerAddress, LngPort '连接邮件服务器
  87. End Sub
  88. Private Sub Sock_DataArrival(ByVal bytesTotal As Long)
  89. Dim StrServerResponse As String '服务器返回的信息
  90. Dim StrResponseCode As String
  91. Dim StrRe() As String
  92. Dim II As Long
  93. Const RandString As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"
  94. Dim GlobalStr As String
  95. For II = 1 To 24
  96. GlobalStr = GlobalStr & Mid(RandString, Int(Rnd * Len(RandString)) + 1, 1)
  97. Next II
  98.  
  99. '获取邮件服务器返回信息
  100. Sock.GetData StrServerResponse
  101. StrResponseCode = Left(StrServerResponse, 3)
  102.  
  103. '登陆邮件服务器,SMTP验证
  104. Sock.SendData "HELO " & Trim$(StrFrom) & vbCrLf
  105. Sock.SendData "AUTH LOGIN" & vbCrLf
  106. Sock.SendData (StrMailServerUserName) & vbCrLf
  107. Sock.SendData (StrMailServerPassword) & vbCrLf
  108.  
  109. StrRe = Split(StrRecipient, ";")
  110. For II = 0 To UBound(StrRe) - 1 '发送到多个收件人
  111. If StrResp Or _
  112. StrResp Or _
  113. StrResp Or _
  114. StrResp Or _
  115. StrResp Then
  116. Sock.SendData "MAIL FROM:" & Trim$(StrFrom) & vbCrLf '寄件人
  117. Sock.SendData "RCPT TO:" & Trim$(StrRe(II)) & vbCrLf '收件人
  118. Sock.SendData "DATA" & vbCrLf
  119. Sock.SendData "From: " & StrFromName & " <" & StrFrom & ">" & vbCrLf '寄件人
  120. Sock.SendData "To: " & Mid(StrRe(II), 1, InStr(StrRe(II), "@") - 1) & " <" & StrRe(II) & ">" & vbCrLf '收件人
  121. Sock.SendData "Subject:" & Chr(32) & StrSubject & vbCrLf '邮件主题
  122. Sock.SendData "X-Mailer: SkyGz MAIL1.0" & vbCrLf '邮件发送者
  123. Sock.SendData "X-Priority: " & CStr(LngPriority) & vbCrLf '邮件发送级别
  124. Sock.SendData "MIME-Version: 1.0" & vbCrLf
  125. Sock.SendData "Content-Type: multipart/alternative;" & vbCrLf & Chr(9) & "boundary=""----=_NextPart_" & GlobalStr & """" & vbCrLf & vbCrLf
  126. Sock.SendData "This Is A Multi-Part Message In MIME Format." & vbCrLf & vbCrLf
  127. Sock.SendData "------=_NextPart_" & GlobalStr & vbCrLf
  128. Sock.SendData "Content-Type: " & StrContentType & "; charset=" & StrCharset & ";" & vbCrLf & vbCrLf '语言编码和邮件编码
  129. Sock.SendData StrBody & vbCrLf & vbCrLf '邮件内容
  130. Sock.SendData "------=_NextPart_" & GlobalStr & "--" & vbCrLf
  131. Sock.SendData "." & vbCrLf
  132. ErrInt = 3
  133. ErrStr = "发送成功"
  134. 'Sock.Close
  135. 'Send = True
  136. Else
  137. ErrInt = 4
  138. ErrStr = "发送失败"
  139. 'Sock.Close
  140. 'Send = False
  141. End If
  142. Next II
  143. Sock.SendData "QUIT" & vbCrLf '退出邮件服务器
  144. End Sub
  145. Private Function Base64(ByVal Str As String) As String 'base6加密算法
  146. Const BASE64_TABLE As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  147. Dim StrTempLine As String
  148. Dim j As Integer
  149. For j = 1 To (Len(Str) - Len(Str) Mod 3) Step 3
  150. StrTempLine = StrTempLine + Mid(BASE64_TABLE, (Asc(Mid(Str, j, 1)) 4) + 1, 1)
  151. StrTempLine = StrTempLine + Mid(BASE64_TABLE, ((Asc(Mid(Str, j, 1)) Mod 4) * 16 _
  152. + Asc(Mid(Str, j + 1, 1)) 16) + 1, 1)
  153. StrTempLine = StrTempLine + Mid(BASE64_TABLE, ((Asc(Mid(Str, j + 1, 1)) Mod 16) * 4 _
  154. + Asc(Mid(Str, j + 2, 1)) 64) + 1, 1)
  155. StrTempLine = StrTempLine + Mid(BASE64_TABLE, (Asc(Mid(Str, j + 2, 1)) Mod 64) + 1, 1)
  156. Next j
  157. If Not (Len(Str) Mod 3) = 0 Then
  158. If (Len(Str) Mod 3) = 2 Then
  159. StrTempLine = StrTempLine + Mid(BASE64_TABLE, (Asc(Mid(Str, j, 1)) 4) + 1, 1)
  160. StrTempLine = StrTempLine + Mid(BASE64_TABLE, (Asc(Mid(Str, j, 1)) Mod 4) * 16 _
  161. + Asc(Mid(Str, j + 1, 1)) 16 + 1, 1)
  162. StrTempLine = StrTempLine + Mid(BASE64_TABLE, (Asc(Mid(Str, j + 1, 1)) Mod 16) * 4 + 1, 1)
  163. StrTempLine = StrTempLine & "="
  164. ElseIf (Len(Str) Mod 3) = 1 Then
  165. StrTempLine = StrTempLine + Mid(BASE64_TABLE, Asc(Mid(Str, j, 1)) 4 + 1, 1)
  166. StrTempLine = StrTempLine + Mid(BASE64_TABLE, (Asc(Mid(Str, j, 1)) Mod 4) * 16 + 1, 1)
  167. StrTempLine = StrTempLine & "=="
  168. End If
  169. End If
  170. Base64 = StrTempLine
  171. End Function

  

 
 
 
 

最后技术宅想说,就算做好了群发软件希望也只是测试,不要真正拿来干一些非法的事情哈。

三、 代码实现

Public Response As String, Reply As Integer, DateNow As String
Public Start As Single, Tmr As Single

'API-函数
'Private Declare Function ArrPtr Lib "msvbvm50.dll" _
' Alias "VarPtr" (Ptr() As Any) As Long '<-- VB5
'ArrPtr:取数组的地址

Private Declare Function ArrPtr Lib "msvbvm60.dll" _
Alias "VarPtr" (Ptr() As Any) As Long '<-- VB6

'PokeLng:转换地址内容

Private Declare Sub PokeLng Lib "kernel32" Alias "RtlMoveMemory" ( _
ByVal Addr As Long, Source As Long, _
Optional ByVal Bytes As Long = 4)

'Base64:

Private Base64EncodeByte(0 To 63) As Byte
Private Base64EncodeWord(0 To 63) As Integer
Const Base64EmptyByte As Byte = 61 
Const Base64EmptyWord As Integer = 61

Public Sub Base64Init()
 '建立Base64码数组

 Const Chars64 As String _
  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" _
  & "abcdefghijklmnopqrstuvwxyz" _
  & "0123456789+/"
 Static i As Long
 Dim Code As Integer

 If i Then Exit Sub

 For i = 0 To 63
  Code = Asc(Mid$(Chars64, i + 1, 1))
  Base64EncodeByte(i) = Code
  Base64EncodeWord(i) = Code
 Next i
End Sub

Public Static Function Base64EncodeString(ByRef Text As String) As String
'Base64码转换函数
 Dim Chars() As Integer
 Dim SavePtr As Long
 Dim SADescrPtr As Long
 Dim DataPtr As Long
 Dim CountPtr As Long
 Dim TextLen As Long
 Dim i As Long
 Dim Chars64() As Integer
 Dim SavePtr64 As Long
 Dim SADescrPtr64 As Long
 Dim DataPtr64 As Long
 Dim CountPtr64 As Long
 Dim TextLen64 As Long
 Dim j As Long
 Dim b1 As Integer
 Dim b2 As Integer
 Dim b3 As Integer

 j = 0

 TextLen = Len(Text)
 If TextLen = 0 Then Exit Function 
 '输入字符串校验
 TextLen64 = ((TextLen + 2) \ 3) * 4 
 '字符串转换为Base64码后的长度
 Base64EncodeString = Space$(TextLen64)

 If SavePtr = 0 Then
  ReDim Chars(1 To 1)
  SavePtr = VarPtr(Chars(1))
  'SavePtr=*Chars(1)
  PokeLng VarPtr(SADescrPtr), ByVal ArrPtr(Chars)
  '*SADescrPtr=*Chars
  DataPtr = SADescrPtr + 12
  CountPtr = SADescrPtr + 16

  ReDim Chars64(0 To 0)
  SavePtr64 = VarPtr(Chars64(0))
  'SavePtr64=*Chars64(0)
  PokeLng VarPtr(SADescrPtr64), ByVal ArrPtr(Chars64)
  '*SADescrPtr64=*Chars64
  DataPtr64 = SADescrPtr64 + 12
  CountPtr64 = SADescrPtr64 + 16
 End If

 PokeLng DataPtr, StrPtr(Text)
 'DataPtr=*Text
 PokeLng CountPtr, TextLen
 'CountPtr=TextLen
 PokeLng DataPtr64, StrPtr(Base64EncodeString)
 'DataPtr64=*Base64EncodeString
 PokeLng CountPtr64, TextLen64
 'CountPtr64=Textlen64

 Base64Init

 '输入字符串转换为Base64码
 For i = 1 To TextLen - 2 Step 3
  b1 = Chars(i)
  b2 = Chars(i + 1)
  b3 = Chars(i + 2)

  'Base64-Bytes:
  Chars64(j) = Base64EncodeWord(b1 \ &H4)
  Chars64(j + 1) = Base64EncodeWord((b1 And &H3) * &H10 + b2 \ &H10)
  Chars64(j + 2) = Base64EncodeWord((b2 And &HF) * &H4 + b3 \ &H40)
  Chars64(j + 3) = Base64EncodeWord(b3 And &H3F)

  j = j + 4
 Next i

 '继续将未转换完的输入字符串转换为Base64码
 Select Case TextLen - i
  Case 0 '2 Bytes
   b1 = Chars(i)
   Chars64(j) = Base64EncodeWord(b1 \ &H4)
   Chars64(j + 1) = Base64EncodeByte((b1 And &H3) * &H10)
   Chars64(j + 2) = Base64EmptyWord
   Chars64(j + 3) = Base64EmptyWord
  Case 1 '1 Byte
   b1 = Chars(i)
   b2 = Chars(i + 1)

   Chars64(j) = Base64EncodeWord(b1 \ &H4)
   Chars64(j + 1) = Base64EncodeWord((b1 And &H3) * &H10 + b2 \ &H10)
   Chars64(j + 2) = Base64EncodeWord((b2 And &HF) * &H4)
   Chars64(j + 3) = Base64EmptyWord
 End Select

 '返回转换成Base64码的字符串
 PokeLng DataPtr64, SavePtr64
 PokeLng CountPtr64, 1
 PokeLng DataPtr, SavePtr
 PokeLng CountPtr, 1
End Function

Sub SendEmail(MailServerName As String, FromName As String, _
 FromEmailAddress As String, ToName As String, ToEmailAddress As String, _
 EmailSubject As String, EmailBodyOfMessage As String, EmialPassword As String, _
 EmialUsername As String, NeedCheck As Integer)

 Dim first As String, Second As String, Third As String
 Dim Fourth As String, Fifth As String, Sixth As String
 Dim Seventh As String, Eighth As String

 Winsock1.LocalPort = 0 '用端口0来动态的建立连接
 If Winsock1.State = sckClosed Then '检查winsock的状态是否为关
  '发件人地址
  first = "mail from:" + Chr(32) + FromEmailAddress + vbCrLf

  '收件人地址
  Second = "rcpt to:" + Chr(32) + ToEmailAddress + vbCrLf

  '时间
  Third = "Date:" + Chr(32) + Format(Date, "Ddd") & ", " & _
      Format(Date, "dd Mmm YYYY") & " " & Format(Time, "hh:mm:ss") _
      & "" & " -0600" + vbCrLf

  '发件人
  Fourth = "From:" + Chr(32) + FromName + vbCrLf

  '收件人
  Fifth = "To:" + Chr(32) + ToNametxt + vbCrLf

  '主题
  Sixth = "Subject:" + Chr(32) + EmailSubject + vbCrLf

  '正文
  Seventh = EmailBodyOfMessage + vbCrLf
  Ninth = "X-Mailer: lj v 2.x" + vbCrLf
  Eighth = Fourth + Third + Ninth + Fifth + Sixth

  Winsock1.Protocol = sckTCPProtocol ' 设置协议为TCP
  Winsock1.RemoteHost = MailServerName ' SMTP地址
  Winsock1.RemotePort = 25 ' SMTP端口
  Winsock1.Connect ' 开始连接
  WaitFor ("220")
  StatusTxt.Caption = "Connecting...."
  StatusTxt.Refresh
  Winsock1.SendData ("HELO worldcomputers.com" + vbCrLf)
  WaitFor ("250")
  StatusTxt.Caption = "Connected"
  StatusTxt.Refresh

  If NeedCheck = 1 Then
   '进行校验LOGIN
   Winsock1.SendData ("AUTH LOGIN" + vbCrLf)
   StatusTxt.Caption = "LOGIN ESMTP"
   StatusTxt.Refresh
   WaitFor ("334")
   '输入用户名
   Winsock1.SendData (Base64EncodeString(EmialUsername) + vbCrLf) 
   StatusTxt.Caption = "username"
   StatusTxt.Refresh
   WaitFor ("334")
   '输入用户口令
   Winsock1.SendData (Base64EncodeString(EmialPassword) + vbCrLf) 
   StatusTxt.Caption = "password"
   StatusTxt.Refresh
   WaitFor ("235")
  End If

  Winsock1.SendData (first)
  StatusTxt.Caption = "Sending Message"
  StatusTxt.Refresh
  WaitFor ("250")
  Winsock1.SendData (Second)
  WaitFor ("250")
  Winsock1.SendData ("data" + vbCrLf)
  WaitFor ("354")
  Winsock1.SendData (Eighth + vbCrLf)
  Winsock1.SendData (Seventh + vbCrLf)
  Winsock1.SendData ("." + vbCrLf)
  WaitFor ("250")
  Winsock1.SendData ("quit" + vbCrLf)
  StatusTxt.Caption = "Disconnecting"
  StatusTxt.Refresh
  WaitFor ("221")
  Winsock1.Close
 Else
  MsgBox (Str(Winsock1.State))
 End If
End Sub

Sub WaitFor(ResponseCode As String)
 '检查是否收到SMTP服务器的返回代码
 Start = Timer
 While Len(Response) = 0
  Tmr = Timer - Start
  DoEvents
  If Tmr > 50 Then
   MsgBox "SMTP service error, timed out while waiting for response" _
      , 64, MsgTitle
   Exit Sub
  End If
 Wend

 While Left(Response, 3) <> ResponseCode
  Tmr = Timer - Start
  DoEvents
  If Tmr > 50 Then
   MsgBox "SMTP service error, impromper response code. _
       Code should have been: " + ResponseCode + " Code recieved: " _
       + Response, 64, MsgTitle
   Exit Sub
  End If
 Wend
 Response = "" ' Response清空
End Sub

Private Sub Command1_Click()
 SendEmail txtEmailServer.Text, txtFromName.Text, _
 txtFromEmailAddress.Text, txtToEmailAddress.Text, _
 txtToEmailAddress.Text, txtEmailSubject.Text, _
 txtEmailBodyOfMessage.Text, txtFromEmialPassword.Text, _
 txtFromEmialUsername.Text, EmailNeedCheck.Value
 StatusTxt.Caption = "Mail Sent"
 StatusTxt.Refresh
 Beep
 Close
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
 ' 接收SMTP服务器的信息
 Winsock1.GetData Response
End Sub

  在运行本程序前请先上网,根据实际值填写文本框后点击发送邮件按钮,至此一封具有安全认证服务功能的Email发出了。

VB SMTP用户验证发送mail的更多相关文章

  1. SSRS1:配置SMTP Server发送mail

    为了使用SSRS发送mail,必须为Reporting service配置SMTP Server. 1,在Reporting Service Configuration Manager中配置Email ...

  2. java 发送 mail 纯文本发送和html格式发送

    一:需要引入mail maven jar包 <!--邮件发送包--> <dependency> <groupId>javax.mail</groupId> ...

  3. 使用SpringBoot发送mail邮件

    1.前言 发送邮件应该是网站的必备拓展功能之一,注册验证,忘记密码或者是给用户发送营销信息.正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在springboot提供了一套更简易使用 ...

  4. SMTP用户枚举原理简介及相关工具

    前言 SMTP是安全测试中比较常见的服务类型,其不安全的配置(未禁用某些命令)会导致用户枚举的问题,这主要是通过SMTP命令进行的.本文将介绍SMTP用户枚举原理以及相关工具. SMTP SMTP命令 ...

  5. 简单的邮件发送mail.jar

    public class MailSender { final static Logger logger = Logger.getLogger(MailSender.class); /** * 发送简 ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)

    系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...

  7. [Firefly引擎][学习笔记一][已完结]带用户验证的聊天室

    原地址:http://bbs.9miao.com/thread-44571-1-1.html 前言:早在群里看到大鸡蛋分享他们团队的Firefly引擎,但一直没有时间去仔细看看,恰好最近需要开发一个棋 ...

  8. Tornado(cookie、XSRF、用户验证)

      --------------------Cookie操作-------------------- 1.设置Cookie     1.set_cookie(name,value,domain=Non ...

  9. python_tornado_session用户验证

    什么是session? -- Django中带有session,tornado中自己写 -- 逻辑整理 用户请求过来,验证通过,随机生成一个字符串当作value返回给浏览器, 在服务器中用户信息与随机 ...

随机推荐

  1. Thinkpad 拆光驱更换光驱硬盘支架、拆光驱面板 T400 T440

    拆光驱.硬盘装支架的环节就不多说了.主要说下拆光驱面板. 先拿细物(区别针.回形针),捅这个洞,就能把光驱仓打开弹出来后,反过来,这里有个卡扣放大看,按住这卡扣,然后往外掰,把面板掰出来 掰出来的面板 ...

  2. Unity 中的坐标系

    说明: 注意几点: 0 行向量右乘矩阵与列向量左乘矩阵,两个矩阵互为逆矩阵 1 法线转换与mul,mul函数左乘矩阵当列矩阵计算,右乘当行矩阵计算 2 叉乘与左右手系,左手系用左手,右手系用右手,ax ...

  3. SQL 截取字段空格之前的数据

    MYSQL group by left(city,LOCATE(' ',city)) SQL select a,left(a,charindex( ' ',a)) FROM test SELECT g ...

  4. lca最近公共祖先(st表/倍增)

    大体思路 1.求出每个元素在树中的深度 2.用st表预处理的方法处理出f[i][j],f[i][j]表示元素i上方第2^j行对应的祖先是谁 3.将较深的点向上挪,直到两结点的深度相同 4.深度相同后, ...

  5. abap table control里面各种属性和事件的写法

    SAP中,Table Control是在Screen中用的最广泛的控件之一了,可以实现对多行数据的编辑. 简单来说,Table Control是一组屏幕元素在Screen上的重复出现,这就是它与普通屏 ...

  6. 日期和时间-time时间模块

    时间的检测 #时间的检测 #导入时间模块 import time #返回当前时区与格林尼治所在时区的相差秒数(推荐) print(time.timezone) #输出结果:-28800 #返回当前时区 ...

  7. Zookeeper入门看这篇就够了!!

    Zookeeper是什么 官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名 ...

  8. Java基础笔记(一)——JDK、JRE、JVM

    JDK.JRE和JVM三者的关系 Java程序执行过程 JVM(java virtual machine) 注:由于各种操作系统(windows.linux等)支持的指令集(二进制可执行代码)不同,程 ...

  9. 查找库中的某个函数,grep命令的用法。

    程序中调用了某个库中的函数,我想知道这个函数具体的作用,就必须去看这个库的源代码. 那么问题来了:如何从库中众多的.h文件中,得知我想要的函数在哪个文件里? 最后用grep命令成功解决. 具体用法:先 ...

  10. 一份比较完整的gulpfile.js

    var gulp = require('gulp'); //工具 var autoprefixer = require('gulp-autoprefixer'); var include = requ ...