C#实现邮件发送,可以添加附件,发件人、收件人信息从xml文件读取

C#发送邮件(添加附件)! using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Mail; 阅读详情

变量:

#region 变量
        private XmlDocument xmlDoc = new XmlDocument();
        private ArrayList toList = new ArrayList();
        private byte key = 123;//加密字
        #region 发件人信息
        private string FJRYXQC = string.Empty;
        private string FJRYXMM = string.Empty;
        private string FJRYXMC = string.Empty;
        private string YXFWQDZ = string.Empty;
        private string FJRXM = string.Empty;
        private string YXFWQPORT = string.Empty;
        #endregion
        #region 收件人信息
        string ACCYXQC = string.Empty;
        string ACCBZ = string.Empty;
        #endregion
        #endregion

发送邮件:

 #region 发送邮件
  
        /// <summary>
        /// 
        /// </summary>
        /// <param name="theme">邮件主题</param>
        /// <param name="body">邮件内容</param>
        /// <param name="FJLJ">附件路径(附件以字符串的形式存在数组里面)</param>
        public void Send(string theme, string body, string[] FJLJ)
        {
            if (LoadFsrXmlData() && LoadJsrXmlData())
            {
                MailMessage mail = new MailMessage();
                mail.From = new MailAddress(FJRYXQC, FJRXM);
                //发送给谁 
                foreach (String to in toList)
                {
                    mail.To.Add(to);
                }
                //标题 
                mail.Subject = theme;
                //内容编码 
                mail.BodyEncoding = Encoding.Default;
                //发送优先级 
                mail.Priority = MailPriority.High;
                //邮件内容 
                mail.Body = body;
                //是否HTML形式发送 
                mail.IsBodyHtml = true;
                //附件 
                try
                {
                    Attachment data;
                    ContentDisposition disposition;

                    if (FJLJ != null && FJLJ.Length > 0)
                    {
                        foreach (string str in FJLJ)
                        {
                            data = new Attachment(str, MediaTypeNames.Application.Octet);//实例化附件  
                            disposition = data.ContentDisposition;
                            mail.Attachments.Add(data);//添加到附件中 
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception("添加附件错误!" + ex.Message);
                }
                //邮件服务器和端口号
                int port = int.Parse(YXFWQPORT);
                SmtpClient smtp = new SmtpClient(YXFWQDZ, port);
                //587  
                smtp.UseDefaultCredentials = true;
                //指定发送方式 
                smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                //指定登录名和密码 
                smtp.Credentials = new System.Net.NetworkCredential(FJRYXMC, FJRYXMM);
                //超时时间 
                smtp.Timeout = 300000;
                smtp.Send(mail);
                MessageBox.Show("发送成功!");
            }
            else
            {
                if (!LoadFsrXmlData()) { 
                    MessageBox.Show("无发件人信息!");
                }

                if (!LoadJsrXmlData())
                {
                    MessageBox.Show("无收件人信息!");
                }
            }
        }
        #endregion

加载fsr.xml文件  读取发送人xml配置文件:

     #region 加载fsr.xml文件  发送人xml配置文件
        public bool LoadFsrXmlData()
        {
            string outMsg = string.Empty;
            try
            {
                string path = Application.StartupPath;
                string folder = System.IO.Path.Combine(path, "config");
                string xmlFileName = System.IO.Path.Combine(folder, "fsr.xml");
                bool folderExists = System.IO.Directory.Exists(folder);
                if (folderExists && File.Exists(xmlFileName))//当文件存在时
                {
                    xmlDoc.Load(xmlFileName);
                    XmlNode root = xmlDoc.SelectSingleNode("root");
                    XmlNodeList nodeList = root.ChildNodes;//获得root节点的子节点
                    foreach (XmlElement xe in nodeList)
                    {
                        FJRYXQC = xe.GetElementsByTagName("FJRYXQC")[0].InnerText;
                        FJRYXMM = encryptDecryptStr(xe.GetElementsByTagName("FJRYXMM")[0].InnerText);
                        FJRYXMC = xe.GetElementsByTagName("FJRYXMC")[0].InnerText;
                        YXFWQDZ = xe.GetElementsByTagName("YXFWQDZ")[0].InnerText;
                        FJRXM = xe.GetElementsByTagName("FJRXM")[0].InnerText;
                        YXFWQPORT = xe.GetElementsByTagName("YXFWQPORT")[0].InnerText;
                    }
                    return true;
                }
                return false;
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("加载config.xml文件失败:" + ex.Message);
                return false;
            }
        }
        #endregion

加载jsr.xml文件 读取接收人xml配置文件:

#region 加载jsr.xml文件 接收人xml配置文件
        public bool LoadJsrXmlData()
        {
            try
            {
                string path = Application.StartupPath;
                string folder = System.IO.Path.Combine(path, "config");
                string xmlFileName = System.IO.Path.Combine(folder, "jsr.xml");
                bool folderExists = System.IO.Directory.Exists(folder);
                if (folderExists && File.Exists(xmlFileName))//当文件存在时
                {
                    xmlDoc.Load(xmlFileName);
                    XmlNode root = xmlDoc.SelectSingleNode("root");
                    XmlNodeList nodeList = root.ChildNodes;//获得root节点的子节点
                    foreach (XmlElement xe in nodeList)
                    {
                        toList.Add(xe.GetElementsByTagName("ACCYXQC")[0].InnerText);
                    }
                    return true;
                }
                return false;
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("加载config.xml文件失败:" + ex.Message);
                return false;
            }
        }
        #endregion

密码加密:

# region 异或加密算法
        public string encryptDecryptStr(string p)
        {
            byte[] bs = Encoding.Default.GetBytes(p);
            for (int i = 0; i < bs.Length; i++)
            {
                bs[i] = (byte)(bs[i] ^ key);
            }
            return Encoding.Default.GetString(bs);
        }
        #endregion



【ChatGPT】Spire.Doc 授权实战:从购买到代码集成的完整指南 本文详细介绍了Spire.Doc商业授权的购买与集成流程,帮助开发者解决功能限制和水印问题。从授权类型选择、购买步骤到代码集成实战,提供完整指南。特别推荐将授权文件作为嵌入式资源,确保安全部署,并分享结合ChatGPT生成代码示例的高级技巧,提升文档处理效率。 阅读详情

相关推荐

Coze平台转型智能办公:AI Agent工作流与自动化场景实战解析

AI Agent(智能体)作为当前人工智能应用的核心架构,通过结合大语言模型(LLM)的认知能力与外部工具的执行能力,实现了从感知到行动的闭环。其技术原理通常基于ReAct(推理-行动)等框架,使Agent能根据目标自主规划并调用工具。这一架构的技术价值在于将通用AI能力转化为解决特定业务问题的自动化流程,显著提升效率与准确性。在应用场景上,AI Agent正从早期的对话原型快速向企业级办公自动化演进,例如自动化报告生成、智能客服工单处理和销售线索筛选等。本文聚焦于Coze平台的升级,深入探讨其如何通过强化

weixin_30326515的博客 505

桥接模式+C#发送邮件+配置文件

目录 一、桥接模式 二、桥接模式角色 三、代码实例一 UML 一、桥接模式 将抽象化和实现化脱耦,使得二者可以独立变化。桥接模式将继承方式转化为了组合聚合方式,强关联就变成了弱关联。 本质是分离抽象和实现。 符合组合/聚合原则,符合开放封闭原则,松耦合,高内聚。 耦合:两个实体行为的某种强关联。 解耦:将强关联去掉或改成弱关联。 继承->聚合 该模式包含两个等级结...

lanshan1111的博客 440

Excel与Robot Framework结合实现WebService接口自动化测试

接口自动化测试是软件质量保障的关键环节,其核心在于通过脚本模拟用户操作,自动验证接口功能与性能。其原理是通过测试框架驱动,发送请求并验证响应,从而实现测试过程的标准化与可重复性。这一技术的价值在于提升测试效率、保障回归测试覆盖率,并促进持续集成实践。在应用场景上,尤其适合WebService这类基于HTTP/SOAP协议的接口测试。本文聚焦于如何利用Excel管理测试数据,结合Robot Framework这一关键字驱动框架,构建一套协作友好、易于维护的自动化测试方案,有效解决测试数据与脚本逻辑耦合、用例维

benben 2324

收发邮件之 MAILKIT

背景利用代码发送邮件在工作中还是比较常见的,相信大家都用过SmtpClient来处理发送邮件的操作,不过这个类以及被标记已过时,所以介绍一个微软推荐的库MailKit来处理。MailKit开源地址:https://github.com/jstedfast/MailKit需要邮件功能1、服务提供方:需提供邮件收发客户端或Web服务。如:QQ邮箱、GMail邮箱、126、16...

dotNET跨平台 2150

AI搜索的本质:从信息检索到意图执行的技术演进

搜索已不再是简单的关键词匹配,而是一种基于用户意图的理解与执行过程。其核心原理正从传统TF-IDF和PageRank的静态文档相似度计算,转向融合上下文、设备、行为等多维信号的动态可信度建模。这一转变带来显著技术价值:大幅降低用户认知负荷、提升任务完成率、重构广告与知识服务的信任机制。典型应用场景覆盖政务办事、医疗故障诊断、教育路径规划及企业知识库问答等高可靠性需求领域。本文深入剖析支撑AI搜索落地的三大技术支柱——意图理解层的语义锚点设计、知识融合层的RAG幻觉抑制策略、行动执行层的原子化服务编排,并结合

weixin_33749131的博客 371

C#中自动发送邮件的实现

源代码: using System; using System.Windows.Forms; using System.Net.Mail; using System.Text.RegularExpressions; namespace 邮件 { public partial class Form1 : Form { string fileName;//获取文件名 public Form1() { ...

qq_30725967的博客 5467

基于C++与Qt的跨平台邮件发送工具开发实战

邮件发送是自动化通知、系统监控和用户交互中的基础功能,其核心依赖于SMTP协议。该协议定义了客户端与服务器之间的通信规则,通过命令-响应模式完成邮件传输。在技术实现上,开发者需要处理网络连接、身份认证、数据编码等关键环节。对于需要高性能和原生体验的桌面应用,C++结合Qt框架提供了理想的解决方案。Qt的网络模块封装了底层Socket通信,简化了异步操作和SSL/TLS加密处理,而其信号与槽机制则优雅地管理了网络状态机。通过构建一个完整的邮件发送工具,开发者不仅能掌握MIME格式组装、Base64与Quote

weixin_34088583的博客 357

C#实现的自定义邮件发送类完整实例(支持多人多附件)

主要介绍了C#实现的自定义邮件发送类,具有支持多人多附件的功能,涉及C#邮件操作的相关技巧,需要的朋友可以参考下

c# 的一些库

WebRequest 和 WebResponse 类形成了所谓的可插接式协议的基础,可插接式协议是网络服务的一种实现,它使您能够开发出使用 Internet 资源的应用程序,而不必考虑各种不同协议的具体细节。C# Convert 方法是数据类型转换中最灵活的方法,它能够将任意数据类型的值转换成任意数据类型,前提是不要超出指定数据类型的范围。提供一个与 HTTP 请求一起使用的对象,用于保存基于 Silverlight 的应用程序的状态信息。WebRequest类发出对统一资源标识符 (URI) 的请求。

chengcao123的博客 1737

植物GO注释

本文主要是对没有GO term库的植物进行注释。 1、选用AgriGo 进行注释,在agriGO中点击species后,查看与你目标物种相近的物种作为库 2、比如我以甜菜为例 为了找到和GO term对应的ID,先找到PLAZA,进入网站https://bioinformatics.psb.ugent.be/plaza/versions/plaza_v3_di...

weixin_30300225的博客 2225

ARM CoreSight架构

CoreSight架构是现代复杂SoC的“飞行数据记录仪”(黑匣子)和“精密诊断仪”的结合体。它彻底改变了嵌入式系统的调试方式,从传统的“盲人摸象”变成了拥有“上帝视角”,是ARM生态系统能够支撑起从微控制器到高性能服务器芯片如此广泛产品线的重要基石技术之一。

guigenyi的专栏 1421

如何利用Python编程实现自动化办公,提高工作效率

随着互联网的发展,编程技能已经成为了当代职场人士的必备技能之一。不管你是从事什么行业,只要你会一些编程,就可以利用计算机来帮你完成一些重复性、繁琐的工作任务,从而节省时间和精力,提高工作效率和质量。

qq_46094651的博客 1152

电芯外观及体系设计(Cell Design)-①容量平衡设计(Cell Balance Design)

全面获取并正确解读客户需求,将需求进行分解和预判,结合公司现有资源、技术,给出设计方案。一个优秀的电芯设计方案,应该是稳健的,可操作的,满足客户需求的同时,并能为公司带来较多利润。电芯设计需同时考虑周期,性能,品质,加工性,成本,及安全与稳健性。设计人员时刻要有成本控制观念,但利润则是由公司战略所决定。

FDC1303864002的博客 1352

【CAD开发】3dxml文件格式开发准备

文章目录1、简介2、3DXML查看工具2.1 3DXML Player2.2 Pixyz Studio3、3DXML 文件结构3.1 Model_3dxml3.2 Model_3dxml/Header3.3 Model_3dxml/ProductStructure3.4 ProductStructureType/Reference3D3.5 ProductStructureType/Instance3D3.6 ProductStructureType/ReferenceRep3.7 ProductStru

爱看书的小沐 8832

更新3ds时和用读卡器读取传输文件操作不当导致的tf卡损坏无法读取需要格式化时出现的问题以及不想丢失文件并且修复的详细解决方法

前言: 不小心按了同意更新而且tf/sd卡损坏导致了3ds打开后都是出现 Anerror has occurred:(红色的) Failed to apply 1 FIRM patch(es). Press any button to shotdown 这样的画面,按了任意键后就关机,我找了很多资料和大佬的回答解决了这些问题,现在记录一下。 一.不小心按了更新导致上述的画面 原因:是因为系统升级了,但是里面的Luma3DS还没有更新,属于是更新了但没有完全更新的状态。 **修复方法** 1.首先请按

give_me_fish的博客 1万+

JeecgBoot漏洞利用工具解析:一键getshell原理与安全加固实践

在应用安全领域,远程代码执行(RCE)和文件上传漏洞是Web系统面临的高危威胁,其核心原理在于对用户输入的控制不足或安全校验缺失。攻击者通过构造恶意请求,可绕过系统边界,在服务器上执行任意命令或上传恶意文件,从而获取系统控制权。这类漏洞的技术价值在于揭示了应用层安全防护的薄弱环节,其利用方式自动化、集成化趋势明显,极大地提升了攻击效率。在低代码开发平台等快速构建的业务系统中,此类风险尤为突出。应用场景广泛覆盖安全测试、渗透评估与应急响应。本文聚焦于JeecgBoot平台的历史高危漏洞,深入解析其SQL注入、

weixin_30787531的博客 552

JUnit4测试报告JSON化:从XML转换到DevOps集成的完整实践

在软件测试与持续集成(CI/CD)领域,测试报告是评估代码质量、追踪问题的关键产出。JUnit作为Java生态中最经典的单元测试框架,其默认生成的XML格式报告虽然结构化,但在现代自动化、集成化的DevOps流程中,存在数据孤岛、难以与外部系统联动的问题。JSON作为一种轻量级、机器可读的数据交换格式,为测试结果的“数据化”和“API化”提供了理想的解决方案。通过将JUnit4的XML报告转换为JSON,测试结果便可以被任何支持JSON的系统(如可视化图表、数据分析服务、消息机器人或质量看板)轻松消费,从而

weixin_33688840的博客 436

求助:有没有基于pscad的锂电池仿真模型

求助:有没有基于pscad的锂电池仿真模型 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变没有 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写...

qq_38922523的博客 1222

VC++6.0仿360界面POP3邮件监控系统:Win32桌面开发与多线程实战

在Windows桌面应用开发领域,理解底层系统机制是构建稳定高效软件的基础。Win32 API和MFC框架作为微软原生技术栈,直接操作消息循环、窗口过程与GDI绘图,是掌握Windows GUI编程核心原理的关键。通过多线程编程,可以实现后台任务与用户界面的高效协同,避免界面卡顿,提升应用响应性。这些技术在现代桌面软件开发中,尤其在需要精细UI定制和高性能要求的场景下,依然具有重要价值。本文以POP3邮件监控系统为例,深入解析了如何使用VC++6.0实现一个功能完整的本地邮件客户端,其中涉及仿360安全卫士

weixin_33721427的博客 413

Remosaic 算法

在 4in1 传感器中,相邻的 4 个同色像素(如 4 个红色、绿色或蓝色像素)合并为 1 个“超级像素”,以提升低光环境下的感光能力。例如,在 RGGB 排列中,每个 2x2 的 Quad 单元需要恢复为 4 个独立的 R、Gr、Gb、B 像素1。:传感器通过硬件级 Remosaic 直接输出 4800 万像素的原始数据,每个像素独立记录颜色信息,解析力更高2。:传感器仅输出 1200 万像素数据,再通过软件算法插值放大到 4800 万像素,实际解析力无本质提升2。的原始数据转换为传统。

Damon_X的博客 3725

STM32 stack_size和heap_size大小设置的意义

在使用STM32编程时,一般情况下我们不会关注堆栈空间的大小,因为在STM32的启动文件中,已经帮我们预先设置好了堆栈空间的大小。如下图所示的启动代码中,Stack栈的大小为:0x400(1024Byte),Heap堆的大小为:0x200(512Byte)。 1、若工程中使用的局部变量较多,定义的数据长度较大时,若不调整栈的空间大小,则会导致程序出现栈溢出,程序运行结果与预期的不符或程序跑飞。这时我们就需要手动的调整栈的大小。 2、当工程中使用了malloc动态分配内存空间时,这时分配.......

zxm8513优快云博客 3万+

JavaWeb

HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。文本:html,字符串…超文本:图片,音乐,视频,定位,地图…默认端口:80HTTPS:安全的协议默认端口:443(1).Servlet就是sun公司开发动态web的一门技术。(2).Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:一.编写一个类,实现Servlet接口;二.把开发好的Java类部署到web服务器中。

2301_76556912的博客 1008

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# Base64编码解码原理、实战技巧与性能优化全解析

Base64编码是一种将二进制数据转换为ASCII文本字符的编码方案,其核心原理是将每3个字节(24位)的数据映射为4个可打印字符。这项技术的主要价值在于确保二进制数据能够安全地通过仅支持文本的协议(如HTTP、JSON、XML)进行传输和存储,避免了因控制字符引起的错误。在软件开发中,Base64广泛应用于网络数据传输、图片内嵌(Data URL)、配置文件存储以及作为加密算法输出结果的包装格式。本文聚焦于C#语言环境,深入探讨了Base64的编码原理、填充机制,并详细解析了.NET中System.Con

weixin_30252709的博客 386

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

.NET开发人员十大必备下载工具之NAnt

NAnt  NAnt 是一个基于 .NET 的生成工具,与当前版本的 Visual Studio .NET 不同,它使得为你的项目创建生成过程变得非常容易。当你拥有大量从事单个项目的开发人员时,你不能依赖于从单个用户的座位进行生成。你也不希望必须定期手动生成该项目。你更愿意创建每天晚上运行的自动生成过程。NAnt 使你可以生成解决方案、复制文件、运行 NUnit 测试、发送电子邮件

lengjing126的专栏 597

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

response的contentType的类型值Response.ContentType

MIME类型的含义 MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。    MIME的英文全称是"Multipurpose Internet Mail Extensions" 多功能Internet 邮件扩充服务,它是一种多用途网际邮件扩...

weixin_34268610的博客 127

Unity Native Toolkit:简化移动端原生功能调用的跨平台解决方案

在Unity移动端开发中,跨平台调用原生功能是常见的工程挑战。其核心原理在于通过C#脚本与Android Java、iOS Objective-C代码建立桥接,实现与系统API的交互。这项技术的价值在于将平台差异巨大的底层操作封装为统一的接口,从而让开发者能专注于游戏逻辑与用户体验,而非繁琐的平台适配。典型的应用场景包括调用系统相机拍照、访问相册、发送邮件、显示原生对话框以及管理本地通知等。Unity Native Toolkit作为一个开源解决方案,正是基于此技术栈,封装了诸如SaveImage、Take

weixin_30876945的博客 304
上一篇: C#去掉窗口最小化时左下角的窗口
Yannnnnger
博客等级 码龄13年 4粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值