Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 日本视频免费看,91免费在线视频观看,亚洲久久在线

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          每日一庫之Go 強大而靈活的電子郵件庫:email


          擊上方藍色“Go語言中文網”關注我們,領全套Go資料,每天學習 Go 語言

          發送郵件是一個很常見的需求:用戶郵箱驗證、郵箱召回等。Go 語言標準庫自帶 net/smtp 庫,實現了 smtp 協議,用于發送郵件。然而這個庫比較原始,使用不方便,而且官方聲明不再增加新功能。于是乎出現了一些強大的第三方郵件庫,今天推薦的這個庫就是其中之一。

          項目地址:https://github.com/jordan-wright/email,Star 數 1.3k+。

          簡介

          email 包的設計易于使用,但又足夠靈活以免受到限制。目的是為開發者提供友好的電子郵件接口。

          該包當前支持以下功能:

          • From, To, Bcc, 和 Cc;
          • 郵件地址同時支持 "test@example.com" 和 "First Last test@example.com” 兩種形式;
          • 正文支持普通文本和 HTML;
          • 附件支持;
          • 已讀回饋;
          • 自定義協議頭;
          • 。。。

          快速使用

          先安裝:

          $ go get github.com/jordan-wright/email
          

          后使用,使用 Gmail 發送郵件:

          e := email.NewEmail()
          e.From = "Jordan Wright <test@gmail.com>"
          e.To = []string{"test@example.com"}
          e.Bcc = []string{"test_bcc@example.com"}
          e.Cc = []string{"test_cc@example.com"}
          e.Subject = "Awesome Subject"
          e.Text = []byte("Text Body is, of course, supported!")
          e.HTML = []byte("<h1>Fancy HTML is supported, too!</h1>")
          e.Send("smtp.gmail.com:587", smtp.PlainAuth("", "test@gmail.com", "password123", "smtp.gmail.com"))
          
          • 通過 NewEmail 獲取一個 Email 的實例;
          • From 設置發件人;
          • To 設置發給誰,支持多人;
          • Cc 設置抄送人,支持多人;
          • Bcc 設置密抄人,支持多人;
          • Subject 指定郵件標題;
          • Text 指定普通文本郵件正文;
          • HTML 指定 HTML 格式郵件正文;
          • 調用 Email 實例的 Send 方法進行郵件發送:第一個參數是 smtp 地址,第二個參數是 smtp.Auth 實例;

          可見該庫最終還是使用標準庫 net/smtp 進行實際的郵件發送。

          注意事項

          • From 中如果包含中文,比如:
          e.From = "Go語言中文網<polaris@studygolang.com>”
          

          收到的郵件不會顯示發件人,有人提了一個 PR 支持 non-US-ASCII,但還未被 merge;根據該 PR 的提示,我們可以這樣解決此問題:

          e.From = mime.QEncoding.Encode("UTF-8", "Go語言中文網") + "<polaris@studygolang.com>"
          
          • 如果同時指定 Text 和 HTML,則 Text 的內容會被忽略;
          • 雖然默認情況下會嘗試切換到 TLS,但如果想顯示使用 TLS,則調用 Email#SendWithTLS 方法,具體代碼如下:
          tlsConfig := &tls.Config{
           InsecureSkipVerify: true,
            ServerName:         smtpHost,
          }
          e.SendWithTLS(addr, auth, tlsConfig)
          
          • 因為 Email 結構體的字段都是導出的,因此可以通過 &email.Email{} 這種形式創建實例,并直接為各個字段賦值;

          帶附件的郵件

          如果郵件中需要帶上附件,這個庫很方便:

          e.AttachFile("test.txt")
          

          也可以是通過 io.Reader 讀取文件:

          func (e *Email) Attach(r io.Reader, filename string, c string) (a *Attachment, err error)
          

          其中 filename 是放入附件顯示的文件名,c 是 Content-Type,如果為空,則使用 application/octet-stream。

          重用連接

          該庫還支持連接池,例如:

          p, err := email.NewPool(
            "smtp.qq.com:25",
            4,
            smtp.PlainAuth("", "274768166@qq.com", "password", "smtp.qq.com"))
          
          • 第 2 個參數 4 表示最多開啟 4 個連接

          通過 p 的 Send 方法執行發送操作:

          p.Send(e, 10e9)
          

          完整例子如下:

          package main
          import (
           "log"
           "mime"
           "net/smtp"
           "net/textproto"
           "strconv"
           "sync"
           "github.com/jordan-wright/email"
          )
          func main() {
           var wg sync.WaitGroup
           ch := make(chan *email.Email, 4)
           err := sendEmailByPool(ch, &wg)
           if err != nil {
            panic(err)
           }
           for i := 0; i < 4; i++ {
            wg.Add(1)
            ch <- &email.Email{
             To:      []string{"polaris@studygolang.com"},
             From:    mime.QEncoding.Encode("UTF-8", "Go語言中文網") + "<274768166@qq.com>",
             Subject: "Pool" + strconv.Itoa(i),
             HTML:    []byte("<h1>這是 HTML 正文</h1>"),
             Headers: textproto.MIMEHeader{},
            }
           }
           wg.Wait()
           close(ch)
          }
          func sendEmailByPool(ch <-chan *email.Email, wg *sync.WaitGroup) error {
           p, err := email.NewPool(
            "smtp.qq.com:25",
            4,
            smtp.PlainAuth("", "274768166@qq.com", "password", "smtp.qq.com"))
           if err != nil {
            return err
           }
           for i := 0; i < 4; i++ {
            go func() {
             for e := range ch {
              err := p.Send(e, 10e9)
              if err != nil {
               log.Println("Send Email fail, err:", err)
              } else {
               log.Println("Send Email Successfully!")
              }
              wg.Done()
             }
            }()
           }
           return nil
          }
          

          總結

          通過上面的介紹,你應該掌握了該庫的使用,該庫是不是滿足了你對發郵件的需求?

          最后附上一個完整的帶附件的發郵件程序:

          package main
          import (
           "log"
           "mime"
           "net/smtp"
           "strings"
           "github.com/jordan-wright/email"
          )
          func main() {
           sendEmail("測試第三方 email 庫", "xuxinhua@studygolang.com")
          }
          func sendEmail(subject string, tos ...string) error {
           e := email.NewEmail()
           smtpUsername := "274768166@qq.com"
           e.From = mime.QEncoding.Encode("UTF-8", "Go語言中文網") + "<274768166@qq.com>"
           e.To = tos
           e.Subject = subject
           e.HTML = []byte("<h1>HTML 正文</h1>")
           e.AttachFile("zap.log")
           auth := smtp.PlainAuth("", smtpUsername, "password", "smtp.qq.com")
           err := e.Send("smtp.qq.com:25", auth)
           if err != nil {
            log.Println("Send Mail to", strings.Join(tos, ","), "error:", err)
            return err
           }
           log.Println("Send Mail to", strings.Join(tos, ","), "Successfully")
           return nil
          }
          
          • 測試時注意將發件人、收件人和密碼改為你自己的。

          這個適合初學者的指南中,你將學習如何創建一個響應式電子郵件模板。你將跟隨逐步說明以及代碼片段設計一個在任何設備上都看起來很棒的電子郵件模板。

          這個項目非常適合渴望掌握電子郵件設計基礎的新手!

          (本文視頻講解:java567.com)

          、為什么需要表單驗證?

          表單是Web開發中常用的交互元素,用戶通過表單提交數據給后端進行處理。然而,用戶輸入的數據不可靠,因此需要進行表單驗證,確保用戶輸入的數據符合預期。

          二、基本的表單驗證規則

          必填字段:確保用戶填寫了必填字段,如用戶名、密碼等。

          格式驗證:驗證用戶輸入的數據格式是否正確,如郵箱、手機號、日期等。

          長度驗證:驗證用戶輸入的數據長度是否符合要求,如密碼長度、字符數等。

          數字范圍驗證:驗證用戶輸入的數字是否在指定范圍內,如年齡、價格等。

          一致性驗證:驗證兩個或多個輸入字段的值是否一致,如密碼確認、郵箱確認等。

          三、使用JavaScript進行表單驗證的步驟

          1、獲取表單元素:

          const form = document.getElementById('myForm');

          2、監聽表單提交事件:

          form.addEventListener('submit', function(event) {
           event.preventDefault(); // 阻止表單的默認提交行為
           // 表單驗證邏輯
          });

          3、編寫驗證函數:

          function validateForm() {
           // 獲取表單字段的值
           const username = document.getElementById('username').value;
           const email = document.getElementById('email').value;
           // 必填字段驗證
           if (username === '' || email === '') {
           alert('用戶名和郵箱不能為空!');
           return false;
           }
           // 郵箱格式驗證
           const emailRegex = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
           if (!emailRegex.test(email)) {
           alert('請輸入正確的郵箱格式!');
           return false;
           }
           // 其他驗證邏輯...
           return true; // 表單驗證通過
          }

          4、表單驗證:

          form.addEventListener('submit', function(event) {
           event.preventDefault(); // 阻止表單的默認提交行為
           if (validateForm()) {
           form.submit(); // 提交表單
           }
          });

          5、錯誤提示:

          <form id="myForm">
            <label for="username">用戶名:</label>
            <input type="text" id="username" required>
            <br>
            <label for="email">郵箱:</label>
            <input type="email" id="email" required>
            <br>
            <button type="submit">提交</button>
          </form>

          在以上示例中,我們通過JavaScript實現了對用戶名和郵箱字段的表單驗證。在提交表單時,會先調用validateForm函數進行驗證,如果驗證通過則提交表單,否則提示錯誤信息。

          四、常用的表單驗證技巧

          使用正則表達式進行格式驗證,如郵箱、手機號等。

          使用HTML5表單驗證屬性,如required、pattern、min、max等。

          使用第三方表單驗證插件,如jQuery Validation等,簡化表單驗證的編寫。

          五、表單驗證的優化與提升

          實時驗證:使用input或change事件實時驗證用戶輸入,及時提醒用戶輸入錯誤。

          提示友好:使用合適的提示方式,如文字提示、圖標提示等,讓用戶易于理解和操作。

          全局驗證:在表單提交之前對整個表單進行驗證,確保所有字段的正確性。

          客戶端與服務器端驗證:前端表單驗證只是為了提高用戶體驗和減少無效請求,真正的安全性還需要服務器端驗證。

          通過以上步驟和技巧,你可以使用JavaScript輕松實現表單驗證,為用戶提供安全智能的交互體驗!不僅能提高用戶滿意度,也能讓你在前端開發領域脫穎而出!快來學習吧!

          六、總結

          表單驗證在Web開發中扮演著重要的角色,通過JavaScript的靈活運用,可以實現各種表單驗證需求。合理的表單驗證不僅能提升用戶體驗,還能保障數據的準確性和安全性。希望本文能夠幫助你掌握JavaScript表單驗證的基本技巧和優化方法,打造安全智能的用戶交互體驗!


          主站蜘蛛池模板: 亚洲AV综合色区无码一区爱AV| 精品视频一区二区三三区四区| 精品免费久久久久国产一区| 国产福利电影一区二区三区久久久久成人精品综合| 亚洲一区二区三区日本久久九| 蜜臀AV无码一区二区三区| 无码一区二区三区爆白浆| asmr国产一区在线| 精品少妇一区二区三区视频| 国产在线一区二区视频| 精品亚洲一区二区| 一区二区三区免费视频网站| 性色A码一区二区三区天美传媒 | 精品视频在线观看一区二区 | 正在播放国产一区| 在线精品一区二区三区| 色老板在线视频一区二区| 国产在线不卡一区| 国产婷婷色一区二区三区深爱网| 亚洲国产成人一区二区三区 | 无码AV一区二区三区无码| 亚洲av乱码中文一区二区三区| 亚洲国产精品乱码一区二区| 亚洲一区二区三区国产精品| 无码人妻精一区二区三区| 竹菊影视欧美日韩一区二区三区四区五区| 一区二区手机视频| 视频在线一区二区三区| 成人区精品一区二区不卡 | 91久久精品午夜一区二区| 久久99精品国产一区二区三区| 国产一区二区三区免费观看在线| 一区二区三区四区视频在线| 亚洲综合国产一区二区三区| 亚洲无线码在线一区观看| 91秒拍国产福利一区| 无码人妻精一区二区三区| 波多野结衣一区二区三区高清av| 国产成人精品无码一区二区老年人| 国产成人一区二区动漫精品| 精品国产亚洲一区二区在线观看|