掌握Go語言郵件發送:net/smtp實用教程與最佳實踐

掌握Go語言郵件發送:net/smtp實用教程與最佳實踐

    • 概述
    • 基本配置與初始化
      • 導入`net/smtp`包
      • 設置SMTP服務器基本信息
      • 創建SMTP客戶端實例
      • 身份驗證
    • 發送簡單文本郵件
      • 配置發件人信息
      • 構建郵件頭部信息
      • 編寫郵件正文
      • 使用`SendMail`方法發送郵件
      • 示例代碼
    • 發送帶附件的郵件
      • 郵件多部分格式簡介
      • 構建帶有附件的郵件體
      • 使用`SendMail`方法發送郵件
    • 發送HTML格式的郵件
      • HTML郵件的優勢和應用場景
      • 構建HTML郵件內容
      • 嵌入圖片和其他資源
      • 使用`SendMail`方法發送HTML郵件
    • 處理錯誤與常見問題
      • 錯誤處理策略
      • `net/smtp`常見問題及其解決方案
        • 1. **連接超時**
        • 2. **身份驗證失敗**
        • 3. **發送附件大小限制**
        • 4. **TLS/SSL要求**
      • 安全性考慮:如何安全地使用SMTP服務
    • 高級技巧與最佳實踐
      • 性能優化建議
        • 1. **使用連接池**
        • 2. **異步發送郵件**
        • 3. **批量處理郵件發送**
      • 代碼重構與維護性提升
        • 1. **模塊化郵件構建過程**
        • 2. **使用配置文件管理SMTP設置**
      • 使用第三方庫增強`net/smtp`功能
      • 真實案例分析
    • 總結
      • 核心要點回顧

在這里插入圖片描述

概述

net/smtp包是Go語言標準庫中一個專門用于實現SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)客戶端的包。它提供了一系列的功能,使開發者能夠以編程的方式發送電子郵件。通過使用這個包,開發者可以輕松實現郵件的發送功能,包括文本郵件、含附件的郵件或HTML格式的郵件。

在實際開發中,net/smtp包的應用非常廣泛,無論是發送系統通知郵件、用戶注冊驗證郵件、還是營銷推廣郵件等,都可以通過這個包來實現。其強大的功能和靈活性使其成為Go開發者在處理郵件發送任務時的首選庫。

本文將全面詳細地介紹如何使用net/smtp包,包括基礎配置、發送各類型郵件的技術細節以及如何處理常見的錯誤和問題。通過本文的學習,開發者將能夠掌握使用net/smtp包進行高效郵件發送的技能,并應用在實際的項目開發中。

基本配置與初始化

在開始使用net/smtp包發送郵件之前,首先需要進行一些基本的配置和初始化。這些步驟是確保郵件能夠正確發送到接收者郵箱的基礎。

導入net/smtp

要使用net/smtp包,首先需要在Go程序中導入它:

import ("net/smtp"
)

設置SMTP服務器基本信息

發送郵件前,需要設置SMTP服務器的地址和端口。例如,如果你使用的是Google的Gmail服務,其SMTP服務器地址為smtp.gmail.com,端口通常為587(使用TLS時)。

smtpHost := "smtp.gmail.com"
smtpPort := "587"

創建SMTP客戶端實例

為了與SMTP服務器建立連接,需要使用smtp包中的Dial函數。此函數需要SMTP服務器的地址和端口組合字符串。

// 連接到SMTP服務器
client, err := smtp.Dial(smtpHost + ":" + smtpPort)
if err != nil {log.Fatalf("Failed to connect to the SMTP server: %v", err)
}
defer client.Close()

在建立了連接之后,根據服務器的要求,可能需要進行身份驗證。大多數SMTP服務器要求安全的連接,因此,使用StartTLS方法來啟用TLS連接是很常見的需求:

