Golang使用lxn/walk做GUI界面开发:邮件群发器

前端之家收集整理的这篇文章主要介绍了Golang使用lxn/walk做GUI界面开发:邮件群发器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我也是刚刚使用walk这个组件,很多控件接口不熟悉,把我上次发的邮件群发器修改成图形界面的,线程发送邮件,gob库保存数据等。只提供作学习交流,仅供参考(界面很烂)。

接下来是main.go的代码

  1. //Multi-SendEmailprojectmain.go
  2. packagemain
  3.  
  4. import(
  5. "bufio"
  6. "encoding/gob"
  7. "errors"
  8. "fmt"
  9. "io"
  10. "net/smtp"
  11. "os"
  12. "strconv"
  13. "strings"
  14. "time"
  15. )
  16.  
  17. import(
  18. "github.com/lxn/walk"
  19. ."github.com/lxn/walk/declarative"
  20. )
  21.  
  22. typeShuJustruct{
  23. Namestring
  24. Pwdstring
  25. Hoststring
  26. Subjectstring
  27. Bodystring
  28. Sendstring
  29. }
  30.  
  31. funcSendMail(user,password,host,to,subject,body,mailtypestring)error{
  32. fmt.Println("Sendto"+to)
  33. //fmt.Println(user,mailtype)
  34. hp:=strings.Split(host,":")
  35. auth:=smtp.PlainAuth("",user,hp[0])
  36. varcontent_typestring
  37. ifmailtype=="html"{
  38. content_type="Content-Type:text/html;charset=UTF-8"
  39. }else{
  40. content_type="Content-Type:text/plain;charset=UTF-8"
  41. }
  42. body=strings.TrimSpace(body)
  43. msg:=[]byte("To:"+to+"\r\nFrom:"+user+"<"+user+">\r\nSubject:"+subject+"\r\n"+content_type+"\r\n\r\n"+body)
  44. send_to:=strings.Split(to,";")
  45. err:=smtp.SendMail(host,auth,send_to,msg)
  46. iferr!=nil{
  47. fmt.Println(err.Error())
  48. }
  49. returnerr
  50. }
  51.  
  52. funcreadLine2Array(filenamestring)([]string,error){
  53. result:=make([]string,0)
  54. file,err:=os.Open(filename)
  55. iferr!=nil{
  56. returnresult,errors.New("OpenfileFailed.")
  57. }
  58. deferfile.Close()
  59. bf:=bufio.NewReader(file)
  60. for{
  61. line,isPrefix,err1:=bf.ReadLine()
  62. iferr1!=nil{
  63. iferr1!=io.EOF{
  64. returnresult,errors.New("ReadLinenofinish")
  65. }
  66. break
  67. }
  68. ifisPrefix{
  69. returnresult,errors.New("Lineistoolong")
  70. }
  71. str:=string(line)
  72. result=append(result,str)
  73. }
  74. returnresult,nil
  75. }
  76.  
  77. funcDelArrayVar(arr[]string,strstring)[]string{
  78. str=strings.TrimSpace(str)
  79. fori,v:=rangearr{
  80. v=strings.TrimSpace(v)
  81. ifv==str{
  82. ifi==len(arr){
  83. returnarr[0:i-1]
  84. }
  85. ifi==0{
  86. returnarr[1:len(arr)]
  87. }
  88. a1:=arr[0:i]
  89. a2:=arr[i+1:len(arr)]
  90. returnappend(a1,a2...)
  91. }
  92. }
  93. returnarr
  94. }
  95.  
  96. funcLoadData(){
  97. fmt.Println("LoadData")
  98. file,err:=os.Open("data.dat")
  99. deferfile.Close()
  100. iferr!=nil{
  101. fmt.Println(err.Error())
  102. SJ.Name="用户名"
  103. SJ.Pwd="用户密码"
  104. SJ.Host="SMTP服务器:端口"
  105. SJ.Subject="邮件主题"
  106. SJ.Body="邮件内容"
  107. SJ.Send="要发送的邮箱,每行一个"
  108. return
  109. }
  110. dec:=gob.NewDecoder(file)
  111. err2:=dec.Decode(&SJ)
  112. iferr2!=nil{
  113. fmt.Println(err2.Error())
  114. SJ.Name="用户名"
  115. SJ.Pwd="用户密码"
  116. SJ.Host="SMTP服务器:端口"
  117. SJ.Subject="邮件主题"
  118. SJ.Body="邮件内容"
  119. SJ.Send="要发送的邮箱,每行一个"
  120. }
  121. }
  122.  
  123. funcSaveData(){
  124. fmt.Println("SaveData")
  125. file,err:=os.Create("data.dat")
  126. deferfile.Close()
  127. iferr!=nil{
  128. fmt.Println(err)
  129. }
  130. enc:=gob.NewEncoder(file)
  131. err2:=enc.Encode(SJ)
  132. iferr2!=nil{
  133. fmt.Println(err2)
  134. }
  135. }
  136.  
  137. varSJShuJu
  138. varruningbool
  139. varchEndchanbool
  140.  
  141. funcmain(){
  142. LoadData()
  143. chEnd=make(chanbool)
  144. varemails,msgBox*walk.TextEdit
  145. varuser,subject*walk.LineEdit
  146. varstartBtn*walk.PushButton
  147. MainWindow{
  148. Title:"邮件群发器By一曲忧伤",MinSize:Size{800,600},Layout:HBox{},Children:[]Widget{
  149. TextEdit{AssignTo:&emails,Text:SJ.Send,ToolTipText:"待发送邮件列表,每行一个"},VSplitter{
  150. Children:[]Widget{
  151. LineEdit{AssignTo:&user,Text:SJ.Name,CueBanner:"请输入邮箱用户名"},LineEdit{AssignTo:&password,Text:SJ.Pwd,PasswordMode:true,CueBanner:"请输入邮箱登录密码"},LineEdit{AssignTo:&host,Text:SJ.Host,CueBanner:"SMTP服务器:端口"},LineEdit{AssignTo:&subject,Text:SJ.Subject,CueBanner:"请输入邮件主题……"},TextEdit{AssignTo:&body,Text:SJ.Body,ToolTipText:"请输入邮件内容",ColumnSpan:2},TextEdit{AssignTo:&msgBox,ReadOnly:true},PushButton{
  152. AssignTo:&startBtn,Text:"开始群发",OnClicked:func(){
  153. SJ.Name=user.Text()
  154. SJ.Pwd=password.Text()
  155. SJ.Host=host.Text()
  156. SJ.Subject=subject.Text()
  157. SJ.Body=body.Text()
  158. SJ.Send=emails.Text()
  159. SaveData()
  160.  
  161. ifruning==false{
  162. runing=true
  163. startBtn.SetText("停止发送")
  164. gosendThread(msgBox,emails)
  165. }else{
  166. runing=false
  167. startBtn.SetText("开始群发")
  168. }
  169. },},}.Run()
  170. }
  171.  
  172. funcsendThread(msgBox,es*walk.TextEdit){
  173. sendTo:=strings.Split(SJ.Send,"\r\n")
  174. susscess:=0
  175. count:=len(sendTo)
  176. forindex,to:=rangesendTo{
  177. ifruning==false{
  178. break
  179. }
  180. msgBox.SetText("发送到"+to+"..."+strconv.Itoa(int((float32(index)/float32(count))*100))+"%")
  181. err:=SendMail(SJ.Name,SJ.Pwd,SJ.Host,SJ.Subject,SJ.Body,"html")
  182. iferr!=nil{
  183. msgBox.AppendText("\r\n失败:"+err.Error()+"\r\n")
  184. iferr.Error()=="550MailBoxnotfoundoraccessdenied"{
  185. SJ.Send=strings.Join(DelArrayVar(strings.Split(SJ.Send,"\r\n"),to),"\r\n")
  186. es.SetText(SJ.Send)
  187. }
  188. time.Sleep(1*time.Second)
  189. continue
  190. }else{
  191. susscess++
  192. msgBox.AppendText("\r\n发送成功!")
  193. SJ.Send=strings.Join(DelArrayVar(strings.Split(SJ.Send,"\r\n")
  194. es.SetText(SJ.Send)
  195. }
  196. time.Sleep(1*time.Second)
  197. }
  198. SaveData()
  199. msgBox.SetText("停止发送!共成功"+strconv.Itoa(susscess)+"条\r\n")
  200. }

然后是walk程序所用的main.manifest,完全照抄官方的,还没研究其中意思:

  1. <?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>
  2. <assemblyxmlns="urn:schemas-microsoft-com:asm.v1"manifestVersion="1.0">
  3. <assemblyIdentityversion="1.0.0.0"processorArchitecture="*"name="SomeFunkyNameHere"type="win32"/>
  4. <dependency>
  5. <dependentAssembly>
  6. <assemblyIdentitytype="win32"name="Microsoft.Windows.Common-Controls"version="6.0.0.0"processorArchitecture="*"publicKeyToken="6595b64144ccf1df"language="*"/>
  7. </dependentAssembly>
  8. </dependency>
  9. </assembly>

通过这个main.manifest执行(如果walk安装好了,应该就有这个命令):

  1. rsrc-manifestmain.manifest-orsrc.syso

上图是rsrc命令的参数列表,比如我为自已的程序加个ico图标:

  1. rsrc-manifestmain.manifesticoicon.ico-orsrc.syso

附上软件运行截图:

总结:只要熟悉这些非常强大的第三方库,Go应该也可以做出非常不错的图形应用程序,对于接触C、C++过晚的朋友来说非常合适。

猜你在找的Go相关文章