Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过gmail发送了一封支持电子邮件_C#_Winforms_Email - Fatal编程技术网

C# 通过gmail发送了一封支持电子邮件

C# 通过gmail发送了一封支持电子邮件,c#,winforms,email,C#,Winforms,Email,我已经实现了通过gmail发送电子邮件的支持,一切都很好。但这段代码似乎有些奇怪,因为例如,客户要求程序员通过gmail提供电子邮件支持,完成后,程序员将源代码与程序一起提供给客户。当客户打开它(源代码)时,客户将知道用于提供电子邮件支持的电子邮件以及密码。我怎样才能防止呢?有什么好的解决方案可以在不泄露源代码中的电子邮件密码的情况下提供电子邮件支持 以下是我正在使用的代码: public void SendRecoverCredentials(string _to) {

我已经实现了通过gmail发送电子邮件的支持,一切都很好。但这段代码似乎有些奇怪,因为例如,客户要求程序员通过gmail提供电子邮件支持,完成后,程序员将源代码与程序一起提供给客户。当客户打开它(源代码)时,客户将知道用于提供电子邮件支持的电子邮件以及密码。我怎样才能防止呢?有什么好的解决方案可以在不泄露源代码中的电子邮件密码的情况下提供电子邮件支持

以下是我正在使用的代码:

public void SendRecoverCredentials(string _to)
    {
        try
        {
            SmtpClient _smtp = new SmtpClient();

            MailMessage _message = new MailMessage();

            _message.From = new MailAddress("credentialhelper@gmail.com", "Credential Helper - Support -");
            _message.To.Add(new MailAddress(_to, "To whom it may concern"));
            _message.Subject = "Credentials Recover";
            _message.Body = "Dear to whom it may concern" +
                "\n\n\nBelow are your credentials info:" + "\n\n\n\n" + "Please copy the Password and paste it to the program where the Old Password field is." + "\n\n\n\n" + "Username: " + UserInformation.Name + "\nPassword: " + UserInformation.Password +
                "\n\n\n\nTo avoid for future messages being moved to the spam or junk folder, please add credentialhelper@gmail.com to be your contact list." +
                "\n\n\n*** This is an automatically computer generated e-mail, please do not reply to this message ***";

            _smtp.Port = 587;
            _smtp.Host = "smtp.gmail.com";
            _smtp.EnableSsl = true;
            _smtp.UseDefaultCredentials = false;
            _smtp.Credentials = new NetworkCredential("support's e-mail address", "support's e-mail password");

            _smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            _smtp.Send(_message);

            ShowMessageBox("Your message has been successfully sent.", "Success", 2);
        }

        catch (Exception ex)
        {
            ShowMessageBox("Message : " + ex + "\n\nEither your e-mail or password incorrect. (Are you using Gmail account?)", "Error", 1);
        }
    }

谢谢大家!

简而言之,没有办法完全按照你的要求去做。您无法向客户端发送您的凭据并使其安全。将它们编译成DLL只能阻止最不懂技术的潜在攻击者

不过,有几种方法可以实现您的目标:

  • 让客户提供自己的电子邮件用户名和密码,并通过这些用户名和密码发送。这可能是最简单的,因为它不需要太多的设置

  • 使用OAuth。这基本上与选项1相同,不同的是不用他们提供密码,而是让他们在谷歌页面或其他任何地方单击“授予访问权限”。可能不是这样

  • 创建一个由您控制并存储凭据的Web服务,然后让您的应用程序与该Web服务联系。您的Web服务可以确保它是来自应用程序的有效请求,然后为您发送电子邮件。虽然这可能是最好的解决方案,但它也需要做最多的工作

  • 此外,尽管与您的问题没有直接关系,但此代码是一个严重的问题:

    
    用户名:“+UserInformation.Name+”\n密码:“+UserInformation.Password”
    


    首先,你甚至不能解密任何人的密码。您应该使用单向散列。有很多文章都在谈论为什么会这样,我在这里不再重复了。不管怎样,这是个坏主意。此外,通过电子邮件发送敏感信息也不理想。

    设置一个应用程序可以与之对话的服务,该服务将实际执行发送操作,或者允许用户使用自己的电子邮件地址对其进行配置。甚至可以使用OAuth来实现这个目的。你可能无论如何都不想使用Gmail,因为他们对你可以通过自动服务发送多少电子邮件有相当严格的限制。此外,你也不应该向别人发送密码。您应该拥有他们密码的单向散列,即使您也无法解密。或者在DLL中编译用于发送电子邮件的代码,并将其作为外部DLL发送给用户。@这样他们就可以轻松地反编译DLL并恢复它了?这是个糟糕的建议。你是对的-但这对每个人来说都不是那么简单@emodrenderoketooh,你指的是
    用户信息。密码
    ,它是返回
    字符串
    ,并且它从已经散列的数据库中检索密码,因此用户电子邮件地址上可见的文本将被散列为密码,不是实际的密码。用户收到后,必须从已收到的电子邮件中复制哈希密码,并将其放入
    旧密码
    文本框中,用户需要填写
    新密码
    文本框,然后在用户单击验证时。程序将检查放入
    旧密码
    中的散列密码是否与用户的用户名和密码匹配,如果是,则用户密码将替换为
    新密码
    (当然,在将其存储到数据库之前将对其进行散列),然后用户将无法再使用用户的旧密码登录。基本上,这就像恢复密码并设置新密码一样。无论如何,谢谢你的支持answer@Yunnan过期令牌可能更好。谢谢,我们将尝试第三种解决方案或第一种解决方案。