// 啟用TLS連接
tlsConfig := &tls.Config{ServerName: smtpHost,
}
if err := client.StartTLS(tlsConfig); err != nil {log.Fatalf("Failed to start TLS: %v", err)
}

身份驗證

發送郵件前,需要對客戶端進行身份驗證。使用net/smtp包的PlainAuth方法可以創建一個使用普通文本方式的認證器:

auth := smtp.PlainAuth("", "your-email@gmail.com", "your-password", smtpHost)// 登錄SMTP服務器
if err := client.Auth(auth); err != nil {log.Fatalf("Failed to authenticate: %v", err)
}

這里的PlainAuth需要四個參數:一個身份標識(通常留空即可),用戶的郵箱地址,郵箱密碼,以及SMTP服務器的主機名。

發送簡單文本郵件

一旦完成了net/smtp包的基本配置和身份驗證,就可以開始發送簡單的文本郵件。這部分將詳細介紹如何設置發件人和收件人信息,構建郵件內容,以及使用net/smtp包的SendMail方法發送郵件。

配置發件人信息

在發送郵件時,首先需要定義發件人的郵箱地址。這將作為郵件頭部中的From字段。

from := "your-email@gmail.com"

構建郵件頭部信息

郵件的頭部不僅包含發件人信息,還需要包括收件人、郵件主題等信息。這些信息將按照SMTP協議的標準格式組裝成郵件頭部。

to := []string{"recipient1@example.com", "recipient2@example.com"}
subject := "Test Email"
header := fmt.Sprintf("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n", from, strings.Join(to, ", "), subject)

編寫郵件正文

郵件的正文是郵件內容的主體部分,可以是純文本格式。在這里,我們將簡單的文本作為郵件的正文。

body := "Hello, this is a test email from Go application using net/smtp package."
message := header + body

使用SendMail方法發送郵件

最后,使用smtp包中的SendMail函數來發送郵件。這個函數需要SMTP服務器的地址、認證信息、發件人地址、收件人列表和郵件內容。

err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, []byte(message))
if err != nil {log.Fatalf("Failed to send email: %v", err)
}

這個方法將連接到SMTP服務器,進行必要的認證,并發送構建好的郵件內容。如果過程中有任何錯誤發生,將返回錯誤信息。

示例代碼

將前面的步驟組合成完整的示例:

package mainimport ("fmt""log""net/smtp""strings"
)func main() {// SMTP服務器信息smtpHost := "smtp.gmail.com"smtpPort := "587"from := "your-email@gmail.com"auth := smtp.PlainAuth("", from, "your-password", smtpHost)// 郵件內容to := []string{"recipient1@example.com", "recipient2@example.com"}subject := "Test Email"header := fmt.Sprintf("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n", from, strings.Join(to, ", "), subject)body := "Hello, this is a test email from Go application using net/smtp package."message := header + body// 發送郵件err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, []byte(message))if err != nil {log.Fatalf("Failed to send email: %v", err)}
}

發送帶附件的郵件

發送帶附件的郵件稍微復雜一些,因為需要使用MIME(多用途互聯網郵件擴展)來格式化郵件內容。這一部分將展示如何構建一個多部分的郵件,包括文本和附件。

郵件多部分格式簡介

郵件的多部分格式允許將文本和附件結合在一個郵件體內。這需要使用"mime/multipart"包來構建一個多部分的郵件體,其中每個部分都可以是不同類型的內容。

構建帶有附件的郵件體

首先,創建一個multipart.Writer實例,這將用于寫入不同的郵件部分。

