Skip to content

Commit f03f027

Browse files
committed
fixed 邮箱解析使用官方库
1 parent 2e506a7 commit f03f027

File tree

4 files changed

+85
-20
lines changed

4 files changed

+85
-20
lines changed

reptile/Netsarang.go

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ package reptile
1414
import (
1515
"bytes"
1616
"context"
17-
"encoding/base64"
1817
"errors"
1918
"github.com/PuerkitoBio/goquery"
2019
"github.com/chromedp/cdproto/page"
@@ -136,17 +135,11 @@ func NetsarangGetInfo(mail, product string) (string, error) {
136135
return "", errors.New("邮件ID不存在")
137136
}
138137
// 获取最新一封邮件
139-
content, err := LinShiYouXiangGetMail(prefix, mailId)
138+
msg, err := LinShiYouXiangGetMail(prefix, mailId)
140139
if err != nil {
141140
return "", err
142141
}
143-
// 分割取内容
144-
text := strings.Split(content, "AmazonSES")
145-
if len(text) < 2 {
146-
return "", errors.New("邮件内容不正确")
147-
}
148-
// 解密,邮件协议Content-Transfer-Encoding指定了base64
149-
htmlText, err := base64.StdEncoding.DecodeString(text[1])
142+
htmlText, err := DecodeMail(msg)
150143
if err != nil {
151144
return "", err
152145
}

reptile/mail.go

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package reptile
2+
13
/**
24
*
35
* @Description:
@@ -9,21 +11,39 @@
911
* @Package:
1012
* @Software: GoLand
1113
*/
12-
package reptile
1314

1415
import (
16+
"encoding/base64"
17+
"errors"
1518
"github.com/antchfx/htmlquery"
1619
"github.com/chromedp/cdproto/page"
1720
"github.com/chromedp/chromedp"
1821
"math"
1922
"net/http"
23+
"net/mail"
24+
"strings"
2025
"time"
2126
"tool-gin/utils"
2227
)
2328

29+
// DecodeMail 解码邮件内容 https://github.com/alexcesaro/quotedprintable
30+
func DecodeMail(msg *mail.Message) ([]byte, error) {
31+
body := utils.BytesToStringByBuffer(msg.Body)
32+
if len(body) == 0 || body == "" {
33+
return nil, errors.New("邮件内容不正确")
34+
}
35+
encoding := msg.Header.Get("Content-Transfer-Encoding")
36+
// 解码,邮件协议Content-Transfer-Encoding指定了编码方式
37+
if encoding == "base64" {
38+
body, err := base64.StdEncoding.DecodeString(body)
39+
return body, err
40+
}
41+
return nil, errors.New("解码方式错误:" + encoding)
42+
}
43+
2444
const LinShiYouXiang = "https://www.linshiyouxiang.net"
2545

26-
// 获取邮箱号后缀
46+
// LinShiYouXiangSuffix 获取邮箱号后缀
2747
func LinShiYouXiangSuffix() (string, error) {
2848
var suffixArray []string
2949
response, err := utils.HttpRequest(http.MethodGet, LinShiYouXiang, "", nil, nil)
@@ -46,7 +66,7 @@ func LinShiYouXiangSuffix() (string, error) {
4666
return suffixArray[utils.RandIntn(len(suffixArray)-1)], nil
4767
}
4868

49-
// 获取邮箱号
69+
// LinShiYouXiangApply 获取邮箱号
5070
// prefix: 邮箱前缀
5171
func LinShiYouXiangApply(prefix string) (map[string]interface{}, error) {
5272
url := LinShiYouXiang + "/api/v1/mailbox/keepalive"
@@ -58,14 +78,14 @@ func LinShiYouXiangApply(prefix string) (map[string]interface{}, error) {
5878
return utils.HttpReadBodyJsonMap(http.MethodGet, url, "", param, nil)
5979
}
6080

61-
// 获取邮件列表
81+
// LinShiYouXiangList 获取邮件列表
6282
// prefix: 邮箱前缀
6383
func LinShiYouXiangList(prefix string) ([]map[string]interface{}, error) {
6484
url := LinShiYouXiang + "/api/v1/mailbox/" + prefix
6585
return utils.HttpReadBodyJsonArray(http.MethodGet, url, "", nil, nil)
6686
}
6787

68-
// 获取邮件内容
88+
// LinShiYouXiangGetMail 获取邮件内容
6989
// prefix: 邮箱前缀
7090
// id: 邮件编号
7191
//
@@ -76,12 +96,18 @@ func LinShiYouXiangList(prefix string) ([]map[string]interface{}, error) {
7696
// htmlText, err := base64.StdEncoding.DecodeString(text[1])
7797
// 解析HTML
7898
// doc, err := goquery.NewDocumentFromReader(bytes.NewReader(htmlText))
79-
func LinShiYouXiangGetMail(prefix, id string) (string, error) {
99+
func LinShiYouXiangGetMail(prefix, id string) (*mail.Message, error) {
80100
url := LinShiYouXiang + "/mailbox/" + prefix + "/" + id + "/source"
81-
return utils.HttpReadBodyString(http.MethodGet, url, "", nil, nil)
101+
content, err := utils.HttpReadBodyString(http.MethodGet, url, "", nil, nil)
102+
if err != nil {
103+
return nil, err
104+
}
105+
r := strings.NewReader(content)
106+
m, err := mail.ReadMessage(r) // 解析邮件
107+
return m, err
82108
}
83109

84-
// 删除邮件
110+
// LinShiYouXiangDelete 删除邮件
85111
// prefix: 邮箱前缀
86112
// id: 邮件编号
87113
func LinShiYouXiangDelete(prefix, id string) (map[string]interface{}, error) {

reptile/reptile_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@
1212
package reptile
1313

1414
import (
15+
"bytes"
1516
"fmt"
1617
"github.com/chromedp/cdproto/target"
1718
"github.com/chromedp/chromedp"
19+
"log"
20+
"net/mail"
21+
"strings"
1822
"testing"
1923
"time"
2024
)
@@ -67,3 +71,22 @@ func TestApply(t *testing.T) {
6771
t.Log(err)
6872
t.Log(res)
6973
}
74+
func TestMail(t *testing.T) {
75+
msg := "Received: from a27-154.smtp-out.us-west-2.amazonses.com ([54.240.27.154]) by temporary-mail.net\n for <[email protected]>; Wed, 21 Apr 2021 13:29:21 +0800 (CST)\nDKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;\n\ts=n6yk34xlzntpmtevqgs5ghp2jksprvft; d=netsarang.com; t=1618982959;\n\th=Date:To:From:Reply-To:Subject:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding;\n\tbh=OsRfLaUS97/+yRoJ/BSpIARvBe+S33pKrzp1it7xCyQ=;\n\tb=LTblU9qEhTeorpht/julhD6ar7a6MDmEI9zH3TBy28KI6ah7Q+E1J0fAML2Pbcd0\n\tqX/68C8+vtGD03BGEzVPjJTJDoztO0qoNz5l7C/DSGV1MEyxh8ccQtW7rw+7+kQXv/+\n\tBKztqxpwXMjNuzZb3E0W1GYju0kr4qT5nXkMXD5o=\nDKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;\n\ts=7v7vs6w47njt4pimodk5mmttbegzsi6n; d=amazonses.com; t=1618982959;\n\th=Date:To:From:Reply-To:Subject:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Feedback-ID;\n\tbh=OsRfLaUS97/+yRoJ/BSpIARvBe+S33pKrzp1it7xCyQ=;\n\tb=NhCoNeJCoIpySzLuSxUV5P0zlsh4pLKUz5bhIG3spGhLgW0Pzf/1ZHyJJOTL9T3C\n\tDi7ChUyfnWdRjWSp+7EiA4VNrqGtOzoOsMZKipURghknjlG8bYjpCpdGXrO1D5IBlIj\n\tCl8sZevNShTh++kQW27S4S83cuDhbwxGEgxhSy3k=\nDate: Wed, 21 Apr 2021 05:29:19 +0000\nTo: [email protected]\nFrom: \"NetSarang, Inc.\" <[email protected]>\nReply-To: [email protected]\nSubject: Xshell 7 download instruction\nMessage-ID: <01010178f2e77a87-c9bb10f6-ef08-4dad-ba57-4524546de5d2-000000@us-west-2.amazonses.com>\nX-Mailer: PHPMailer 5.2.10 (https://github.com/PHPMailer/PHPMailer/)\nMIME-Version: 1.0\nContent-Type: text/html; charset=utf-8\nContent-Transfer-Encoding: base64\nFeedback-ID: 1.us-west-2.l7ekw14vD6Jumpwas0GHbg0O54ld7FbCklw8tqJLu88=:AmazonSES\nX-SES-Outgoing: 2021.04.21-54.240.27.154\n\nPHNwYW4+RGVhciB1c2VyLDwvc3Bhbj4NCjxiciAvPjxiciAvPg0KPHNwYW4+VGhhbmsgeW91IGZv\nciB5b3VyIGludGVyZXN0IGluIFhzaGVsbCA3LiBXZSBoYXZlIHByZXBhcmVkIHlvdXIgZXZhbHVh\ndGlvbiBwYWNrYWdlLiBJZiB5b3UgZGlkIG5vdCByZXF1ZXN0IGFuIGV2YWx1YXRpb24gb2YgWHNo\nZWxsIDcsIHBsZWFzZSBjb250YWN0IG91ciBzdXBwb3J0IHRlYW0gYXQgc3VwcG9ydEBuZXRzYXJh\nbmcuY29tIHRvIGhhdmUgeW91ciBlbWFpbCBhZGRyZXNzIHJlbW92ZWQgZnJvbSBhbnkgZnV0dXJl\nIGVtYWlscyByZWxhdGVkIHRvIFhzaGVsbCA3Ljwvc3Bhbj4NCjxiciAvPjxiciAvPg0KPHNwYW4+\nUGxlYXNlIGdvIHRvIHRoZSBmb2xsb3dpbmcgVVJMIHRvIHN0YXJ0IGRvd25sb2FkaW5nIHlvdXIg\nZXZhbHVhdGlvbiBzb2Z0d2FyZTo8L3NwYW4+DQo8YnIgLz48YnIgLz4NCjxzcGFuPjxhIGhyZWY9\nImh0dHBzOi8vd3d3Lm5ldHNhcmFuZy5jb20vZW4vZG93bmxvYWRpbmcvP3Rva2VuPVZscDJUM1pN\nTVROblR6RmhXWGxFYnpWck1uSjNRVUE0U1VWWGMxcFlMVE5aY0hoRFQxcDJkV1JEU1RCQiIgdGFy\nZ2V0PSJfYmxhbmsiPmh0dHBzOi8vd3d3Lm5ldHNhcmFuZy5jb20vZW4vZG93bmxvYWRpbmcvP3Rv\na2VuPVZscDJUM1pNTVROblR6RmhXWGxFYnpWck1uSjNRVUE0U1VWWGMxcFlMVE5aY0hoRFQxcDJk\nV1JEU1RCQjwvYT48L3NwYW4+DQo8YnIgLz48YnIgLz4NCjxzcGFuPlRoaXMgbGluayB3aWxsIGV4\ncGlyZSBvbiBNYXkgMjEsIDIwMjE8L3NwYW4+IDxzcGFuPllvdSBjYW4gZXZhbHVhdGUgdGhlIHNv\nZnR3YXJlIGZvciAzMCBkYXlzIHNpbmNlIGluc3RhbGxhdGlvbi48L3NwYW4+DQo8YnIgLz48YnIg\nLz48YnIgLz4NCjxiPkRvIHlvdSBoYXZlIGFueSBxdWVzdGlvbnM/PC9iPg0KPGJyIC8+DQo8c3Bh\nbj5XZSBvZmZlciBmcmVlIHRlY2huaWNhbCBzdXBwb3J0IGR1cmluZyB0aGUgZXZhbHVhdGlvbiBw\nZXJpb2QuIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMsIHBsZWFzZSBzZW5kIHVzIGFuIGVtYWls\nIGF0IDxhIGhyZWY9Im1haWx0bzpzdXBwb3J0QG5ldHNhcmFuZy5jb20iPnN1cHBvcnRAbmV0c2Fy\nYW5nLmNvbTwvYT4uPC9zcGFuPg0KPGJyIC8+PGJyIC8+PGJyIC8+DQo8c3Bhbj5CZXN0IHJlZ2Fy\nZHMsPC9zcGFuPg0KPGJyIC8+PGJyIC8+PGJyIC8+DQo8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFk\nZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPg0KPHRib2R5Pg0KPHRyPjx0ZD49PT09PT09PT09PT09\nPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PC90\nZD48L3RyPg0KPHRyPjx0ZD5OZXRTYXJhbmcsIEluYy48L3RkPjwvdHI+DQo8dHI+PHRkPjQ3MDEg\nUGF0cmljayBIZW5yeSBEci4gQkxERyAyMiwgU3VpdGUgMTM3LCBTYW50YSBDbGFyYSwgQ0EgOTUw\nNTQsIFUuUy5BLjwvdGQ+PC90cj4NCjx0cj48dGQ+V2Vic2l0ZTogaHR0cDovL3d3dy5uZXRzYXJh\nbmcuY29tIHwgRW1haWw6IHN1cHBvcnRAbmV0c2FyYW5nLmNvbTwvdGQ+PC90cj4NCjx0cj48dGQ+\nUGhvbmU6ICg2NjkpIDIwNC0zMzAxPC90ZD48L3RyPg0KPC90Ym9keT4NCjwvdGFibGU+DQo=\n\n"
76+
r := strings.NewReader(msg)
77+
m, err := mail.ReadMessage(r)
78+
if err != nil {
79+
log.Fatal(err)
80+
}
81+
header := m.Header
82+
fmt.Println("Date:", header.Get("Date"))
83+
fmt.Println("From:", header.Get("From"))
84+
fmt.Println("To:", header.Get("To"))
85+
fmt.Println("Subject:", header.Get("Subject"))
86+
fmt.Println("Content-Transfer-Encoding:")
87+
88+
buf := new(bytes.Buffer) // io.ReadCloser类型转换为string
89+
buf.ReadFrom(m.Body)
90+
b := buf.String()
91+
fmt.Println("-------", b)
92+
}

utils/bytes.go

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package utils
22

33
import (
4+
"bytes"
45
"errors"
6+
"io"
57
"strconv"
68
"strings"
79
"unicode"
@@ -25,7 +27,7 @@ const (
2527

2628
var invalidByteQuantityError = errors.New("字节数量必须是一个正整数,其单位为测量单位 M, MB, MiB, G, GiB, or GB")
2729

28-
// ByteSize返回10M,12.5K等形式的人类可读字节串。以下单位可供选择:
30+
// ByteSize 返回10M,12.5K等形式的人类可读字节串。以下单位可供选择:
2931
// E: Exabyte
3032
// P: Petabyte
3133
// T: Terabyte
@@ -68,7 +70,7 @@ func ByteSize(bytes uint64) string {
6870
return result + unit
6971
}
7072

71-
// ToMegabytes将ByteSize格式化的字符串解析为兆字节
73+
// ToMegabytes 将ByteSize格式化的字符串解析为兆字节
7274
func ToMegabytes(s string) (uint64, error) {
7375
bytes, err := ToBytes(s)
7476
if err != nil {
@@ -78,7 +80,7 @@ func ToMegabytes(s string) (uint64, error) {
7880
return bytes / MEGABYTE, nil
7981
}
8082

81-
// ToBytes将ByteSize格式化的字符串解析为字节。注意二进制前缀和SI前缀单位均表示基数为2的单位
83+
// ToBytes 将ByteSize格式化的字符串解析为字节。注意二进制前缀和SI前缀单位均表示基数为2的单位
8284
// KB = K = KiB = 1024
8385
// MB = M = MiB = 1024 * K
8486
// GB = G = GiB = 1024 * M
@@ -120,3 +122,24 @@ func ToBytes(s string) (uint64, error) {
120122
return 0, invalidByteQuantityError
121123
}
122124
}
125+
126+
// BytesToStringByBuffer io.ReadCloser类型转换为string
127+
func BytesToStringByBuffer(body io.Reader) string {
128+
buf := new(bytes.Buffer) // io.ReadCloser类型转换为string
129+
buf.ReadFrom(body)
130+
//b := *(*string)(unsafe.Pointer(&body))
131+
/*_, err := io.Copy(buf, body)
132+
b :=buf.String()*/
133+
return buf.String()
134+
}
135+
136+
// BytesToStringByIo io.ReadCloser类型转换为string
137+
func BytesToStringByIo(body io.Reader) (string, error) {
138+
bd, err := io.ReadAll(body)
139+
if err != nil {
140+
return "", err
141+
}
142+
b := string(bd)
143+
//b :=fmt.Sprintf("%s", body)
144+
return b, err
145+
}

0 commit comments

Comments
 (0)