在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
我在另一篇文章《深入Lumisoft.NET实现邮件发送功能的方法详解》有大致对这个Lumisoft.NET组件的使用进行了介绍,当然Lumisoft.NET组件除了提供邮件发送功能外,还提供了邮件接收等功能的处理(包括基于POP3协议和IMAP协议),而.NET则除了提供SMTP协议功能外,则没有提供POP3协议处理的相关类库,因此收取邮件这需要自己进行封装(需要也可以参考codeproject.com上的相关文章)。 1、.NET的邮件发送功能实现 如添加发送人地址,抄送地址,以及暗送地址(多个地址用逗号分开)代码如下。 复制代码 代码如下: string toEmails = mailInfo.ToEmail; string bcc = ""; mailInfo.RecipientBCC.ForEach(obj => bcc += string.Format("{0},", obj)); bcc = bcc.Trim(','); string cc = ""; MailMessage mail = new MailMessage(settingInfo.MailFrom, toEmails); .NET的附件和嵌入式资源由对象Attachment和LinkedResource进行管理,他们的利用代码如下所示: 复制代码 代码如下: //附件 foreach (string fileName in mailInfo.Attachments) { mail.Attachments.Add(new Attachment(fileName)); } //嵌入资源 发送邮件的其他部分代码如下所示 复制代码 代码如下: mail.IsBodyHtml = mailInfo.IsBodyHtml; mail.BodyEncoding = Encoding.UTF8; mail.Subject = mailInfo.Subject; mail.SubjectEncoding = Encoding.UTF8; //发送账户设置信息 bool success = false; 上面利用.net的SmtpClient发送邮件操作的完整代码如下: 复制代码 代码如下: /// <summary> /// 发送外部邮件(系统配置,系统邮件) /// </summary> /// <param name="mailInfo">发送邮件信息</param> /// <returns></returns> public CommonResult Send(MailInfo mailInfo) { CommonResult result = new CommonResult(); try { AppConfig config = new AppConfig(); string MailDomain = config.AppConfigGet("MailDomain"); string MailUsername = config.AppConfigGet("MailUsername"); string MailPassword = config.AppConfigGet("MailPassword"); string MailPort = config.AppConfigGet("MailPort"); string MailFrom = config.AppConfigGet("MailFrom"); int port = 25; int.TryParse(MailPort, out port); SmtpSettingInfo settingInfo = new SmtpSettingInfo(MailDomain, port, result.Success = PrivateSendEmail(mailInfo, settingInfo); return result; /// <summary> string cc = ""; MailMessage mail = new MailMessage(settingInfo.MailFrom, toEmails); //附件 //嵌入资源 //发送账户设置信息 bool success = false; string message = string.Format("发送给【{0}】的邮件“{1}”,{2},时间:{3}", return success; 2、基于Lumisoft.NET组件的邮件发送功能实现 基于Lumisoft.NET组件的邮件发送,也是一种很常用的,因为这个开源组件非常强大,经常可以在一些程序中被使用。 这个发送邮件的功能主要是利用SMTP_Client类来实现的,如下代码所示。注意其中的Authenticate函数已经被舍弃,可以使用Auth方法进行验证。但是函数参数有所不同,根据验证对象,使用不同的验证方式,一般选择AUTH_SASL_Client_Plain对象即可。 复制代码 代码如下: public bool Send() { bool sended = false; using (SMTP_Client client = new SMTP_Client()) { client.Connect(smtpServer, smtpPort, smtpUseSsl); client.EhloHelo(smtpServer); var authhh = new AUTH_SASL_Client_Plain(username, password); client.Auth(authhh); //client.Authenticate(username, password); //string text = client.GreetingText; client.MailFrom(from, -1); foreach (string address in toList.Keys) { client.RcptTo(address); } //采用Mail_Message类型的Stream sended = true; client.Disconnect(); 构造用于SMTP发送的数据,可以使用Mail_Message 对象,也可以使用Mime对象,虽然读都可以实现发送功能,不过Mime对象是舍弃的对象了。 构造Mail_Message对象后,创建用于发送的格式要转换为Stream对象。转换为发送的Stream操作如下所示。 复制代码 代码如下: using (MemoryStream stream = new MemoryStream()) { m.ToStream(stream, new MIME_Encoding_EncodedWord(MIME_EncodedWordEncoding.Q, Encoding.UTF8), Encoding.UTF8); stream.Position = 0; client.SendMessage(stream); sended = true; 构造Mail_Message格式的邮件操作如下所示。 复制代码 代码如下: private Mail_Message Create_PlainText_Html_Attachment_Image(Dictionary<string,string> tomails, Dictionary<string, string> ccmails, string mailFrom, string mailFromDisplay, string subject, string body, Dictionary<string, string> attachments, string notifyEmail = "", string plaintTextTips = "") { Mail_Message msg = new Mail_Message(); msg.MimeVersion = "1.0"; msg.MessageID = MIME_Utils.CreateMessageID(); msg.Date = DateTime.Now; msg.Subject = subject; msg.From = new Mail_t_MailboxList(); msg.From.Add(new Mail_t_Mailbox(mailFromDisplay, mailFrom)); msg.To = new Mail_t_AddressList(); foreach (string address in tomails.Keys) { string displayName = tomails[address]; msg.To.Add(new Mail_t_Mailbox(displayName, address)); } msg.Cc = new Mail_t_AddressList(); foreach (string address in ccmails.Keys) { string displayName = ccmails[address]; msg.Cc.Add(new Mail_t_Mailbox(displayName, address)); } //设置回执通知 #region MyRegion //--- multipart/mixed ----------------------------------- //--- multipart/alternative ----------------------------- //--- text/plain ---------------------------------------- //普通文本邮件内容,如果对方的收件客户端不支持HTML,这是必需的 text_plain.SetText(MIME_TransferEncodings.QuotedPrintable, Encoding.UTF8, plainTextBody); //--- text/html ----------------------------------------- //--- application/octet-stream ------------------------- #endregion return msg; 而构造Mime格式的操作如下所示。 复制代码 代码如下: private Mime Create_Html_Attachment_Image(string mailTo, string mailFrom, string mailFromDisplay, string subject, string body, List<string> attachments, Dictionary<string, string> embedImages, string notifyEmail = "", string plaintTextTips = "", string replyEmail = "") { Mime m = new Mime(); MimeEntity mainEntity = m.MainEntity; mainEntity.From = new AddressList(); //设置回执通知 //设置统一回复地址 MimeEntity textEntity = mainEntity.ChildEntities.Add(); //附件 //嵌入图片 //string displayName = Path.GetFileNameWithoutExtension(fileName); attachmentEntity.DataFromFile(imageFile); return m; 综合以上两者的发送功能,都可以实现邮件的发送操作,如下界面是发送邮件界面。 3、LumiSoft.NET存储eml邮件文件以及发送eml文件操作 除了上面的发送普通邮件,Lumisoft还支持吧邮件序列号存储到文件(.eml邮件文件)里面,然后也可以通过把文件读取到流里面,进行发送,对于某种场合,可以把邮件存储到eml文件是一个很好的操作。 存储EML文件的相关操作如下所示。 复制代码 代码如下: private void btnCreateFile_Click(object sender, EventArgs e) { string attachFile = Path.Combine(Application.StartupPath, "Attachment/Hotel2.png"); List<string> attachments = new List<string>(); attachments.Add(attachFile); string subject = "测试邮件"; string body = "<html>这是一份测试邮件,来自<font color=red><b>LumiSoft.Net</b></font></html>"; string bodyEmbedy = "<html>这是一份测试邮件<img src=\"cid:test.jpg\">,来自<font color=red><b>LumiSoft.Net</b></font></html>"; Dictionary<string, string> embedList = new Dictionary<string, string>(); embedList.Add("test.jpg", "C:\\test.jpg"); //存储为Eml文件 Mime m = Create_Html_Attachment_Image(to, from, from, subject, bodyEmbedy, attachments, embedList); MessageUtil.ShowTips("OK"); 发送EML文件操作如下所示。 复制代码 代码如下: private void btnSendFile_Click(object sender, EventArgs e) { using (SMTP_Client client = new SMTP_Client()) { int smtpPort = smtpUseSsl ? WellKnownPorts.SMTP_SSL : WellKnownPorts.SMTP; client.Connect(smtpServer, smtpPort, smtpUseSsl); string path = Path.Combine(Application.StartupPath, "Eml"); MemoryStream stream = new MemoryStream(); |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论