package mainimport ("bytes""mime/multipart""net/smtp""os""path/filepath"
)func main() {// 郵件服務器信息和身份驗證smtpHost := "smtp.gmail.com"smtpPort := "587"from := "your-email@gmail.com"auth := smtp.PlainAuth("", from, "your-password", smtpHost)// 創建一個新的緩沖區來存儲郵件var emailBody bytes.Bufferwriter := multipart.NewWriter(&emailBody)

接下來,添加一個郵件的文本部分:

    // 添加文本部分part, err := writer.CreatePart(textproto.MIMEHeader{"Content-Type": {"text/plain; charset=UTF-8"}})if err != nil {log.Fatalf("Failed to create part for text: %v", err)}part.Write([]byte("Hello, this is a test email with attachments from Go application using net/smtp package."))

然后,添加一個或多個附件。假設我們要添加一個圖片作為附件:

    // 添加附件filePath := "path/to/your/image.jpg"file, err := os.Open(filePath)if err != nil {log.Fatalf("Failed to open file: %v", err)}defer file.Close()part, err = writer.CreatePart(textproto.MIMEHeader{"Content-Disposition": {"form-data; name=\"attachment\"; filename=\"" + filepath.Base(filePath) + "\""},"Content-Type": {"application/octet-stream"},})if err != nil {log.Fatalf("Failed to create part for attachment: %v", err)}io.Copy(part, file)

完成所有部分后,關閉writer以完成郵件體的構建:

    writer.Close()

使用SendMail方法發送郵件

最后,使用SMTP客戶端的SendMail方法,將包含文本和附件的郵件發送出去。需要設置正確的MIME類型和邊界。

    to := []string{"recipient1@example.com"}subject := "Email with Attachments"header := fmt.Sprintf("From: %s\r\nTo: %s\r\nSubject: %s\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=%s\r\n\r\n", from, strings.Join(to, ", "), subject, writer.Boundary())message := append([]byte(header), emailBody.Bytes()...)// 發送郵件err = smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, message)if err != nil {log.Fatalf("Failed to send email: %v", err)}
}

這段代碼演示了如何發送包含文本和附件的復雜郵件。這是一個功能豐富的郵件發送示例,可以根據實際需要添加更多類型的附件。

發送HTML格式的郵件

發送HTML格式的郵件可以讓你的郵件內容更豐富和有吸引力,比如可以包含格式化的文本、鏈接、圖片等。本部分將介紹如何構建HTML郵件,并發送它。

HTML郵件的優勢和應用場景

HTML郵件的主要優勢在于其多樣化的呈現方式。不僅可以提供比純文本更豐富的信息,還可以通過設計提高用戶的閱讀體驗。常見的應用場景包括商業促銷、新聞通訊、客戶服務通知等。

構建HTML郵件內容

首先,你需要創建一個HTML的字符串,這將作為郵件的主體內容。在HTML內容中,你可以像在普通的網頁中一樣使用各種HTML標簽。

htmlBody := `
<html>
<head><title>Email Title</title>
</head>
<body><h1>Hello, World!</h1><p>This is a <strong>HTML</strong> email sent from a Go application using net/smtp package.</p>
</body>
</html>
`

嵌入圖片和其他資源

在HTML郵件中嵌入圖片需要使用CID(Content ID)來引用郵件正文中的多媒體部分。這需要將圖片作為郵件的一部分發送,并在HTML中通過CID引用它。

// 創建一個multipart的writer
var emailBody bytes.Buffer
writer := multipart.NewWriter(&emailBody)// 創建一個HTML部分
part, err := writer.CreatePart(textproto.MIMEHeader{"Content-Type": {"text/html; charset=UTF-8"}})
if err != nil {log.Fatalf("Failed to create HTML part: %v", err)
}
part.Write([]byte(htmlBody))// 添加圖片作為附件
filePath := "path/to/your/image.jpg"
file, err := os.Open(filePath)
if err != nil {log.Fatalf("Failed to open file: %v", err)
}
defer file.Close()// 創建圖片部分
part, err = writer.CreatePart(textproto.MIMEHeader{"Content-Type": {"image/jpeg"},"Content-Disposition": {"attachment; filename=\"" + filepath.Base(filePath) + "\""},"Content-ID": {"<image1>"},
})
if err != nil {log.Fatalf("Failed to create image part: %v", err)
}
io.Copy(part, file)// 關閉writer
writer.Close()

