【问题标题】:c# Getting error while try to read receiving email from gmailc#尝试阅读来自gmail的接收电子邮件时出现错误
【发布时间】:2021-05-26 16:15:31
【问题描述】:

我正在尝试阅读来自 gmail 的接收电子邮件,我做到了。 如果电子邮件一一收到,它会完美运行。但如果电子邮件同时收到三或四封,我至少会错过其中两封。 我希望正确描述我的问题。 这是我的阅读代码;

private void StartReceiving()
    {
        Task.Run(() =>
        {
            using (ImapClient client = new ImapClient("imap.gmail.com", 993, txtEmail.Text, txtSifre.Text, AuthMethod.Login, true))
            {
                if (client.Supports("IDLE") == false)
                {
                    MessageBox.Show("server crash");
                    return;
                }
                client.NewMessage += new EventHandler<IdleMessageEventArgs>(OnNewMessage);
                while (true) ;
            }
        });
    }
    static void OnNewMessage(object sender,IdleMessageEventArgs e)
    {
        //MessageBox.Show("mesaj geldi");
        MailMessage m = e.Client.GetMessage(e.MessageUID, FetchOptions.Normal);
        f.Invoke((MethodInvoker)delegate
        {
            f.txtGelen.AppendText("Body: " + m.Body + "\n");
            
        });
        
    }

我该怎么办?我在这方面有点新手,我必须同时阅读至少 4 封电子邮件。

【问题讨论】:

    标签: c# gmail-imap


    【解决方案1】:

    我从未使用过 gmail,但我在读取 TCP/IP 日志文件时遇到了类似的问题,并且在我处理时它一直在发送消息。

    我解决它的方法是使用字符串列表,然后在后台工作人员中处理它。在比赛情况下,就地更改字符串可能是个问题。

    这是从我的代码中剪切和粘贴出来的,并且在没有检查我的语法的情况下进行了修改,但它是这样的:

        private System.ComponentModel.BackgroundWorker backgroundWorkerReadMail;
        private List<string> messagesToBeRead = null;
    
        /****************************************************************
         * readPassedMessage(string str)
         * Puts message in queue, and calls background worker 
         ****************************************************************/
        private void readPassedMessage(string str)
        {
            string stringToRead = str;
    
            if (messagesToBeRead == null) messagesToBeRead = new List<string>();
            messagesToBeRead.Add(stringToRead);
            if (backgroundWorkerReadMail != null && backgroundWorkerReadMail.IsBusy == false)
            {
                backgroundWorkerReadMail.RunWorkerAsync();
            }
            else if (backgroundWorkerReadMail == null)
            {
                // need to create it
            }
        }
    
       private void backgroundWorkerReadMail_DoWork(object passedObj, DoWorkEventArgs e)
        {
    
                if (messagesToBeRead == null || messagesToBeRead.Count == 0) return;
                if (backgroundWorkerReadMail.CancellationPending)
                {
                    messagesToBeRead.Clear();
                    e.Cancel = true;
                }
                else
                {
                    bool messagesLeftToRead = true;
                    while (messagesLeftToRead)
                    {
                        string curString = messagesToBeRead[0];
    
                    // < ADD CODE HERE TO DO WHATEVER YOU WANT WITH YOUR MESSAGE > //
                        
                        messagesToBeRead.RemoveAt(0);
                        if (messagesToBeRead.Count == 0 || backgroundWorkerVoiceAssist.CancellationPending)
                            break;
                    }  // while (messagesLeftToRead) end brace
                }
        }
    

    【讨论】:

    • 非常感谢,我会试试后台工作人员的东西。你真的让我很开心。
    猜你喜欢
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2015-08-26
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多