首页 > 编程语言 >C# Exchange 自用收发邮件工具类

C# Exchange 自用收发邮件工具类

时间:2023-09-27 10:35:04浏览次数:27  
标签:string SearchFilter Exchange C# 收发 tempStr new email 邮件

网上找了好久的代码,结合微软的文档和网上代码总结下来这个工具类(对邮件的附件的操作暂时没有写,以后用到了再补上)

 

using Microsoft.Exchange.WebServices.Data;
using System;
using System.Collections.Generic;

public class EmailUtil
{
    /// <summary>
    /// 回调函数
    /// </summary>
    /// <param name="args"></param>
    public delegate void CallBack(params object[] args);

    private ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

    public EmailUtil(string email_user, string email_pwd)
    {
        service.Credentials = new WebCredentials(email_user, email_pwd);
        service.UseDefaultCredentials = true;
        service.AutodiscoverUrl(email_user, RedirectionUrlValidationCallback);
    }


    /// <summary>
    /// 这个是和证书验证有关的东西,不用管,固定这么写
    /// </summary>
    /// <param name="redirectionUrl"></param>
    /// <returns></returns>
    private bool RedirectionUrlValidationCallback(string redirectionUrl)
    {
        bool result = false;
        Uri redirectionUri = new Uri(redirectionUrl);
        if (redirectionUri.Scheme == "https")
        {
            result = true;
        }
        return result;
    }

    /// <summary>
    /// 发送邮件
    /// </summary>
    /// <param name="subjetc">主旨</param>
    /// <param name="body">内容</param>
    /// <param name="toAddress">邮箱地址";"隔开 必填</param>
    /// <param name="ccAddress">邮箱地址";"隔开 没有就写空</param>
    public void SendMail(string subjetc, string body, string toAddress, string ccAddress)
    {
        EmailMessage email = new EmailMessage(service);

        string[] tempStr = toAddress.Split(';');
        for (int i = 0; i < tempStr.Length; i++)
        {
            if (string.IsNullOrEmpty(tempStr[i]))
            {
                continue;
            }
            email.ToRecipients.Add(tempStr[i]);
        }

        //副本没写就不做处理
        if (!string.IsNullOrEmpty(ccAddress))
        {
            tempStr = ccAddress.Split(';');
            for (int i = 0; i < tempStr.Length; i++)
            {
                if (string.IsNullOrEmpty(tempStr[i]))
                {
                    continue;
                }
                email.CcRecipients.Add(tempStr[i]);
            }
        }
        
        email.Subject = subjetc;
        email.Body = new MessageBody(body);
        email.Send();
    }



    /// <summary>
    /// 根据文件夹名获取文件id
    /// </summary>
    /// <param name="folderName"></param>
    /// <param name="wellKnownFolderName"></param>
    /// <param name="exchangeService"></param>
    /// <returns></returns>
    private FolderId GetFolderIdByFolderName(string folderName, WellKnownFolderName wellKnownFolderName)
    {
        FolderView folderView = new FolderView(10);
        FindFoldersResults folders = service.FindFolders(wellKnownFolderName, folderView);
        for (int i = 0; i < folders.Folders.Count; i++)
        {
            if (folders.Folders[i].DisplayName == folderName)
            {
                return folders.Folders[i].Id;
            }
        }
        return null;
    }


    /// <summary>
    /// 过滤器(有需求还可以再加)
    /// </summary>
    /// <returns></returns>
    private SearchFilter SetFilter(DateTime startTime, DateTime endTime, string subject)
    {
        List<SearchFilter> searchFilterCollection = new List<SearchFilter>();
        SearchFilter start = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeCreated, startTime);
        SearchFilter end = new SearchFilter.IsLessThanOrEqualTo(ItemSchema.DateTimeCreated, endTime);
        SearchFilter name = new SearchFilter.IsEqualTo(ItemSchema.Subject, subject);