使用SendMail方法發送HTML郵件

發送HTML郵件的過程與發送帶附件的郵件類似。確保設置正確的頭部和MIME類型。

to := []string{"recipient1@example.com"}
subject := "HTML Email"
header := fmt.Sprintf("From: %s\r\nTo: %s\r\nSubject: %s\r\nMIME-Version: 1.0\r\nContent-Type: multipart/related; boundary=%s\r\n\r\n", from, strings.Join(to, ", "), subject, writer.Boundary())
message := append([]byte(header), emailBody.Bytes()...)// 發送郵件
err = smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, message)
if err != nil {log.Fatalf("Failed to send HTML email: %v", err)
}

以上代碼示例展示了如何發送一個包含HTML內容和嵌入圖片的郵件。這種類型的郵件可以用于各種營銷和通訊目的,提供了更加豐富和吸引人的郵件內容。

處理錯誤與常見問題

在使用net/smtp包發送郵件的過程中,可能會遇到各種錯誤和問題。這一部分將討論一些常見的問題,并提供解決方法,確保郵件發送流程的健壯性和可靠性。

錯誤處理策略

良好的錯誤處理是確保程序穩定運行的關鍵。在使用net/smtp進行郵件發送時,應該充分處理可能發生的各種錯誤情況。

if err != nil {log.Printf("An error occurred: %v", err)// 可以根據錯誤類型進行更詳細的錯誤處理
}

net/smtp常見問題及其解決方案

1. 連接超時
  • 問題描述:在嘗試連接SMTP服務器時可能會遇到超時問題。
  • 解決方案:檢查網絡連接,確保SMTP服務器地址和端口配置正確。增加超時時間或使用更穩定的網絡連接。
2. 身份驗證失敗
  • 問題描述:提供的身份驗證信息不正確,導致連接被拒絕。
  • 解決方案:確認郵箱賬號和密碼正確無誤,以及SMTP服務器的身份驗證設置。
3. 發送附件大小限制
  • 問題描述:嘗試發送過大的附件時,可能會被SMTP服務器拒絕。
  • 解決方案:檢查并遵守SMTP服務器關于郵件大小的限制。如果必須發送大文件,考慮使用文件分享服務鏈接而不是直接發送附件。
4. TLS/SSL要求
  • 問題描述:一些SMTP服務器要求加密連接。
  • 解決方案:確保使用StartTLS或相應的SSL連接方法與SMTP服務器建立加密連接。

安全性考慮:如何安全地使用SMTP服務

在使用SMTP服務發送郵件時,保護賬戶安全和郵件內容安全至關重要。以下是一些安全最佳實踐:

  • 使用應用程序專用密碼:如果支持,為郵件發送功能配置獨立的應用程序密碼,而不是使用主賬戶密碼。
  • 啟用雙因素認證(2FA):為你的郵箱賬戶啟用2FA,提高安全性。
  • 使用加密連接:始終使用TLS或SSL加密發送郵件,防止數據在傳輸中被竊取。

通過實現上述策略,可以大幅度提高使用SMTP服務發送郵件的安全性和可靠性。

高級技巧與最佳實踐

在掌握了net/smtp包基礎功能的使用后,接下來將介紹一些高級技巧和最佳實踐,以提升郵件發送功能的效率和可維護性。

性能優化建議

1. 使用連接池
  • 為了避免頻繁地創建和銷毀SMTP連接,可以實現一個連接池,復用已建立的連接。這對于高頻率的郵件發送任務尤其重要。
2. 異步發送郵件
  • 郵件發送可以采用異步處理的方式,避免在發送大量郵件時阻塞主程序流程。可以使用Go的goroutine來并行處理郵件發送任務。
3. 批量處理郵件發送
  • 如果需要發送大量相似的郵件(例如通知郵件或月度報告),考慮批量構建和發送郵件,而不是單獨發送每一封,可以減少網絡請求和服務器負載。

