12

我正在考虑在我的游戏中实现“报告错误/建议”选项,但我不太确定如何才能让它发挥作用。我没有自己的服务器或任何东西,所以我不能只发送用户写到那里的文本。

我想出的唯一方法是客户会写一条消息,然后我会将其发送到我可以阅读它们的电子邮件帐户。但是,我不希望用户需要通过他们的个人帐户发送报告。我不太确定如何实现这一点,谷歌搜索也没有提出任何好的建议。

我没有做过很多网络工作,所以如果您能逐步解释(甚至可能在代码中)该过程,我将不胜感激。

我正在使用 C#,并且正在为 Windows Phone 7 编写游戏。

4

6 回答 6

11

是的,绝对有可能做到这一点。从相对底层的角度来看,您需要:

  1. 为您要发送到的电子邮件帐户解析 MX(邮件交换器)服务器。
  2. 打开一个到 MX 服务器的套接字。
  3. 发送适当的SMTP 命令以将电子邮件传递到您的收件人帐户。您基本上可以自由地将“发件人”地址设置为您想要的任何任意东西。

SMTP 是一种非常简单/对人类友好的协议,因此手动完成所有这些工作并不是一项巨大的努力。同时,有一些预构建的库可以为您处理所有这些(可能除了收件人的 MX 服务器的解析)。

请注意,以这种方式发送的电子邮件更有可能被过滤为垃圾邮件(通常是因为发件人的 IP/主机名与您决定使用的外发电子邮件地址上的任何域都不匹配)。

另请注意,由于您可以将“发件人”地址设置为任何内容,因此您可以选择询问用户是否要提供他们的实际联系地址,如果他们愿意,您可以将其设为“发件人”地址,以便您可以如有必要,请实际与他们联系。

于 2012-10-05T13:28:46.243 回答
3

您根本不需要使用电子邮件。考虑使用像sentryairbrake这样的错误报告服务。

这些服务有您嵌入到程序中的客户端;它会自动记录您的错误,包括任何调试信息/堆栈跟踪;并在您的应用程序报告问题时通过电子邮件通知您。

通常您将应用程序的 API 集成到您自己的错误处理机制中。在发生错误时,客户端将捕获您的调试信息,您可以弹出一个模式询问用户诸如“发生此错误时您在做什么?”之类的信息,将其保存为错误响应的一部分,然后发送回服务。

由于该应用程序通过 HTTP 运行,因此您不需要打开任何特殊端口。这比让用户向您发送带有“它不起作用!!”的电子邮件更容易、更有帮助,而且您不必处理电子邮件发送的难题。

于 2012-10-05T13:27:35.467 回答
2

我最近写了一篇关于此的文章:使用 C# 发送电子邮件

你基本上有两个选择,要么使用 SMTP 客户端发送,这意味着你必须有一个 SMTP 服务器并且能够连接到端口 25(如果你不使用外部 SMTP,那么你必须自己管理)。或者,您可以使用外部电子邮件提供商,例如:

如果您使用 AlphaMail,您可以通过以下方式发送电子邮件:

IEmailService emailService = new AlphaMailEmailService()
    .SetServiceUrl("http://api.amail.io/v1/")
    .SetApiToken("YOUR-ACCOUNT-API-TOKEN-HERE");

var person = new Person()
{
    Id = 1234,
    UserName = "jdoe78",
    FirstName = "John",
    LastName = "Doe",
    DateOfBirth = 1978
};

var response = emailService.Queue(new EmailMessagePayload()
    .SetProjectId(12345) // ID of AlphaMail project (determines options, template, etc)
    .SetSender(new EmailContact("support@company.com", "from@example.com"))
    .SetReceiver(new EmailContact("Joe E. Receiver", "to@example.org"))
    .SetBodyObject(person) // Any serializable object
);

与仅构建 HTML 并使用 SMTP 客户端发送它的另一件事是,使用 AlphaMail,您可以直接在 GUI 中编辑您的代码之外的电子邮件。您还可以使用 AlphaMail 的模板语言Comlang轻松创建高度动态的模板。

<html>
    <body>
        <b>Name:</b> <# payload.FirstName " " payload.LastName #><br>
        <b>Date of Birth:</b> <# payload.DateOfBirth #><br>

        <# if (payload.Id != null) { #>
            <a href="http://company.com/sign-up">Sign Up Free!</a>
        <# } else { #>
            <a href="http://company.com/login?username=<# urlencode(payload.UserName) #>">Sign In</a>
        <# } #>
    </body>
</html>
于 2012-10-05T19:05:15.343 回答
0

实现此目的的另一种方法是托管 WCF 服务,该服务接收您的消息并存储在 db 或 /sends 电子邮件中。这样做的一个缺点是您需要一个 Web 服务器来执行此操作。

于 2012-10-05T19:53:34.373 回答
0

所以这是我的想法,你为什么不把电子邮件发送给你……就像你一样?

using System.Net;
using System.Net.Mail;

var fromAddress = new MailAddress("from@gmail.com", "From Name"); //Both the email addresses would be yours
var toAddress = new MailAddress("to@example.com", "To Name"); //Both the email addresses would be yours
const string fromPassword = "fromPassword";
const string subject = "There name or whatever";
const string body = "Errors ect....";

var smtp = new SmtpClient
           {
               Host = "smtp.gmail.com",
               Port = 587,
               EnableSsl = true,
               DeliveryMethod = SmtpDeliveryMethod.Network,
               UseDefaultCredentials = false,
               Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
           };
using (var message = new MailMessage(fromAddress, toAddress)
                     {
                         Subject = subject,
                         Body = body
                     })
{
    smtp.Send(message);
}

来自这里的代码

他们所看到的只是提交按钮,因此他们不会拥有您的所有个人用户名/密码,而且您应该设置一个虚拟帐户以将它们发送到,即使它只是将它们转发到您的真实电子邮件帐户。

于 2012-10-05T13:31:50.077 回答
-2

尝试以下代码,这可能会对您有所帮助:

Dim objCDOMail
Set objCDOMail = Server.CreateObject("CDONTS.NewMail")
objCDOMail.From = "sender@domain.com" 
objCDOMail.To = "receiver@domain.com" 
objCDOMail.Subject = "Test Mail Script" 
objCDOMail.BodyFormat = 0 
objCDOMail.MailFormat = 0 
objCDOMail.Body = "Testing Mail from Test Script" 
objCDOMail.Importance = 1 
objCDOMail.Send 
Set objCDOMail = Nothing 
于 2012-10-05T13:39:36.457 回答