        searchFilterCollection.Add(start);
        searchFilterCollection.Add(end);
        searchFilterCollection.Add(name);
        SearchFilter filter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection.ToArray());
        return filter;
    }


    /// <summary>
    /// 寻找邮件
    /// </summary>
    /// <param name="startDate">邮件开始时间(这个时间开始的)</param>
    /// <param name="endDate">邮件结束时间(这个时间结束的)</param>
    /// <param name="folderName">邮箱下的文件夹名字(如果直接拿收件匣下的邮件就填空)</param>
    /// <param name="subject">等于这个标题的</param>
    /// <param name="callBack">回调</param>
    /// <param name="args">回调参数</param>
    public void FindMail(DateTime startDate, DateTime endDate, string folderName, string subject, CallBack callBack, params object[] args)
    {
        //建立筛选器
        SearchFilter searchFilter = SetFilter(startDate, endDate, subject);

        ItemView itemView = new ItemView(30);
        FindItemsResults<Item> items;

        //寻找符合对象的条件的邮件
        if (!string.IsNullOrEmpty(folderName))
        {
            //通过邮件中的文件夹名字获取文件夹id
            FolderId folderId = GetFolderIdByFolderName(folderName, WellKnownFolderName.Inbox);

            items = service.FindItems(folderId, searchFilter, itemView);
        }
        else
        {
            items = service.FindItems(WellKnownFolderName.Inbox, searchFilter, itemView);
        }


        for (int i = 0; i < items.TotalCount; i++)
        {
            items.Items[i].Load(PropertySet.FirstClassProperties);
            string content = items.Items[i].Body.Text;//邮件内容

            //items.Items[i].Delete(DeleteMode.HardDelete/*这是删除邮件,有三个选项,具体看dll的注释*/);
            if (callBack != null)
            {
                callBack(content, args);
            }
        }
    }
}

 

标签:string,SearchFilter,Exchange,C#,收发,tempStr,new,email,邮件
From: https://www.cnblogs.com/Transmuter/p/17732067.html

相关文章

  • 测试技能提升篇——Docker的核心概念
    Docker已经不是什么新技术了,相信绝大多数同学在实际工作中都会对其有一定的了解,使用一些常用的命令行执行一些操控容器的基础操作,这方便的网络资源实现太多了,在这里就不进行相关讲解了。本文重点介绍一下涉及Docker的相关概念以及其核心组件的作用,相信会帮助想要深入研究Docker的同......
  • 详解使用VS code搭建C语言环境遇到的那些坑(适合小白)
    Vscode搭建C语言环境为啥想起来要装c环境?是因为亲属家的大一新生小朋友问我关于c的问题!好吧,学c语言那是20年前的事儿了,但是在小朋友面前也不能跌份,于是乎准备温习一下c!一切代码都的从选IDE开始,网上看了一下,现在比较多的就是推荐visualstudio(vs)和visualstudiocode(vscode),如果想......
  • 库函数 | C++17 std::filesystem文件系统 用法指北
    本文将针对常用的场景,对std::filesystem的使用逐一进行验证:判断文件夹是否存在创建单层目录逐级创建多层目录创建多级目录当前文件路径创建文件"from.dat"获取相对于base的绝对路径文件拷贝移动文件或重命名创建文件“example.dat”获取文件大小获取文件最后修改......
  • CH32V208以太网IAP修改用户区大小注意事项
    CH32v208以太网IAP修改用户区大小注意事项    CH32v208的以太网IAP程序中将FLASH分为3个区域,boot区40k、用户区44k和备份区44k,通过以太网接收到对端设备发来的以太网数据存到备份区中,之后复制到用户区,然后校验跳转,详细使用方法可以看一下例程中附带的使用教程。   ......
  • centos7 网卡配置文件解读
    借的图 另外,/etc/resolv.conf 是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序它的格式很简单,每行以一个关键字开头,后接一个或多个由空格隔开的参数 nameserver 8.8.8.8借鉴的:https://blog.csdn.net/lcr_happy/article/details/......
  • SE C# 添加 事件监听 --选择对象切换监听
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices.ComTypes;usingSystem.Runtime.InteropServi......
  • Idea 的 Ctrl + Shift + F 快捷键失效
    失效的原因:是因为和搜狗输入法的"简繁"切换的快捷键冲突了解决方案:设置搜狗输入法的"简繁"快捷键,把"简繁"快捷键换成其他,不要用Ctrl+Shift+F......
  • 视频监控\安防视频监控平台EasyCVR的远程控制有什么意义?
    EasyCVR国标视频融合云平台采用端-边-云一体化架构,具备海量视频接入、汇聚与管理、处理及分发等视频能力。该平台部署简单轻量,功能灵活多样。在视频能力方面,它可以实时视频直播、语音对讲、录像回放、云存储等,以实现动火作业现场的在线监测和作业安全预警。此外,还能进行报警联动和......
  • C# 获取文件夹和文件列表,与Windows系统看到的保持一致(包括隐藏文件)
    Windows系统中有很多系统隐藏的文件,如果不经过筛选,就会查出来多很多文件夹和文件。所以需要过滤掉FileAttributes.Hidden|FileAttributes.System的文件夹和文件//创建一个DirectoryInfo对象vardirectoryInfo=newDirectoryInfo(folderPa......
  • C# BeginInvoke实现异步编程
    C#BeginInvoke实现异步编程-CSDN博客https://blog.csdn.net/Nire_Yeyu/article/details/133203267 C#BeginInvoke实现异步编程BeginInvoke实现异步编程的三种模式:1.等待模式在发起了异步方法以及做了一些其他处理之后,原始线程就中断并且等异步方法完成之后再继续;eg:usingS......