代碼重構與維護性提升

1. 模塊化郵件構建過程
  • 將郵件構建過程分解成獨立的模塊或函數,如創建頭部信息、正文、附件等,這樣不僅代碼更清晰,也方便維護和擴展。
2. 使用配置文件管理SMTP設置
  • 把SMTP服務器的地址、端口、用戶憑證等配置信息放在外部配置文件中,而不是硬編碼在程序中。這樣更安全,也便于管理多環境配置。

使用第三方庫增強net/smtp功能

雖然net/smtp包提供了基礎的郵件發送功能,但在某些復雜場景下,可能需要更多高級功能。可以考慮使用如下第三方庫:

  • gomail:提供了更加靈活的郵件構建選項,如更容易地發送帶有多個附件的郵件,或構建復雜的郵件體。
  • sendgrid-go:如果使用SendGrid服務,其官方Go庫提供了方便的API接入和豐富的郵件處理功能。

真實案例分析

接下來,讓我們通過一個真實案例來演示如何整合以上技巧和實踐:

假設我們需要為一個在線課程平臺實現一個服務,該服務負責發送課程通知和月度報告給數千名用戶。我們將使用異步發送和連接池技術來確保服務的高效性和穩定性。郵件內容包括課程更新、專題文章鏈接以及個性化的學習建議,需要高度定制化且動態生成。

// 示例:使用goroutine異步發送郵件
func sendEmails(users []User, message EmailMessage) {sem := make(chan struct{}, 10) // 使用信號量控制并發數for _, user := range users {sem <- struct{}{}go func(u User) {defer func() { <-sem }()sendEmail(u, message) // sendEmail是發送單個郵件的函數}(user)}// 等待所有goroutine完成for i := 0; i < cap(sem); i++ {sem <- struct{}{}}
}

總結

在本文中,我們詳細探討了使用Go語言標準庫net/smtp包發送郵件的各種技術和方法。從基本的郵件發送到處理帶附件和HTML內容的復雜郵件,再到實現高級功能和性能優化,我們提供了豐富的示例和建議,旨在幫助開發者有效地利用這個強大的庫。

核心要點回顧

  1. 基礎使用:我們展示了如何進行SMTP服務器的配置、身份驗證以及如何使用SendMail方法發送簡單的文本郵件。
  2. 復雜郵件處理:介紹了發送帶附件和HTML格式郵件的方法,特別強調了MIME協議在構建郵件中的應用。
  3. 錯誤處理和安全性:強調了在發送郵件過程中的錯誤處理的重要性,以及如何安全地使用SMTP服務。
  4. 性能與最佳實踐:提供了關于異步郵件發送、使用連接池以及代碼重構的高級技巧和建議。

郵件發送是現代應用程序中一個常見的需求,無論是在企業內部通信、自動化系統通知還是客戶關系管理中,都扮演著重要角色。我們鼓勵開發者不僅僅局限于本文介紹的內容,而應深入探索net/smtp包以外的其他高級庫和工具,以更好地滿足項目需求。

此外,技術是不斷進步的,相關的庫和工具也會更新升級。持續的學習和實踐是跟上技術發展、提高項目質量和效率的關鍵。

通過本文的學習,希望你已經能夠掌握使用Go語言進行郵件發送的核心技術,并可以在你的項目中靈活應用這些知識。不斷實踐并探索新的方法,將幫助你成為更加熟練和高效的Go開發者。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38932.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38932.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38932.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大模型知識學習

大模型訓練過程 數據清洗 擬人化描述&#xff1a;知識庫整理 預訓練 擬人化描述&#xff1a;知識學習可以使用基于BERT預訓練模型進行訓練 指令微調 擬人化描述&#xff1a;實際工作技能學習實際操作&#xff1a;讓大模型模仿具體的輸入輸出進行擬合&#xff0c;即模仿學…

Study--Oracle-06-Oracler網絡管理

