Go語言利用net/mail包解析郵件地址與消息格式
想要解析郵件地址或處理郵件消息?Go 的 net/mail 包提供了符合 RFC 5322 標(biāo)準(zhǔn)的郵件解析能力,讓你輕松處理郵件相關(guān)的各種場(chǎng)景。
1. 解析郵件地址
最常見的需求就是解析郵件地址。net/mail 能智能識(shí)別各種格式:
package main
import (
"fmt"
"net/mail"
)
func main() {
// 解析帶名稱的郵件地址
addr, _ := mail.ParseAddress("張三 <zhangsan@example.com>")
fmt.Println(addr.Name) // 張三
fmt.Println(addr.Address) // zhangsan@example.com
// 解析純郵件地址
addr2, _ := mail.ParseAddress("admin@example.com")
fmt.Println(addr2.Address) // admin@example.com
}
2. 批量解析郵件地址列表
處理群發(fā)郵件?ParseAddressList 一次搞定多個(gè)地址:
addresses := "Alice <alice@example.com>, Bob <bob@example.com>, charlie@example.com"
list, _ := mail.ParseAddressList(addresses)
for _, addr := range list {
fmt.Printf("姓名: %s, 郵箱: %s\n", addr.Name, addr.Address)
}
// 輸出:
// 姓名: Alice, 郵箱: alice@example.com
// 姓名: Bob, 郵箱: bob@example.com
// 姓名: , 郵箱: charlie@example.com
3. 讀取完整郵件消息
net/mail 能解析完整的郵件消息,包括頭部和正文:
import (
"io"
"net/mail"
"strings"
)
func parseEmail(emailContent string) {
reader := strings.NewReader(emailContent)
msg, _ := mail.ReadMessage(reader)
// 獲取郵件頭部信息
header := msg.Header
fmt.Println("發(fā)件人:", header.Get("From"))
fmt.Println("收件人:", header.Get("To"))
fmt.Println("主題:", header.Get("Subject"))
fmt.Println("日期:", header.Get("Date"))
// 讀取郵件正文
body, _ := io.ReadAll(msg.Body)
fmt.Println("正文:", string(body))
}
4. 解析郵件日期
郵件日期格式復(fù)雜?ParseDate 幫你轉(zhuǎn)換成 Go 的 time.Time:
// 解析 RFC 5322 格式的日期
dateStr := "Mon, 23 Jun 2024 09:30:00 +0800"
t, _ := mail.ParseDate(dateStr)
fmt.Println(t.Format("2006-01-02 15:04:05"))
// 輸出: 2024-06-23 09:30:00
// 也能處理帶時(shí)區(qū)的格式
dateStr2 := "23 Jun 2024 09:30:00 EST"
t2, _ := mail.ParseDate(dateStr2)
fmt.Println(t2.UTC())
5. 構(gòu)建郵件地址字符串
Address 類型提供了 String() 方法,能正確格式化郵件地址:
addr := &mail.Address{
Name: "技術(shù)支持",
Address: "support@example.com",
}
fmt.Println(addr.String())
// 輸出: "技術(shù)支持" <support@example.com>
// 特殊字符會(huì)自動(dòng)轉(zhuǎn)義
addr2 := &mail.Address{
Name: `John "The Boss" Doe`,
Address: "john@example.com",
}
fmt.Println(addr2.String())
// 輸出: "John \"The Boss\" Doe" <john@example.com>
6. 處理郵件頭部編碼
處理國際化郵件?net/mail 支持 RFC 2047 編碼的頭部:
// 解析包含中文的郵件
emailStr := `From: =?UTF-8?B?5byg5LiJ?= <zhangsan@example.com>
To: lisi@example.com
Subject: =?UTF-8?B?5rWL6K+V6YKu5Lu2?=
郵件正文內(nèi)容`
msg, _ := mail.ReadMessage(strings.NewReader(emailStr))
from, _ := msg.Header.AddressList("From")
fmt.Println(from[0].Name) // 能正確解析出中文名
7. 驗(yàn)證郵件地址格式
利用 ParseAddress 進(jìn)行郵件格式驗(yàn)證:
func isValidEmail(email string) bool {
_, err := mail.ParseAddress(email)
return err == nil
}
// 測(cè)試
fmt.Println(isValidEmail("user@example.com")) // true
fmt.Println(isValidEmail("invalid.email")) // false
fmt.Println(isValidEmail("user@")) // false
8. 提取郵件附件信息
雖然 net/mail 不直接處理附件,但能獲取相關(guān)頭部信息:
msg, _ := mail.ReadMessage(reader)
contentType := msg.Header.Get("Content-Type")
// 檢查是否為 multipart 消息
if strings.Contains(contentType, "multipart") {
// 獲取邊界標(biāo)識(shí)
boundary := extractBoundary(contentType)
fmt.Println("這是一個(gè)包含附件的郵件")
fmt.Println("邊界標(biāo)識(shí):", boundary)
}
// 檢查附件相關(guān)頭部
disposition := msg.Header.Get("Content-Disposition")
if strings.Contains(disposition, "attachment") {
fmt.Println("發(fā)現(xiàn)附件")
}
net/mail 包雖然簡(jiǎn)單,卻是處理郵件相關(guān)任務(wù)的利器。它嚴(yán)格遵循 RFC 標(biāo)準(zhǔn),讓你的郵件處理代碼更加健壯可靠。記住,它主要用于解析郵件格式,如果需要發(fā)送郵件,你需要配合 net/smtp 包使用。
到此這篇關(guān)于Go語言利用net/mail包解析郵件地址與消息格式的文章就介紹到這了,更多相關(guān)Go解析郵件地址與消息格式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言中多重賦值里的空白標(biāo)識(shí)符的使用
Go語言中,空白標(biāo)識(shí)符_用于多重賦值時(shí)忽略多余值,提升代碼簡(jiǎn)潔性,適用于函數(shù)返回、遍歷映射、接口斷言、數(shù)據(jù)庫查詢及通道接收等場(chǎng)景,下面就來介紹一下,感興趣的可以了解一下2025-06-06
golang環(huán)形隊(duì)列實(shí)現(xiàn)代碼示例
這篇文章主要介紹了golang環(huán)形隊(duì)列實(shí)現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
golang通過反射手動(dòng)實(shí)現(xiàn)json序列化的方法
在 Go 語言中,JSON 序列化和反序列化通常通過標(biāo)準(zhǔn)庫 encoding/json 來實(shí)現(xiàn),本文給大家介紹golang 通過反射手動(dòng)實(shí)現(xiàn)json序列化的方法,感興趣的朋友一起看看吧2024-12-12

