英文:
gmail-api : Mail content formats are getting distorted (Code Lang : Go)
问题
我正在使用Go语言中的"google.golang.org/api/gmail/v1"来发送带有HTML内容的多封邮件。我使用for循环来发送不同内容但类型都为"html"的多封邮件。
就API而言,它工作正常,所有的邮件都能成功发送。但是只有第一封邮件以正确的格式即HTML格式发送(即邮件接收者以HTML格式接收邮件),其他用户收到的邮件都是纯文本格式(邮件正文中显示所有的HTML标签)。
是否有任何限制或条件需要处理以使其成功?
请指出我所犯的错误。
代码片段如下:
func main() {
// 从数据库中获取数据
recipientsList := dbRetrieval()
fmt.Println("About to call the method")
// 遍历所有收件人
for indx := range recipientsList {
time.Sleep(time.Second * 10)
fmt.Println("The 3 second wait :", indx)
tokenValueToBeUsed := requestRefreshToken(recipientsList[indx])
if len(tokenValueToBeUsed) == 0 {
err_uid := updateIsDeleted(recipientsList[indx].UserId)
if err_uid {
fmt.Println("Zero refresh token , so updated the DELETE")
} else {
fmt.Println("Zero refresh token But couldnt update the DELETE ")
}
} else {
secret, err := ioutil.ReadFile("client_secret.json")
if err != nil {
log.Printf("Error: %v", err)
} else {
conf, err := google.ConfigFromJSON(secret, gmail.GmailSendScope)
if err != nil {
log.Printf("Error: %v", err)
} else {
var tok oauth2.Token
tok.AccessToken = tokenValueToBeUsed
token := &tok
client := conf.Client(oauth2.NoContext, token)
gmailService, err := gmail.New(client)
if err != nil {
log.Printf("Error: %v", err)
} else {
var message gmail.Message
// 对于HTML
header := make(map[string]string)
header["From"] = recipientsList[indx].From_Mail
header["To"] = recipientsList[indx].To_Mail
header["Subject"] = recipientsList[indx].Title + "\r\n\r\n" + recipientsList[indx].Body + "\r\n\r\n" + recipientsList[indx].Signature + "\r\n\r\n" + recipientsList[indx].Pixel
header["MIME-Version"] = "1.0"
header["Content-Type"] = "text/html; charset=\"utf-8\""
header["Content-Transfer-Encoding"] = "base64"
var msg string
for k, v := range header {
msg += fmt.Sprintf("%s: %s\r\n", k, v)
}
message.Raw = base64.URLEncoding.EncodeToString([]byte(msg))
// 发送邮件
_, err_gms := gmailService.Users.Messages.Send("me", &message).Do()
if err_gms != nil {
log.Printf("Error: %v", err_gms)
} else {
err_upd := updateStatus(recipientsList[indx].UUID)
if err_upd {
fmt.Println("Message sent!")
//fmt.Println("The GMAIL response Object Details", gmailResponse)
} else {
fmt.Println("Message sent! But user not updated")
}
}
}
}
}
}
}
}
英文:
I am using "google.golang.org/api/gmail/v1" in Go to send multiple mails with the HTML content . I am using a for loop to send multiple mails with the different content but all of the type "html".
As far as the API is considered then it's working fine and all the mails are getting delivered . But only the first mail is delivered with the right format i.e in HTML (i.e the Receiver of the mail is getting the mail in the HTML format ) and rest of the users are getting the mail with all the content as TEXT ( so all the HTML tags are visible in the body of the mail) /
Is there any limitation or condition which I need to handle to make it success ?
Kindly point out the mistake I am doing .
The code snippet is :
func main() {
// Get the data from the DB
recipientsList := dbRetrieval()
fmt.Println("About to call the method")
// Invoke the Loop for all the recipients
for indx := range recipientsList {
time.Sleep(time.Second * 10)
fmt.Println("The 3 second wait :", indx)
tokenValueToBeUsed := requestRefreshToken(recipientsList[indx])
if len(tokenValueToBeUsed) == 0 {
err_uid := updateIsDeleted(recipientsList[indx].UserId)
if err_uid {
fmt.Println("Zero refresh token , so updated the DELETE")
} else {
fmt.Println("Zero refresh token But couldnt update the DELETE ")
}
} else {
secret, err := ioutil.ReadFile("client_secret.json")
if err != nil {
log.Printf("Error: %v", err)
} else {
conf, err := google.ConfigFromJSON(secret, gmail.GmailSendScope)
if err != nil {
log.Printf("Error: %v", err)
} else {
var tok oauth2.Token
tok.AccessToken = tokenValueToBeUsed
token := &tok
client := conf.Client(oauth2.NoContext, token)
gmailService, err := gmail.New(client)
if err != nil {
log.Printf("Error: %v", err)
} else {
var message gmail.Message
// For HTML
header := make(map[string]string)
header["From"] = recipientsList[indx].From_Mail
header["To"] = recipientsList[indx].To_Mail
header["Subject"] = recipientsList[indx].Title + "\r\n\r\n" + recipientsList[indx].Body + "\r\n\r\n" + recipientsList[indx].Signature + "\r\n\r\n" + recipientsList[indx].Pixel
header["MIME-Version"] = "1.0"
header["Content-Type"] = "text/html; charset=\"utf-8\""
header["Content-Transfer-Encoding"] = "base64"
var msg string
for k, v := range header {
msg += fmt.Sprintf("%s: %s\r\n", k, v)
}
message.Raw = base64.URLEncoding.EncodeToString([]byte(msg))
// Send the message
_, err_gms := gmailService.Users.Messages.Send("me", &message).Do()
if err_gms != nil {
log.Printf("Error: %v", err_gms)
} else {
err_upd := updateStatus(recipientsList[indx].UUID)
if err_upd {
fmt.Println("Message sent!")
//fmt.Println("The GMAIL response Object Details", gmailResponse)
} else {
fmt.Println("Message sent! But user not updated")
}
}
}
}
}
}
}
}
答案1
得分: 0
我无法保证,但似乎您可能会遇到电子邮件字段顺序的问题,因为使用map
时,顺序每次都是随机的。尝试将基于map
的内容替换为类似以下的内容:
header := [][]string{
{"To", recipientsList[indx].To_Mail},
{"From", recipientsList[indx].From_Mail},
{"MIME-Version", "1.0"},
{"Content-Type", "text/html; charset=utf-8"},
{"Content-Transfer-Encoding", "base64"},
{"Subject", recipientsList[indx].Title + "\r\n\r\n" + recipientsList[indx].Body + "\r\n\r\n" + recipientsList[indx].Signature + "\r\n\r\n" + recipientsList[indx].Pixel},
}
var msg string
for _, v := range header {
msg += fmt.Sprintf("%s: %s\r\n", v[0], v[1])
}
希望对您有所帮助!
英文:
I can't guarantee that but seems like you may have issues with email fields order because with map
order is random every time. Try to replace map
based stuff with something like:
header := [][]string{
{"To", recipientsList[indx].To_Mail},
{"From", recipientsList[indx].From_Mail},
{"MIME-Version", "1.0"},
{"Content-Type", "text/html; charset=utf-8"},
{"Content-Transfer-Encoding", "base64"},
{"Subject", recipientsList[indx].Title + "\r\n\r\n" + recipientsList[indx].Body + "\r\n\r\n" + recipientsList[indx].Signature + "\r\n\r\n" + recipientsList[indx].Pixel},
}
var msg string
for _, v := range header {
msg += fmt.Sprintf("%s: %s\r\n", v[0], v[1])
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论