|
2 | 2 |
|
3 | 3 | 本项目是记录自己在学习Go语言的过程中遇到的思考与感悟。本项目大量参考借鉴甚至是复制了其他类似的项目。感谢每一个项目,致敬每一位Gopher!尽可能的熟练使用Go语言,尽可能的深入理解Go语言。努力成为Go语言特长型程序员。学习Go语言,面向信仰编程!作者:[0e0w](https://github.com/0e0w/LearnGolang)。Less is More or Less is Less.
|
4 | 4 |
|
5 |
| -本项目创建于2020年9月1日,最近的一次更新日期为2021年9月8日。本项目会持续更新,直到海枯石烂。 |
| 5 | +本项目创建于2020年9月1日,最近的一次更新日期为2021年9月9日。本项目会持续更新,直到海枯石烂。 |
6 | 6 |
|
7 | 7 | 项目暂计划共八章:项目未完成,持续更新整理中!
|
8 | 8 |
|
|
2802 | 2802 |
|
2803 | 2803 | ## 0x03-Go语言库包
|
2804 | 2804 |
|
| 2805 | + 本部分用来记录Go语言官方标准库的相关内容。包括很多具体的使用例子,初学者拿来即可使用,甚至不需要任何的修改。当然,此部分也包括一些优秀的第三方库,可以利用这些第三方库构建更完善的代码。 |
| 2806 | + |
2805 | 2807 | <details>
|
2806 | 2808 | <summary>Day301: 库包-Go包的管理</summary>
|
2807 | 2809 |
|
|
3046 | 3048 |
|
3047 | 3049 | </details>
|
3048 | 3050 | <details>
|
3049 |
| -<summary>Day308: 库包-Go日志处理</summary> |
| 3051 | +<summary>Day308: 库包-Go日志记录</summary> |
3050 | 3052 |
|
3051 |
| -- [ ] 本节说明: |
3052 |
| -- [x] Go语言介绍: |
| 3053 | +- [x] 本节说明:本节是用来介绍Go日志的相关内容,包括日志记录等。 |
| 3054 | + |
| 3055 | +- [x] log标准库: |
| 3056 | + |
| 3057 | + ```go |
| 3058 | + package main |
3053 | 3059 |
|
3054 |
| - - Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。 |
3055 |
| -- [x] Go语言命令: |
| 3060 | + import ( |
| 3061 | + "io" |
| 3062 | + "log" |
| 3063 | + "os" |
| 3064 | + "time" |
| 3065 | + ) |
3056 | 3066 |
|
3057 |
| - - go run hello.go //编译运行hello.go |
| 3067 | + func main() { |
| 3068 | + // 日志保存到文件中-开始 |
| 3069 | + filename := time.Now().Format("app-20060102150405") + ".log" |
| 3070 | + f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) |
| 3071 | + if err != nil { |
| 3072 | + log.Fatal(err) |
| 3073 | + } |
| 3074 | + defer f.Close() |
| 3075 | + writers := []io.Writer{ |
| 3076 | + f, |
| 3077 | + os.Stdout} |
| 3078 | + fileAndStdoutWriter := io.MultiWriter(writers...) |
| 3079 | + logger := log.New(fileAndStdoutWriter, "", log.Ldate|log.Ltime) |
| 3080 | + // 日志保存到文件中-结束 |
| 3081 | + |
| 3082 | + logger.Println("Hello World!") |
| 3083 | + ``` |
| 3084 | + |
3058 | 3085 | - [ ] 本节案例:
|
3059 | 3086 |
|
3060 | 3087 | </details>
|
|
3101 | 3128 | <summary>Day311: 库包-Go电子邮件</summary>
|
3102 | 3129 |
|
3103 | 3130 | - [ ] 本节说明:本节介绍Go语言中电子邮件的发送内容。
|
3104 |
| -- [x] Go语言介绍: |
| 3131 | + |
| 3132 | +- [x] net/smtp标准库: |
| 3133 | + |
| 3134 | + ```go |
| 3135 | + package main |
3105 | 3136 |
|
3106 |
| - - Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。 |
3107 |
| -- [x] Go语言命令: |
| 3137 | + import ( |
| 3138 | + "bufio" |
| 3139 | + "encoding/base64" |
| 3140 | + "flag" |
| 3141 | + "fmt" |
| 3142 | + "io" |
| 3143 | + "log" |
| 3144 | + "net/smtp" |
| 3145 | + "os" |
| 3146 | + "strings" |
| 3147 | + "time" |
| 3148 | + ) |
3108 | 3149 |
|
3109 |
| - - go run hello.go //编译运行hello.go |
| 3150 | + //发送邮件的逻辑函数。这个例子大部分是66所写,感谢66。 |
| 3151 | + func SendMail(user, password, host, to, subject, body, mailtype string) error { |
| 3152 | + hp := strings.Split(host, ":") |
| 3153 | + auth := smtp.PlainAuth("", user, password, hp[0]) |
| 3154 | + var content_type string |
| 3155 | + if mailtype == "html" { |
| 3156 | + content_type = "Content-Type: text/" + mailtype + "; charset=UTF-8" |
| 3157 | + } else { |
| 3158 | + content_type = "Content-Type: text/plain" + "; charset=UTF-8" |
| 3159 | + } |
| 3160 | + |
| 3161 | + // msg := []byte("To: " + to + "\r\nFrom: " + user + "<" + user + ">\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + body) |
| 3162 | + msg := []byte("To: " + to + "\r\nFrom: " + "nmccb" + "<" + user + ">\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + body) |
| 3163 | + |
| 3164 | + send_to := strings.Split(to, ";") |
| 3165 | + err := smtp.SendMail(host, auth, user, send_to, msg) |
| 3166 | + return err |
| 3167 | + } |
| 3168 | + |
| 3169 | + func main() { |
| 3170 | + // 日志保存到文件中-开始 |
| 3171 | + filename := time.Now().Format("20060102150405") + ".log" |
| 3172 | + f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) |
| 3173 | + if err != nil { |
| 3174 | + log.Fatal(err) |
| 3175 | + } |
| 3176 | + defer f.Close() |
| 3177 | + writers := []io.Writer{ |
| 3178 | + f, |
| 3179 | + os.Stdout} |
| 3180 | + fileAndStdoutWriter := io.MultiWriter(writers...) |
| 3181 | + logger := log.New(fileAndStdoutWriter, "", log.Ldate|log.Ltime) |
| 3182 | + // 日志保存到文件中-结束 |
| 3183 | + |
| 3184 | + url := "http://127.0.0.1" |
| 3185 | + |
| 3186 | + host := "smtp.163.com:25" |
| 3187 | + username := "username@163.com" |
| 3188 | + password := "password" |
| 3189 | + |
| 3190 | + logger.Println("程序启动,准备发送邮件!") |
| 3191 | + |
| 3192 | + var toFileList string |
| 3193 | + |
| 3194 | + flag.StringVar(&toFileList, "f", "", "指定发送的文件,换行结束。") |
| 3195 | + flag.Parse() |
| 3196 | + |
| 3197 | + if toFileList == "" { |
| 3198 | + fmt.Print("请通过参数 -f 指定接收的邮箱列表!") |
| 3199 | + return |
| 3200 | + } |
| 3201 | + if !strings.HasSuffix(url, "/") { |
| 3202 | + url += "/" |
| 3203 | + } |
| 3204 | + if toFileList != "" { |
| 3205 | + f, _ := os.Open(toFileList) |
| 3206 | + defer f.Close() |
| 3207 | + r := bufio.NewReader(f) |
| 3208 | + for { |
| 3209 | + if line, _, err := r.ReadLine(); err == nil { |
| 3210 | + email := string(line) |
| 3211 | + diaoyuurl := url + email[0:strings.Index(email, "@")] |
| 3212 | + |
| 3213 | + subject := "=?UTF-8?B?" + base64.StdEncoding.EncodeToString([]byte("紧急通知:体检报名")) + "?=" |
| 3214 | + body := "<p>全体同事:</p> <p>为了解和掌握员工健康状况、确保员工合理安排健康检查和职业病危害因素检测活动。</p> <p>本年度体检计划将进行调整,从8月开始将分批次安排员工进行上岗前职业健康检查以及在岗期间职业健康检查。</p> <p>请打开如下链接选择合适的时间进行体检报名。每个批次人数报满即止,报名时间截止9月3日。</p> <p>请尽快点击下面链接按照步骤进行报名!</p><a href=\"" + diaoyuurl + "\">第一步:点击填写报名信息</a></p></p><a href=\"http://127.0.0.1\">第二步:点击查看是否报名成功</a></p>" |
| 3215 | + logger.Println("准备 " + email + " 发送邮件!") |
| 3216 | + if err := SendMail(username, password, host, email, subject, body, "html"); err != nil { |
| 3217 | + logger.Println("邮件 "+email+" 发送失败!\n", err.Error()) |
| 3218 | + } else { |
| 3219 | + logger.Println("邮件 " + email + " 发送成功!") |
| 3220 | + time.Sleep(time.Duration(3) * time.Second) |
| 3221 | + logger.Println("休眠 3 秒继续发送!请耐心等待!") |
| 3222 | + } |
| 3223 | + } else { |
| 3224 | + break |
| 3225 | + } |
| 3226 | + } |
| 3227 | + } |
| 3228 | + logger.Println("邮件已经全部发送完毕!") |
| 3229 | + |
| 3230 | + } |
| 3231 | + ``` |
| 3232 | + |
3110 | 3233 | - [ ] 本节案例:
|
3111 | 3234 |
|
3112 | 3235 | </details>
|
|
0 commit comments