能否通过编程方式发送电子邮件,而不需要使用任何实际的电子邮件帐户?

12

我正在考虑为我的游戏实现“报告错误/建议”选项,但我不确定如何让它正常工作。我没有自己的服务器或其他任何东西,所以我无法将用户编写的文本发送到那里。

我唯一想到的方法是客户端编写一条消息,然后我将其发送到一个电子邮件帐户,在那里我可以阅读它们。然而,我不希望用户需要通过他们的个人帐户发送报告。我不太确定如何实现这一点,并且搜索并没有带来任何好的建议。

我没有做过很多网络方面的工作,如果您能逐步解释(可能甚至在代码中)该过程,我会非常感激。

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


我认为有一种联系方式可以与他们重新取得联系,以便获取更多关于他们经历的详细信息,这将是一个不错的主意。同时,如果有一种途径可以告知他们问题正在得到解决,或者已经解决,那也会很好。 - krillgar
6个回答

12

是的,完全可以做到。从比较低层的角度来看,你需要:

  1. 解析你想要发送邮件的电子邮件帐户的 MX(邮件交换器)服务器。
  2. 打开一个套接字以连接 MX 服务器。
  3. 发送适当的 SMTP 命令,使邮件消息被发送到你的收件人帐户。你基本上可以自由地设置“发件人”地址为任何你想要的任意内容。

SMTP 是一种非常简单/人性化的协议,因此手动完成所有这些不是很费力。同时,有预先构建的库可以为您处理所有这些操作(除了可能需要解析收件人的 MX 服务器)。

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

此外,请注意,由于你可以将“发件人”地址设置为任何内容,你可以询问用户是否提供他们实际的联系地址,如果他们这样做,你可以将其作为“发件人”地址,这样如果必要的话,你就可以与他们联系回去。


2
如果您有自己的SMTP服务器并将其配置为允许任何人发送邮件,则可能会起作用。但是,大多数公共SMTP服务器将拒绝从随机主机发送的邮件。因此,我认为这不可行。 - Alex
这绝对不需要操作自己的SMTP服务器。我经常使用JavaMail这种方法,允许从开发系统发送电子邮件,而无需每个开发人员设置/运行本地SMTP服务器。只需查找收件人的MX服务器,将其传递给JavaMail作为出站SMTP服务器,其余部分就是自动的。对于真正偏执的人来说,通过将“from”地址设置为类似于user@<current_ip_address>的内容,几乎可以完全消除被拒绝为垃圾邮件的可能性。 - aroth
你仍然需要连接到SMTP服务器,而且大多数情况下匿名连接都会被拒绝。此外,除非收件人使用一些非常糟糕的垃圾邮件过滤器(或者已经使用白名单),否则公共电子邮件提供商的垃圾邮件过滤器几乎总是会拒绝此类邮件,因为发件人没有有效的反向DNS(这是SPAM检查的标准之一)。这是一个不错的方法,但并不普遍适用。 - Burhan Khalid
2
@BurhanKhalid - 大多数SMTP服务器会丢弃匿名发送连接/中继尝试(顺带一提,配置任何SMTP服务器允许任何人发送邮件是一个坏主意)。然而,在这种情况下没有出站SMTP服务器(用户设备变成了出站邮件“服务器”)。大多数SMTP服务器允许匿名传入连接。这是协议的基础。大多数会进行反向DNS查找作为垃圾邮件过滤的一部分,但几乎没有一个仅根据此基础拒绝消息。 - aroth
第二个链接已失效(问题已删除)。 - Artemis

3
您无需使用电子邮件。考虑使用错误报告服务,例如SentryAirbrake
这些服务具有客户端,您可以将其嵌入到程序中;它们会自动记录您的错误,包括任何调试信息/堆栈跟踪;并在应用程序报告问题时通过电子邮件通知您。
通常,您需要将应用程序的API集成到自己的错误处理机制中。在发生错误的时候,客户端会捕获您的调试信息,您可以弹出一个模态框询问用户:"发生错误时你正在做什么?”,将其保存为您发送回服务器的错误响应的一部分。
由于该应用程序在HTTP上工作,您无需打开任何特殊端口。这比让用户通过电子邮件发送“它不起作用!”更容易且更有帮助,并且您无需处理电子邮件发送方面的问题。

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>

你如何将AlphaMail库包含到WP7项目中,因为它们没有编译为WP7程序集? - PmanAce
发送电子邮件的C#链接也已损坏。 - Wolf

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);
}

来自 这里 的代码

他们所看到的只会是提交按钮,因此他们不会获得你所有的个人用户名/密码,另外你应该设置一个虚拟账户,即使它只是将邮件转发到你的真实电子邮件账户。


1
我不确定在应用程序中嵌入电子邮件密码是否明智。这样做很容易被提取,而且意味着您无法更改密码。 - ctacke
坚实的观点。明智吗?绝对不是,会奏效吗?绝对会。 - Joshua Van Hoesen
我想知道你是否尝试在Windows手机上发送电子邮件时,是否会弹出安全提示,要求授权。我还想知道是否可以在应用程序表单中包含一些HTML代码,以某种方式使用href="mailto:",让手机加载邮件应用程序。 - Phill
说实话,我不知道,我从来没有为Windows手机编写过任何东西,我更像是一个会计软件的人。 - Joshua Van Hoesen

0

另一种实现这个目标的方法是托管一个 WCF 服务,该服务接收您的消息并将其存储在数据库中或发送电子邮件。其中一个缺点是您需要一个 Web 服务器来完成此操作。


-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 

该问题说明它使用的是C#而不是Visual Basic。 - Harold_Finch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接