找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7737|回复: 5

[讨论]如何做一个邮件发送程序?

 火.. [复制链接]

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2005-7-14 23:09:11 | 显示全部楼层 |阅读模式
<P>要求:</P>
<P>一,不能用现成的接口,如MAPI等.</P>
<P>二,可以由用户填写SMTP服务器.</P>
<P>我已经做了一个,近期会传上来.我是使用的Winsock控件实现的,使用ESMTP协议.</P>
<P>关键点:ESMTP协议,BASE64编码约定</P>
我就是嗷嗷叫的老马了......

3

主题

50

回帖

0

精华

银牌会员

积分
444
发表于 2010-10-21 09:45:04 | 显示全部楼层
2001年的时候做过一个,可以发送附件的,Base64对附件进行编码发送,因为后来用了一段时间就没用了,源代码等我找找,拿来交流下。
我是晶晶

3

主题

50

回帖

0

精华

银牌会员

积分
444
发表于 2011-8-10 11:41:44 | 显示全部楼层
去年老马搬家,硬是找不到论坛入口了,还好今天闲的无聊,搜索我自己的ID号又找到老马的紫水晶了;因此顺便发下我2001年做的那个Email发送程序,这个程序是可以附件编码后发送的。
  1. Private Sub Command1_Click()
  2. Dim TIM As Long
  3. Dim FnfileNas As Integer, TmpStr As String, successOut As Boolean
  4. Dim nFno1 As Integer, nFno2 As Integer, ErrinfoStr As String
  5. Dim reSendNum As Integer
  6. On Error GoTo Errcode
  7. reSendNum = 0
  8. Command1.Enabled = False
  9. Call SendFJ

  10. If Makefile <> "" Then
  11.     '--------出错,记录日志
  12.     GoTo ErrClear
  13. End If

  14. If Trim(Text1.Text) = "" Then
  15.     MainErr = MainErr & "Text1 is Empty Info." & vbCrLf
  16.     GoTo ErrClear
  17. End If
  18. If Trim(Text2.Text) = "" Then
  19.     MainErr = MainErr & "Text2 is Empty Info." & vbCrLf
  20.     GoTo ErrClear
  21. End If
  22. If Trim(Text3.Text) = "" Then
  23.     MainErr = MainErr & "Text3 is Empty Info." & vbCrLf
  24.     GoTo ErrClear
  25. End If
  26. If Trim(Text4.Text) = "" Then
  27.     MainErr = MainErr & "Text4 is Empty Info." & vbCrLf
  28.     GoTo ErrClear
  29. End If
  30. If Trim(Text5.Text) = "" Then
  31.     MainErr = MainErr & "Text5 is Empty Info." & vbCrLf
  32.     GoTo ErrClear
  33. End If
  34. If Trim(Text6.Text) = "" Then
  35.     MainErr = MainErr & "Text6 is Empty Info." & vbCrLf
  36.     GoTo ErrClear
  37. End If
  38. If Trim(Text7.Text) = "" Then
  39.     MainErr = MainErr & "Text7 is Empty Info." & vbCrLf
  40.     GoTo ErrClear
  41. End If
  42. st:
  43. reSendNum = reSendNum + 1
  44. If reSendNum > 3 Then
  45.     MainErr = MainErr & "已重试3次,仍无法正常发送邮件。怀疑是网络故障!" & vbCrLf
  46.     GoTo ErrClear
  47. End If
  48. ErrinfoStr = ""
  49. Text8.Text = ""
  50. TIM = Timer
  51. Winsock1.Close
  52. '-----------连接服务器
  53. Winsock1.Connect Text7.Text, 25
  54. DETDATAS = ""
  55. '-----------
  56. Do Until InStr(DETDATAS, "220")
  57.     If Timer - TIM > 30 Then GoTo st
  58.     DoEvents
  59. Loop
  60. DETDATAS = ""
  61. '----------------HELLO
  62. TIM = Timer
  63. Winsock1.SendData "EHLO " & Text1.Text & vbCrLf
  64. Do Until InStr(DETDATAS, "250")
  65.     If Timer - TIM > 30 Then GoTo st
  66.     If InStr(DETDATAS, "550") Then
  67.         ErrinfoStr = ErrinfoStr & DETDATAS
  68.         GoTo closeWS
  69.     End If
  70.    
  71.     DoEvents
  72. Loop
  73. DETDATAS = ""
  74. '-----------------AUTH 登录---------
  75. TIM = Timer
  76. Winsock1.SendData "AUTH LOGIN" & vbCrLf
  77. Do Until InStr(DETDATAS, "334")
  78.     If Timer - TIM > 30 Then GoTo st
  79.     DoEvents
  80. Loop
  81. '-------------------'发送名字
  82. TIM = Timer
  83. DETDATAS = ""
  84. Winsock1.SendData Base64En(Text1.Text) & vbCrLf
  85. Do Until InStr(DETDATAS, "334")
  86.     If Timer - TIM > 30 Then GoTo st
  87.     DoEvents
  88. Loop
  89. '-------------------发送密码
  90. TIM = Timer
  91. DETDATAS = ""
  92. Winsock1.SendData Base64En(Text2.Text) & vbCrLf
  93. Do Until InStr(DETDATAS, "235")
  94.     If Timer - TIM > 30 Then GoTo st
  95.     If InStr(DETDATAS, "535") Then
  96.         ErrinfoStr = ErrinfoStr & DETDATAS
  97.         GoTo closeWS
  98.     End If
  99.     If InStr(DETDATAS, "502") Then
  100.         ErrinfoStr = ErrinfoStr & DETDATAS
  101.         GoTo closeWS
  102.     End If
  103.     DoEvents
  104. Loop
  105. '-----------------发信--
  106. '-地址---------------
  107. TIM = Timer
  108. DETDATAS = ""
  109. Winsock1.SendData "MAIL From: <" & Text6.Text & ">" & vbCrLf
  110. Do Until InStr(DETDATAS, "250")
  111.     If Timer - TIM > 30 Then GoTo st
  112.     If InStr(DETDATAS, "550") Then
  113.         ErrinfoStr = ErrinfoStr & DETDATAS
  114.         GoTo closeWS
  115.     End If
  116.     If InStr(DETDATAS, "501") Then
  117.         ErrinfoStr = ErrinfoStr & DETDATAS
  118.         GoTo closeWS
  119.     End If
  120.     DoEvents
  121. Loop
  122. '---------
  123. DETDATAS = ""
  124. TIM = Timer
  125. Winsock1.SendData "RCPT TO: <" & Text3.Text & ">" & vbCrLf
  126. Do Until InStr(DETDATAS, "250")
  127.     If Timer - TIM > 30 Then GoTo st
  128.     If InStr(DETDATAS, "501") Then
  129.         ErrinfoStr = ErrinfoStr & DETDATAS
  130.         GoTo closeWS
  131.     End If
  132.     DoEvents
  133. Loop
  134. DETDATAS = ""
  135. '-----------------------正文------------------
  136. TIM = Timer
  137. Winsock1.SendData "DATA  " & vbCrLf
  138. Do Until InStr(DETDATAS, "354")
  139.     If Timer - TIM > 30 Then GoTo st
  140.     If InStr(DETDATAS, "501") Then
  141.         ErrinfoStr = ErrinfoStr & DETDATAS
  142.         GoTo closeWS
  143.     End If
  144.     DoEvents
  145. Loop
  146. '-----------------邮件内容
  147. TIM = Timer
  148. DETDATAS = ""

  149.     'Winsock1.SendData "From: " & Text6.Text & vbCrLf
  150.     'Winsock1.SendData "To: " & Text3.Text & vbCrLf
  151. 'Winsock1.SendData " " & vbLf
  152.     'Winsock1.SendData "Subject: " & Text4.Text & vbCrLf
  153. 'Winsock1.SendData " " & vbCrLf
  154.     'Winsock1.SendData Text5.Text & vbCrLf
  155. 'Winsock1.SendData "SDADSAFSADF" & vbLf
  156. 'Winsock1.SendData vbLf
  157.     'Pause 1
  158.     'Winsock1.SendData "." & vbCrLf
  159.     '---------------------------------=======以文件形式发送邮件 将制作好的邮件源文件发送出去。emailtest.txt
  160.     FnfileNas = FreeFile
  161.     Open App.Path + "" + "email.bin" For Input As #FnfileNas
  162.     Do While Not EOF(FnfileNas)
  163.         Line Input #FnfileNas, TmpStr
  164.         Winsock1.SendData TmpStr & vbCrLf
  165.     Loop
  166.     Close #FnfileNas

  167. ''---------------------构造邮件内容,并发送
  168. '    TmpStr = "Date:" & Format(Date, "ddd , YYYY-MM-DD") & Format(Timer, " HH:mm:SS") & " +0800" & vbCrLf & _
  169. '            "From: " & Chr(34) & "jesseza" & Chr(34) & " <" & Text6.Text & ">" & vbCrLf & _
  170. '            "To: " & Chr(34) & "jesseza" & Chr(34) & " <" & Text6.Text & ">" & vbCrLf & _
  171. '            "Subject: Gushan Water Monitoring Station " & Format(Date, "YYYY-MM-DD") & Format(Timer, " HH:mm:SS") & vbCrLf & _
  172. '            "X-mailer: Foxmail 6, 15, 201, 23 [cn]" & vbCrLf & _
  173. '            "" & vbCrLf & _
  174. '             Format(Date, "YYYY-MM-DD") & Format(Timer, " HH:mm:SS") & ", Internet is Connect OK." & vbCrLf & _
  175. '            "" & vbCrLf & _
  176. '             vbCrLf
  177. '    TmpStr = TmpStr & vbCrLf
  178. '    Winsock1.SendData TmpStr & vbCrLf


  179. '‘--------
  180. DETDATAS = ""
  181. Winsock1.SendData vbCrLf & "." & vbCrLf  '发送完毕,发送结束符号。。

  182. Do Until InStr(DETDATAS, "250")
  183.     If Timer - TIM > 90 Then GoTo st
  184.     If InStr(DETDATAS, "451") Then
  185.         ErrinfoStr = ErrinfoStr & DETDATAS
  186.         GoTo closeWS
  187.     End If
  188.     If InStr(DETDATAS, "502") Then
  189.         ErrinfoStr = ErrinfoStr & DETDATAS
  190.         GoTo closeWS
  191.     End If
  192.     DoEvents
  193. Loop
  194. Winsock1.SendData "QUIT " & vbCrLf
  195. '-----------------关闭
  196. successOut = True
  197. GoTo ZCGB
  198. closeWS:
  199.     successOut = False

  200. ZCGB:
  201. Winsock1.Close

  202. Command1.Enabled = True
  203.    
  204.    
  205.     If successOut Then
  206.         Text9.Text = "发信成功 :) "
  207.     Else
  208.         Text9.Text = "发信失败!!!"
  209.         GoTo ErrClear
  210.     End If
  211. Exit Sub
  212. ErrClear: '-------记录出错日志。
  213.     Close #FnfileNas
  214.     Close #nFno1
  215.     Winsock1.Close
  216.     If FileLen(App.Path & "\Email.log") > 500000 Then
  217.         nFno2 = FreeFile
  218.         Open App.Path & "\Email.log" For Output As #nFno2
  219.             Print #nFno2, Format(Now, "YYYY-MM-DD HH:mm:SS") & ",错误日志已超过500K,删除前面的。"
  220.         Close #nFno2
  221.     End If
  222.     nFno1 = FreeFile
  223.     Open App.Path & "\Email.log" For Append As #nFno1
  224.         Print #nFno1, Format(Now, "YYYY-MM-DD HH:mm:SS")
  225.         If MainErr <> "" Then
  226.             Print #nFno1, MainErr
  227.         End If
  228.         If Makefile <> "" Then
  229.             Print #nFno1, Makefile
  230.         End If
  231.         If ErrinfoStr <> "" Then
  232.             Print #nFno1, ErrinfoStr
  233.         End If
  234.     Close #nFno1
  235.     Command1.Enabled = True
  236. Exit Sub
  237. Errcode:
  238.     Resume ErrClear

  239. End Sub
