当前位置: 首页 > news >正文

c# 收发邮件

话不多说,请看代码:(后面附上项目整体代码,可详细查看。)。

算了,vip文章要评审,还是在这里给朋友们注释一下代码内容吧,方便大家参考使用。

收邮件:

核心代码:

pop3:

//using是个好东西,如果你没有关资源,他自动给你关,特别是对于流来说。pop3其实也是输入流,这里就需要用它来保证一下安全。 
using (var client = new Pop3Client())
            {
                client.Connect(PopName, PopPort, true); // 使用SSL连接,不用的话最后一个参数改成false。
                client.Authenticate(MailMS.AccountName, UPwd);//如果是非ssl连接,这里的密码最好也使用邮箱厂商后台可以设置的链接码。这个链接码在邮箱的pop3说明里面有,imap和smtp的说明里面也有。
                // 获取邮件数量
                int count = client.GetMessageCount();
                Console.WriteLine($"Total messages: {count}");

                // 获取最新的邮件(索引从0开始)
                for (int i = 0; i < count; i++)
                {
                    string c0 = "", c1 = "", c2 = "";
                    int key = count - 1 - i;
                    var message = client.GetMessage(key);
                    c1 = message.Subject;
                    c0 = message.From.ToString();
                    c2 = message.Date.ToString();
                    dataGridView1.Rows.Add(key + 1, "",
                    c1,
                    c0,
                    c2
                    );//我的页面有个dataGridView来显示邮件列表,所以这里绑一下数据。

                    Hashtable savedMail = new Hashtable();//这个hashtable用来在页面暂存邮件
                    savedMail.Add("Subject", message.Subject);
                    savedMail.Add("From", message.From.ToString());
                    savedMail.Add("Date", message.Date.ToString());
                    savedMail.Add("text", message.TextBody == null ? "" : message.TextBody);
                    savedMail.Add("html", message.HtmlBody == null ? "" : message.HtmlBody);

                    //附件
                    if (message.Attachments.Count() > 0)
                    {
                        savedMail.Add("Attachments", message.Attachments);
                    }
                    else
                    {
                        savedMail.Add("Attachments", null);
                    }

                    mails.Add((key + 1).ToString(), savedMail);//暂存所有邮件
                }
            }

imap:

//建立连接
            var client = new ImapClient();
            if (_ssl == "启用")
            {
                client.Connect(MailMS.Imap, MailMS.ImapPort, true); // 替换为你的 IMAP 服务器地址和端口
            }
            else {
                client.Connect(MailMS.Imap, MailMS.ImapPort, false); // 替换为你的 IMAP 服务器地址和端口
            }
            client.Authenticate(MailMS.UserName, MailMS.PassWd);

            client.Inbox.Open(FolderAccess.ReadWrite);

            打开smtp接口
            //MailKit.Net.Smtp.SmtpClient smtpClient = new MailKit.Net.Smtp.SmtpClient();
            //smtpClient.Connect(MailMS.SmtpName, MailMS.SmtpPort, true);
             注:用户名和密码应妥善保管,不要硬编码到源码中
            //smtpClient.Authenticate(MailMS.UserName, MailMS.PassWd);

            //加载分类邮箱
            AccountHandle acOperate = new AccountHandle();
            string[] addressInfo = acOperate.GetToAddress("select * from AutoeMailAddress where AccountName='" + MailMS.UserName + "'");
            string address1 = addressInfo[1];
            string address2 = addressInfo[2];
            string address3 = addressInfo[3];
            string address4 = addressInfo[4];

            //获取每一个邮件,保存到本地,同时转发,转移完后将邮件标记为已读,
            int size = 0;
            int uidCount = 0;
            int lastPage = 0;
            var query = SearchQuery.NotSeen;
            var uids = client.Inbox.Search(query);
            uidCount = uids.Count();
            lastPage = lastPage + uidCount;
            var inbox = client.Inbox;
            foreach (var uid in uids)
            {
                if (!IsMove)
                {
                    //停止进程
                    break;
                }
                //获取邮件
                var oldmail = inbox.GetMessage(uid);
                var flags = inbox.AcceptedFlags;
                var isRead = oldmail.Headers;
                string subject = oldmail.Subject;
                WriteStatus("开始转移标题为“" + subject + "”的邮件……");
                EmailData data = new EmailData();
                data.Subject = subject;


                //邮箱设置
                AccountInfo account = new AccountInfo();
                account.UserName = MailMS.UserName;
                account.PassWd = MailMS.PassWd;
                account.SmtpName = MailMS.SmtpName;
                account.SmtpPort = MailMS.SmtpPort;
                account.MailAddress = MailMS.MailAddress;


                if (subject.ToLower().Contains("class1"))
                {
                    data.To = address1;
                }
                else if (subject.ToLower().Contains("class2"))
                {
                    data.To = address2;
                }
                else if (subject.ToLower().Contains("class3"))
                {
                    data.To = address3;
                }
                else
                {
                    data.To = address4;
                }


                data.From = MailMS.MailAddress;
                data.TextBody = oldmail.TextBody;
                data.HtmlBody = oldmail.HtmlBody;

                //附件
                data.Files = null;

                Hashtable Mail = new Hashtable();
                Mail.Add("Attachments", oldmail.Attachments);

                //发送邮件
                EmailHelper.SendEmailWait(data, Mail, account);

                //等待5秒,避免服务器认为是攻击
                await Task.Delay(5000);

                //发送完毕
                WriteStatus("邮件“" + subject + "”转移完毕");

                //将此邮件标记为已读
                client.Inbox.AddFlags(uid, MessageFlags.Seen, true);

                size++;


                
            }

            if (!IsMove)
            {
                WriteStatus("强制停止转移,邮件转移完毕,总共处理了" + size + "封邮件");
            }
            else
            {
                WriteStatus("邮件转移完毕,总共处理了" + size + "封邮件");
            }

            //smtpClient.Disconnect(true);
            client.Disconnect(true);

