You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity开发评价APP:编辑器邮件发送正常,Android设备失效求助

解决Unity Android打包后无法发送邮件的问题

嘿,我完全懂你刚入门编程就碰到这种“编辑器正常、打包就崩”的糟心事儿——别慌,咱们从最常见的几个坑入手,一步步解决:

1. 先补全Android的网络权限

Android系统默认不给APP网络访问权限,这是最容易忽略的点:

  • 打开Unity的Player Settings(Edit → Project Settings → Player)
  • 切换到Android标签,找到Publishing Settings,展开Permissions
  • 勾选INTERNET权限;如果需要检测网络状态,也可以勾选ACCESS_NETWORK_STATE
  • 如果你手动编辑AndroidManifest.xml,要确保里面有这行代码:
<uses-permission android:name="android.permission.INTERNET" />

2. 检查邮箱的安全设置(尤其是Gmail/Outlook这类主流邮箱)

编辑器里能发,大概率是电脑端的邮箱权限没限制,但手机端的APP会被邮箱服务商判定为“非信任应用”:

  • Gmail用户:现在谷歌已经禁用了“低安全性应用”访问,你需要先开启两步验证,然后生成一个应用专用密码(App Password),用这个密码代替你平时的邮箱密码填到代码里
  • Outlook/Hotmail用户:要在账户设置里开启“允许应用访问邮箱”的选项,或者同样生成应用专用密码
  • 划重点:别直接用你平时登录邮箱的密码!这是很多入门者踩的坑

3. 调整Unity的.NET API兼容级别

Unity默认的.NET子集可能不支持System.Net.Mail的全部功能:

  • 回到Player Settings的Android标签,找到Other SettingsConfiguration
  • Api Compatibility Level改成.NET 4.x(或者更高版本,比如.NET Standard 2.1),别用.NET Subset或者低版本的.NET Standard

4. 处理Android上的SSL证书验证问题

Android的证书存储和Windows不一样,可能会出现SSL证书验证失败的情况,导致邮件发不出去。你可以先加一段临时代码跳过验证(注意:正式发布时最好解决证书问题,这只是测试用):
在你的邮件发送代码开头加上:

ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;

这段代码会让APP跳过所有SSL证书的验证,先确保邮件能发出去,之后再考虑添加正确的证书信任。

给你整理的测试代码示例

结合上面的点,修改你的代码试试:

using UnityEngine;
using System.Net;
using System.Net.Mail;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

public class EmailSender : MonoBehaviour
{
    // 这里用邮箱的应用专用密码,不是平时的登录密码!
    public string senderEmail = "你的邮箱@xxx.com";
    public string senderPassword = "你的应用专用密码";
    public string receiverEmail = "接收者邮箱@xxx.com";

    public void SendFeedback()
    {
        // 跳过SSL验证(测试用)
        ServicePointManager.ServerCertificateValidationCallback = ValidateCertificate;

        MailMessage mail = new MailMessage();
        mail.From = new MailAddress(senderEmail);
        mail.To.Add(receiverEmail);
        mail.Subject = "用户评价反馈";
        mail.Body = "这里是用户的评价内容";

        // 用支持SSL的邮件服务器,比如Gmail是smtp.gmail.com,端口465
        SmtpClient smtpClient = new SmtpClient("smtp.gmail.com", 465);
        smtpClient.Credentials = new NetworkCredential(senderEmail, senderPassword);
        smtpClient.EnableSsl = true;

        try
        {
            smtpClient.Send(mail);
            Debug.Log("邮件发送成功!");
        }
        catch (System.Exception ex)
        {
            Debug.LogError("发送失败:" + ex.Message);
        }
    }

    // 可选:自定义证书验证(正式版用这个代替直接返回true)
    private bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        // 这里可以添加证书验证逻辑,比如检查证书是否是信任的
        return true; // 测试阶段先返回true
    }
}

最后给入门的小提醒

  • 别把邮箱密码硬编码在代码里!正式发布时可以用服务器中转(比如把评价内容发到你的后端服务器,再由服务器发邮件),这样更安全
  • 测试时一定要用真机调试,看LogCat里的错误信息(Unity的Console在真机上的日志可以通过adb logcat查看,或者用Unity的Remote调试)

内容的提问来源于stack exchange,提问作者theyashkhare

火山引擎 最新活动