复制代码
我是晶晶

3

主题

50

回帖

0

精华

银牌会员

积分
444
发表于 2011-8-10 11:47:43 | 显示全部楼层
上面的代码只是发送邮件的主过程,相信已经能说明问题了,如果需要我再发邮件包构造的那块代码出来,因为是2001年写的程序,今年正好要用到,所以翻出来改了一下,自动定时发送邮件,Winsock返回信息的检索还是用了原来比较弱智的方式,懒得改了,反正可以正常运行。
Email.GIF
自己定义收发SMTP信息等等的都加上了,因为这个程序是一运行就发送一份预订好格式的邮件出去,所以图片就抓了个编辑模式的凑个数。
我是晶晶

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-8-10 16:24:18 | 显示全部楼层
jessezappy 发表于 2011-8-10 11:47
上面的代码只是发送邮件的主过程,相信已经能说明问题了,如果需要我再发邮件包构造的那块代码出来,因为是 ...

给个源码压缩包啊。。。
不然不知道你的代码的含义。。。

5

主题

39

回帖

1

精华

铂金会员

积分
1567
发表于 2011-8-10 19:04:06 | 显示全部楼层
嗯 。vb还好有 winsock控件,比较简便。
另外一种方法就是自己填写格式,然后ws2_32!send.....
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表