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 Settings→Configuration - 把
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




