You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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收件箱异常截图

Gmail邮件正文丢失截图

可能原因及修复方案

核心原因

  • AlternateViews与主Body的优先级冲突:当邮件同时包含AlternateViews和主Body时,Gmail会优先渲染AlternateViews中的内容,但你添加的htmlView对应的HTML内容是空的(<body>标签内无实际内容),而plainView是从空HTML处理而来的纯文本,自然也没有内容,最终导致收件箱中看不到正文。
  • HTML内容转义错误:你定义的htmlMessage使用了转义后的&lt;和&gt;,但却将其标记为Text.Html类型,Gmail解析时无法识别为有效HTML标签,进而无法渲染内容。
  • 过时API的兼容性问题:你使用的System.Net.Mail.SmtpClient是已过时的API,生成的MIME邮件格式不符合现代邮箱服务(如Gmail)的严格标准,容易出现解析异常。

修复建议

  1. 移除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);
    }
    
  2. 改用MimeKit构建邮件(推荐)
    MimeKit对MIME格式的支持更标准,兼容性更好,完全替代过时的System.Net.Mail API:

    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();
    }
    
  3. 修正HTML内容格式
    确保HTML标签不被转义,直接使用<html>、<body>等原始标签,而非&lt;html&gt;这类转义字符。


内容的提问来源于stack exchange,提问作者Aleksandar Marković

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:21:03