Unity发送至Gmail的邮件正文丢失问题排查
Gmail收件箱邮件正文丢失的原因分析
问题描述
我在Unity项目中使用以下脚本发送邮件,发送至Yahoo、Outlook等邮箱服务时均正常(偶尔会进入垃圾邮件),但发送至Gmail时,邮件能进入收件箱但正文完全丢失。已尝试多种安全及第三方应用相关设置,但均未解决该问题。
发送邮件代码
using System; using System.Collections; using System.Collections.Generic; using System.Net.Mail; using System.Net.Mime; using System.Text; using System.Text.RegularExpressions; using UnityEngine; using UnityEngine.UI; using System.Threading; using MimeKit; using System.IO; using MailKit.Net.Smtp; using MailKit.Security; using TMPro; namespace SendingEmails { public class EmailSenderTEST : MonoBehaviour { MailMessage msg; AlternateView htmlView; AlternateView plainView; System.Net.Mail.SmtpClient client; Thread myThread; private void Start() { myThread = new Thread(SendMsg); SendMessage(); } public void SendMessage() { string htmlMessage = @"<html> <body> </body> </html>"; client = new System.Net.Mail.SmtpClient("smtp-mail.outlook.com", 587); client.Credentials = new System.Net.NetworkCredential( SENDER_ADRESS, SENDER_PASSWORD); client.EnableSsl = true; msg = new MailMessage(SENDER_ADRESS, RECEIVER_ADRESS); htmlView = AlternateView.CreateAlternateViewFromString( htmlMessage, Encoding.UTF8, MediaTypeNames.Text.Html); plainView = AlternateView.CreateAlternateViewFromString( Regex.Replace(htmlMessage, "<[^>]+?>", string.Empty), Encoding.UTF8, MediaTypeNames.Text.Plain); msg.AlternateViews.Add(plainView); msg.AlternateViews.Add(htmlView); msg.IsBodyHtml = true; msg.Subject = " " + "Some subject, testing"; msg.Body = "Hey this is the email I sent"; myThread.Start(); client.Send(msg); } void SendMsg() { Debug.Log("Sent"); } } }
Gmail收件箱异常截图

可能原因及修复方案
核心原因
- AlternateViews与主Body的优先级冲突:当邮件同时包含
AlternateViews和主Body时,Gmail会优先渲染AlternateViews中的内容,但你添加的htmlView对应的HTML内容是空的(<body>标签内无实际内容),而plainView是从空HTML处理而来的纯文本,自然也没有内容,最终导致收件箱中看不到正文。 - HTML内容转义错误:你定义的
htmlMessage使用了转义后的<和>,但却将其标记为Text.Html类型,Gmail解析时无法识别为有效HTML标签,进而无法渲染内容。 - 过时API的兼容性问题:你使用的
System.Net.Mail.SmtpClient是已过时的API,生成的MIME邮件格式不符合现代邮箱服务(如Gmail)的严格标准,容易出现解析异常。
修复建议
移除AlternateViews,直接使用主Body
删除所有AlternateView相关代码,直接通过msg.Body设置正文,确保内容正确:public void SendMessage() { client = new System.Net.Mail.SmtpClient("smtp-mail.outlook.com", 587); client.Credentials = new System.Net.NetworkCredential(SENDER_ADRESS, SENDER_PASSWORD); client.EnableSsl = true; msg = new MailMessage(SENDER_ADRESS, RECEIVER_ADRESS); msg.IsBodyHtml = true; msg.Subject = "Some subject, testing"; // 直接设置正确的HTML内容 msg.Body = "<html><body>Hey this is the email I sent</body></html>"; myThread.Start(); client.Send(msg); }改用MimeKit构建邮件(推荐)
MimeKit对MIME格式的支持更标准,兼容性更好,完全替代过时的System.Net.MailAPI:public void SendMessage() { var message = new MimeMessage(); message.From.Add(new MailboxAddress("Sender", SENDER_ADRESS)); message.To.Add(new MailboxAddress("Receiver", RECEIVER_ADRESS)); message.Subject = "Some subject, testing"; var bodyBuilder = new BodyBuilder(); // 同时设置HTML和纯文本视图 bodyBuilder.HtmlBody = "<html><body>Hey this is the email I sent</body></html>"; bodyBuilder.TextBody = "Hey this is the email I sent"; message.Body = bodyBuilder.ToMessageBody(); using (var client = new SmtpClient()) { client.Connect("smtp-mail.outlook.com", 587, SecureSocketOptions.StartTls); client.Authenticate(SENDER_ADRESS, SENDER_PASSWORD); client.Send(message); client.Disconnect(true); } myThread.Start(); }修正HTML内容格式
确保HTML标签不被转义,直接使用<html>、<body>等原始标签,而非<html>这类转义字符。
内容的提问来源于stack exchange,提问作者Aleksandar Marković
相关产品推荐
相关产品推荐