发邮件:

核心代码:

smtp:

 /// <summary>
        /// 带了本地的文件和转发的文件
        /// </summary>
        /// <param name="data"></param>
        /// <param name="mail"></param>
        public static async void SendEmail(EmailData email, Hashtable mail, AccountInfo account)
        {
            try
            {

                // 创建一个新的 MIME 消息对象
                var message = new MimeMessage();
                // 设置发件人
                message.From.Add(MailboxAddress.Parse(email.From));
                // 设置收件人
                message.To.Add(MailboxAddress.Parse(email.To));
                // 设置主题
                message.Subject = email.Subject;
                // 创建邮件正文
                var builder = new BodyBuilder();
                builder.TextBody = email.TextBody;
                builder.HtmlBody = email.HtmlBody;

                // 添加附件
                if (email.Files != null && email.Files.Count > 0)
                {
                    for (int i = 0; i < email.Files.Count; i++)
                    {
                        using (var stream = new FileStream(email.Files[i].ToString(), FileMode.Open))
                        {
                            builder.Attachments.Add(email.Files[i].ToString(), stream);
                        }
                    }
                }

                //如果转发的邮件有附件,把附件加上
                if (mail != null)
                {
                    IEnumerable<MimeEntity> list = (IEnumerable<MimeEntity>)mail["Attachments"];
                    foreach (MimeEntity item in list)
                    {
                        builder.Attachments.Add(item);
                    }

                }


                // 设置正文
                message.Body = builder.ToMessageBody();
                // 使用 SMTP 客户端发送邮件
                using (var client = new SmtpClient())
                {
                    //await client.ConnectAsync("smtp.qq.com", 465, true);
                    await client.ConnectAsync(account.SmtpName, account.SmtpPort, true);
                    // 注:用户名和密码应妥善保管,不要硬编码到源码中
                    //await client.AuthenticateAsync("33072340@qq.com", "lctzfpbaxgdpbhih");
                    await client.AuthenticateAsync(account.MailAddress, account.PassWd);
                    // 发送邮件
                    await client.SendAsync(message);
                    // 断开与服务器的连接
                    await client.DisconnectAsync(true);
                }
                //Console.WriteLine("邮件已成功发送!");
            }
            catch (Exception ex)
            {
                throw ex;
                //Console.WriteLine($"邮件发送失败:{ex.Message}");
            }
        }

完整代码下载:

https://download.csdn.net/download/axe6404/90438801

相关文章:

  • 一些房产网站是怎么做的东莞网络营销推广专业
  • 珠海手机网站建设价格网站外链工具
  • 网站稳定性百度站内搜索的方法
  • 网站建设平台方案设计在线建站网页制作网站建设平台
  • 武汉做网站排名网络营销课程
  • 响应式网站用什么技术做郑州抖音推广
  • 使用 Docker 部署 Memos:简易教程
  • 解释Promise的工作原理及其状态
  • 计算机毕业设计SpringBoot+Vue.js作业管理系统(源码+文档+PPT+讲解)
  • Java中字符串替换的方法
  • Java 网络八股 TCP协议:三次握手四次挥手全图解
  • Opencv 图像形态学操作
  • VC++ MFC中 CTreeCtrl的自绘
  • 使用create_sql_query_chain工具根据自然语言问题生成SQL查询,踩坑版
  • 浙江大学《数据结构》第一章 笔记
  • 新时代,科技助力运动旅游开启新潮流
  • ESP32-S3 42引脚 语音控制模块、设备运转展示 GOOUUU TECH 果云科技S3-N16R8 控制舵机 LED开关 直流电机
  • 更换k8s容器运行时环境为docker
  • git 常用指令
  • dify镜像拉取不下来如何解决
  • 【分布式锁通关指南 05】通过redisson实现分布式锁
  • 【AIGC系列】5:视频生成模型数据处理和预训练流程介绍(Sora、MovieGen、HunyuanVideo)
  • 基于 Ray 构建的机器学习平台
  • 处理大数据的架构模式:Lambda 架构 和 Kappa 架构
  • 防火墙的智能选路与NAT实验
  • Qt 中 **QGraphicsView** 框架的总结