解决  通过APP发送邮件

品露

成员
已加入
2020年3月22日
留言内容
5
编程经验
Beginner
你好,

我的路由器没有任何DynDNS功能,因此我认为我可以在服务器上运行一个小的控制台应用程序,该服务器向我发送带有外部IP的电子邮件。
这是我的主要:
C#:
private static void Main(string[] args)
        {
            bool Alive = true;
            while (Alive)
            {
                Alive = MainCode();
            }
        }

        private static bool MainCode()
        {
            Console.Clear();
            Console.Write("\r\nInput: ");

            switch (Console.ReadLine())
            {
                case "rdp":
                    Openrdp();
                    return true;

                case "mail":
                    _ = new Mailmng();
                    return true;

                case "exit":

                    return false;

                default:

                    return true;
            }
        }

这是我的Mailmng课:
C#:
 public class Mailmng
    {
        public Mailmng()
        {
            Timer t = new Timer(TimeSpan.FromMinutes(2).TotalMilliseconds);
            t.AutoReset = true;
            t.Elapsed += new System.Timers.ElapsedEventHandler(Mail);
            t.Start();
        }

        public static string GetIP()
        {
            string url = "http://checkip.dyndns.org";
            System.Net.WebRequest req = System.Net.WebRequest.Create(url);
            System.Net.WebResponse resp = req.GetResponse();
            System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
            string response = sr.ReadToEnd().Trim();
            string[] a = response.Split(':');
            string a2 = a[1].Substring(1);
            string[] a3 = a2.Split('<');
            string a4 = a3[0];
            return a4;
        }

        public void Mail(object sender, ElapsedEventArgs e)
        {
            string to = "******";
            string from = "*******";
            try
            {
                using (MailMessage mm = new MailMessage(from, to))
                {
                    mm.Subject = "ServiceAPP";
                    mm.Body = GetIP();
                    mm.IsBodyHtml = false;
                    SmtpClient smtp = new SmtpClient();
                    smtp.Host = "smtp.gmail.com";
                    smtp.EnableSsl = true;
                    NetworkCredential NetworkCred = new NetworkCredential(from, "*********");
                    smtp.UseDefaultCredentials = true;
                    smtp.Credentials = NetworkCred;
                    smtp.Port = 587;
                    Console.WriteLine("Sending Email......");
                    smtp.Send(mm);
                    Console.WriteLine("Email Sent.");
                    //System.Threading.Thread.Sleep(3000);
                    //Environment.Exit(0);
                }
            }
            catch (SmtpException ex)
            {
                throw new ApplicationException
                  ("SmtpException has occured: " + ex.Message);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

最终,我希望这个应用程序每6小时通过邮件向我发送一次IP(用于将其设置为2分钟进行调试),但是我现在有2个问题:

1.)第一封电子邮件发送完美,但是之后,没有电子邮件发送。在控制台中键入任何内容后,所有应发送的电子邮件都会立即消失。
2.)从应用发送的每封电子邮件都会增加使用的RAM


我知道还有其他方法可以做到这一点。但是我认为这将是一个很好的初学者项目,并了解有关Timers的更多信息。
 
Last edited:

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
我的路由器没有任何DynDNS功能,因此我认为我可以在服务器上运行一个小的控制台应用程序
与您的ISP仔细检查您的服务条款。如果您使用Cox,Verizon,Time Warner或Charter,他们明确表示您不得在家中运行服务器。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
带有劣质路由器与您违反服务条款有什么关系?这就像告诉警察给您一张在25个区域中执行50次操作的罚单一样,您被允许超速行驶,因为殴打的Pinto刹车失灵了。
 

品露

成员
已加入
2020年3月22日
留言内容
5
编程经验
Beginner
带有劣质路由器与您违反服务条款有什么关系?这就像告诉警察给您一张在25个区域中执行50次操作的罚单一样,您被允许超速行驶,因为殴打的Pinto刹车失灵了。
我可以在家中拥有任意数量的服务器。没有限制
 
Last edited:

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果您可以负担得起那么多服务器,那么您可能可以负担得起内置DynDNS支持的更好的路由器。如果您被迫使用ISP的路由器,则可以在ISP的路由器后面放置另一个路由器,然后将第二个路由器设置为ISP。第一个路由器的DMZ。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
Anyway, the following seems to work fine for me. The blocking of happening on your thread callback seems to be caused by something else. I suggest trying to set some breakpoints and/or verifying the type of Timer you are using:
C#:
using System;

namespace ConsoleTest
{
    class ConsoleShell
    {
        public static void Main()
        {
            var t = new System.Timers.Timer(TimeSpan.FromSeconds(5).TotalMilliseconds) { AutoReset = true };

            Console.WriteLine("Type 'doit' to start timer. 'exit' to stop parsing loop.");

            bool quit = false;
            do
            {
                switch (Console.ReadLine().ToLower())
                {
                    case "doit":
                        Console.WriteLine("Starting timer.");
                        t.Elapsed += (o, e) => Console.WriteLine($"{DateTime.Now}: Doing it.");
                        t.Start();
                        break;

                    case "exit":
                        quit = true;
                        break;
                }
            } while (!quit);

            t.Stop();
            Console.WriteLine("Done.");
            Console.ReadKey();
        }
    }
}
 

品露

成员
已加入
2020年3月22日
留言内容
5
编程经验
Beginner
Anyway, the following seems to work fine for me. The blocking of happening on your thread callback seems to be caused by something else. I suggest trying to set some breakpoints and/or verifying the type of Timer you are using:
C#:
using System;

namespace ConsoleTest
{
    class ConsoleShell
    {
        public static void Main()
        {
            var t = new System.Timers.Timer(TimeSpan.FromSeconds(5).TotalMilliseconds) { AutoReset = true };

            Console.WriteLine("Type 'doit' to start timer. 'exit' to stop parsing loop.");

            bool quit = false;
            do
            {
                switch (Console.ReadLine().ToLower())
                {
                    case "doit":
                        Console.WriteLine("Starting timer.");
                        t.Elapsed += (o, e) => Console.WriteLine($"{DateTime.Now}: Doing it.");
                        t.Start();
                        break;

                    case "exit":
                        quit = true;
                        break;
                }
            } while (!quit);

            t.Stop();
            Console.WriteLine("Done.");
            Console.ReadKey();
        }
    }
}
谢谢,我会研究这个
 
最佳 底部