一、ORACLE的監聽管理 1、ORACLE網絡監聽配置文件 cd /u01/app/oracle/product/12.2.0/db_1/network/admin 2、在Oracle數據庫中&#xff0c;監聽器&#xff08;Listener&#xff09;是一個獨立的進程&#xff0c;它監聽數據庫服務器上的特定端口上的網絡連接請求&#xff0c…

Vitis AI - 量化流程詳解

目錄 1. 簡介 2. 具體流程 2.1 校準激活 2.2 量化感知訓練 2.3 量化校準配置 2.4 quantization 函數 3. 總結 1. 簡介 想象一下&#xff0c;你有一個非常聰明的機器人朋友&#xff0c;它可以幫你做很多事情&#xff0c;比如預測天氣。但是&#xff0c;這個機器人的大腦…

01 數據采集層 流量分發第一步規范采集海量數據

《易經》&#xff1a;“初九&#xff1a;潛龍勿用”。潛龍的意思是隱藏&#xff0c;陽氣潛藏&#xff0c;陽爻位于最下方稱為“初九”&#xff0c;龍潛于淵&#xff0c;是學而未成的階段&#xff0c;此時需要打好基礎。 而模塊一我們就是講解推薦系統有關的概念、基礎數據體系…

基于SpringBoot+Vue商戶點評管理與數據分析系統設計和實現(源碼+LW+調試文檔+講解等)

&#x1f497;博主介紹&#xff1a;?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者&#xff0c;博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?&#x1f497; Java精品實戰案例《1000套》 2025-2026年最值得選擇的Java畢業設計選題大全&#xff…

使用 Vanna 生成準確的 SQL 查詢:工作原理和性能分析

Vanna工作原理 從本質上講,Vanna 是一個 Python 包,它使用檢索增強功能來幫助您使用 LLM 為數據庫生成準確的 SQL 查詢。 Vanna 的工作分為兩個簡單的步驟 - 在您的數據上訓練 RAG“模型”,然后提出問題,這些問題將返回可設置為在您的數據庫上自動運行的 SQL 查詢。 vn.t…

【后端面試題】【中間件】【NoSQL】MongoDB提高可用性的方案(主從結構、仲裁節點、分片、寫入語義)

主從結構 MongoDB的高可用和別的中間件的高可用方案基本類似。比如在MySQL里&#xff0c;接觸了分庫分表和主從同步&#xff1b;在Redis里&#xff0c;Redis也有主從結構&#xff1b;在Kafka里&#xff0c;分區也是有主從結構的。 所以先介紹啟用了主從同步 我們的系統有一個關…

基于Java的微信記賬小程序【附源碼】

摘 要 隨著我國經濟迅速發展&#xff0c;人們對手機的需求越來越大&#xff0c;各種手機軟件也都在被廣泛應用&#xff0c;但是對于手機進行數據信息管理&#xff0c;對于手機的各種軟件也是備受用戶的喜愛&#xff0c;記賬微信小程序被用戶普遍使用&#xff0c;為方便用戶能夠…

算法題中常用的C++功能

文章目錄 集合優先隊列雙端隊列排序時自定義比較函數最大數值字符串追加&#xff1a;刪除&#xff1a;子串&#xff1a; 元組vector查找創建和初始化賦值&#xff1a; 字典map引入頭文件定義和初始化插入元素訪問元素更新元素刪除元素檢查元素存在遍歷元素int和string轉換 集合…

Ubuntu20.04更新GLIBC到2.35版本

目錄 1 背景2 增加源2.1 標準源2.2 鏡像源 3 更新 1 背景 Ubuntu20.04默認GLIBC庫版本是2.31.今天碰到一個軟件需要2.35版本的GLIBC。 升級GLIBC庫有兩種方式&#xff1a; 下載高版本庫源碼&#xff0c;編譯后替換系統中低版本庫。由于GLIBC庫是Linux系統中最基礎庫&#xff…

你想活出怎樣的人生?

hi~好久不見&#xff0c;距離上次發文隔了有段時間了&#xff0c;這段時間&#xff0c;我是裸辭去感受了一下前端市場的水深火熱&#xff0c;那么這次咱們不聊技術&#xff0c;就說一說最近這段時間的經歷和一些感觸吧。 先說一下自己的個人情況&#xff0c;目前做前端四年&am…

深圳技術大學oj C : 生成r子集

Description 輸出給定序列按字典序的 &#xfffd; 組合&#xff0c;按照所有 &#xfffd; 個元素出現與否的 01 標記串 &#xfffd;&#xfffd;&#xfffd;&#xfffd;?1,...,&#xfffd;1 的字典序輸出. 此處01串的字典序指&#xff1a;先輸入的數字對應低位&#x…

移動智能終端數據安全管理方案

隨著信息技術的飛速發展&#xff0c;移動設備已成為企業日常運營不可或缺的工具。特別是隨著智能手機和平板電腦等移動設備的普及&#xff0c;這些設備存儲了大量的個人和敏感數據&#xff0c;如銀行信息、電子郵件等。員工通過智能手機和平板電腦訪問企業資源&#xff0c;提高…

【HICE】web服務搭建3

端口號的不同進行監聽 1.下載httpd協議&#xff1a;dnf install httpd -y 2.編輯vhost.conf cd /etc/httpd cd /conf.d [rootlocalhost conf.d]# cat 1.conf listen 9090 listen 9091 listen 9092 <directory /www> allowoverride none require all granted </d…

【機器學習】Datawhale-AI夏令營分子性質AI預測挑戰賽

參賽鏈接&#xff1a;零基礎入門 Ai 數據挖掘競賽-速通 Baseline - 飛槳AI Studio星河社區 一、賽事背景 在當今科技日新月異的時代&#xff0c;人工智能&#xff08;AI&#xff09;技術正以前所未有的深度和廣度滲透到科研領域&#xff0c;特別是在化學及藥物研發中展現出了巨…

SpringBoot+Vue集成AOP系統日志

新建logs表 添加aop依賴 <!-- aop依賴--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 新建獲取ip地址工具類 import javax.servlet.http.H…

React 函數式組件里面有生命周期嗎?沒有怎么辦?

React 函數式組件沒有像類組件那樣傳統的生命周期方法&#xff0c;但是通過 React Hooks&#xff0c;可以在函數式組件中實現類似的生命周期行為。 useEffect: 可以看作是類組件里的 componentDidMount, componentDidUpdate 和 componentWillUnmount 的結合體。它允許你在函數組…

在Linux環境下使用sqlite3時,如果嘗試對一個空表進行操作(例如插入數據),可能會遇到表被鎖定的問題。

在Linux環境下使用sqlite3時&#xff0c;如果嘗試對一個空表進行操作&#xff08;例如插入數據&#xff09;&#xff0c;可能會遇到表被鎖定的問題。這通常是因為sqlite3在默認情況下會對空表進行“延遲創建”&#xff0c;即在實際需要寫入數據之前&#xff0c;表不會被真正創建…

React Native V0.74 — 穩定版已發布

嗨,React Native開發者們, React Native 世界中令人興奮的消息是,V0.74剛剛在幾天前發布,有超過 1600 次提交。亮點如下: Yoga 3.0New Architecture: Bridgeless by DefaultNew Architecture: Batched onLayout UpdatesYarn 3 for New Projects讓我們深入了解每一個新亮點…

java 利用 gdal 生成遙感tif的縮略圖

簡要說明 在java&#xff0c;簡單使用gdal生成tif文件的縮略圖 maven依賴 <!--需要安裝完gdal后&#xff0c;本地install gdal包才能使用 --><!--gdal安裝可參考 https://blog.csdn.net/qq_41613913/article/details/135743562 --><dependency><groupI…