ca1408,漾怎么组词,赤峰林西天气预报
我在另一篇文章《深入lumisoft.net实现邮件发送功能的方法详解》有大致对这个lumisoft.net组件的使用进行了介绍,当然lumisoft.net组件除了提供邮件发送功能外,还提供了邮件接收等功能的处理(包括基于pop3协议和imap协议),而.net则除了提供smtp协议功能外,则没有提供pop3协议处理的相关类库,因此收取邮件这需要自己进行封装(需要也可以参考codeproject.com上的相关文章)。
1、.net的邮件发送功能实现
.net本身封装了一个smtpclient类以及相关的邮件对象类,这样利用这些类库,也可以方便实现邮件的发送功能的了。
如添加发送人地址,抄送地址,以及暗送地址(多个地址用逗号分开)代码如下。
string cc = "";
mailinfo.recipientcc.foreach(obj => cc += string.format("{0},", obj));
cc = cc.trim(',');
mailmessage mail = new mailmessage(settinginfo.mailfrom, toemails);
if (!string.isnullorempty(bcc))
{
mail.bcc.add(bcc);
}
if (!string.isnullorempty(cc))
{
mail.cc.add(cc);
}
//嵌入资源
alternateview view = alternateview.createalternateviewfromstring(mailinfo.body, encoding.utf8, mediatypenames.text.html);
foreach (linkedattachementinfo link in mailinfo.embedobjects)
{
linkedresource resource = new linkedresource(link.stream, link.mimetype);
resource.contentid = link.contentid;
view.linkedresources.add(resource);
}
mail.alternateviews.add(view);
//发送账户设置信息
smtpclient client = new smtpclient();
client.host = settinginfo.smtpserver;
client.port = settinginfo.smptport;
client.usedefaultcredentials = false;
client.deliverymethod = smtpdeliverymethod.network;
client.credentials = new networkcredential(settinginfo.smtpuser, settinginfo.smtppass);
bool success = false;
try
{
client.send(mail);
success = true;
}
catch (exception ex)
{
logtexthelper.error(ex);
//throw;
}
smtpsettinginfo settinginfo = new smtpsettinginfo(maildomain, port,
mailusername, mailpassword, mailfrom);
result.success = privatesendemail(mailinfo, settinginfo);
}
catch (exception ex)
{
result.errormessage = ex.message;
throw;
}
return result;
}
/// <summary>
/// 通用发送邮件操作
/// </summary>
private static bool privatesendemail(mailinfo mailinfo, smtpsettinginfo settinginfo)
{
string toemails = mailinfo.toemail;
string bcc = "";
mailinfo.recipientbcc.foreach(obj => bcc += string.format("{0},", obj));
bcc = bcc.trim(',');
string cc = "";
mailinfo.recipientcc.foreach(obj => cc += string.format("{0},", obj));
cc = cc.trim(',');
mailmessage mail = new mailmessage(settinginfo.mailfrom, toemails);
if (!string.isnullorempty(bcc))
{
mail.bcc.add(bcc);
}
if (!string.isnullorempty(cc))
{
mail.cc.add(cc);
}
//附件
foreach (string filename in mailinfo.attachments)
{
mail.attachments.add(new attachment(filename));
}
//嵌入资源
alternateview view = alternateview.createalternateviewfromstring(mailinfo.body, encoding.utf8, mediatypenames.text.html);
foreach (linkedattachementinfo link in mailinfo.embedobjects)
{
linkedresource resource = new linkedresource(link.stream, link.mimetype);
resource.contentid = link.contentid;
view.linkedresources.add(resource);
}
mail.alternateviews.add(view);
mail.isbodyhtml = mailinfo.isbodyhtml;
mail.bodyencoding = encoding.utf8;
mail.subject = mailinfo.subject;
mail.subjectencoding = encoding.utf8;
//发送账户设置信息
smtpclient client = new smtpclient();
client.host = settinginfo.smtpserver;
client.port = settinginfo.smptport;
client.usedefaultcredentials = false;
client.deliverymethod = smtpdeliverymethod.network;
client.credentials = new networkcredential(settinginfo.smtpuser, settinginfo.smtppass);
bool success = false;
try
{
client.send(mail);
success = true;
}
catch (exception ex)
{
logtexthelper.error(ex);
//throw;
}
string message = string.format("发送给【{0}】的邮件“{1}”,{2},时间:{3}",
mailinfo.toemail[0], mailinfo.subject, success ? "发送成功" : "发送失败", datetime.now);
logtexthelper.info(message);
return success;
}
这个发送邮件的功能主要是利用smtp_client类来实现的,如下代码所示。注意其中的authenticate函数已经被舍弃,可以使用auth方法进行验证。但是函数参数有所不同,根据验证对象,使用不同的验证方式,一般选择auth_sasl_client_plain对象即可。
//采用mail_message类型的stream
mail_message m = create_plaintext_html_attachment_image(tolist, cclist, from, fromdisplay, subject, body, attachments);
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;
}
if (m != null)
{
m.dispose();
}
client.disconnect();
}
return sended;
}
构造mail_message对象后,创建用于发送的格式要转换为stream对象。转换为发送的stream操作如下所示。
sended = true;
}
//设置回执通知
if (!string.isnullorempty(notifyemail) && validateutil.isemail(notifyemail))
{
msg.dispositionnotificationto.add(new mail_t_mailbox(notifyemail, notifyemail));
}
#region myregion
//--- multipart/mixed -----------------------------------
mime_h_contenttype contenttype_multipartmixed = new mime_h_contenttype(mime_mediatypes.multipart.mixed);
contenttype_multipartmixed.param_boundary = guid.newguid().tostring().replace('-', '.');
mime_b_multipartmixed multipartmixed = new mime_b_multipartmixed(contenttype_multipartmixed);
msg.body = multipartmixed;
//--- multipart/alternative -----------------------------
mime_entity entity_multipartalternative = new mime_entity();
mime_h_contenttype contenttype_multipartalternative = new mime_h_contenttype(mime_mediatypes.multipart.alternative);
contenttype_multipartalternative.param_boundary = guid.newguid().tostring().replace('-', '.');
mime_b_multipartalternative multipartalternative = new mime_b_multipartalternative(contenttype_multipartalternative);
entity_multipartalternative.body = multipartalternative;
multipartmixed.bodyparts.add(entity_multipartalternative);
//--- text/plain ----------------------------------------
mime_entity entity_text_plain = new mime_entity();
mime_b_text text_plain = new mime_b_text(mime_mediatypes.text.plain);
entity_text_plain.body = text_plain;
//普通文本邮件内容,如果对方的收件客户端不支持html,这是必需的
string plaintextbody = "如果你邮件客户端不支持html格式,或者你切换到“普通文本”视图,将看到此内容";
if (!string.isnullorempty(plainttexttips))
{
plaintextbody = plainttexttips;
}
text_plain.settext(mime_transferencodings.quotedprintable, encoding.utf8, plaintextbody);
multipartalternative.bodyparts.add(entity_text_plain);
//--- text/html -----------------------------------------
string htmltext = body;//"<html>这是一份测试邮件,<img src=\"cid:test.jpg\">来自<font color=red><b>lumisoft.net</b></font></html>";
mime_entity entity_text_html = new mime_entity();
mime_b_text text_html = new mime_b_text(mime_mediatypes.text.html);
entity_text_html.body = text_html;
text_html.settext(mime_transferencodings.quotedprintable, encoding.utf8, htmltext);
multipartalternative.bodyparts.add(entity_text_html);
//--- application/octet-stream -------------------------
webclient client = new webclient();
foreach (string attach in attachments.keys)
{
try
{
byte[] bytes = client.downloaddata(attach);
using (memorystream stream = new memorystream(bytes))
{
multipartmixed.bodyparts.add(mail_message.createattachment(stream, attachments[attach]));
}
}
catch (exception ex)
{
logtexthelper.error(ex);
}
}
#endregion
return msg;
}
mainentity.from = new addresslist();
mainentity.from.add(new mailboxaddress(mailfromdisplay, mailfrom));
mainentity.to = new addresslist();
mainentity.to.add(new mailboxaddress(mailto, mailto));
mainentity.subject = subject;
mainentity.contenttype = mediatype_enum.multipart_mixed;
//设置回执通知
if (!string.isnullorempty(notifyemail) && validateutil.isemail(notifyemail))
{
mainentity.dsn = notifyemail;
}
//设置统一回复地址
if (!string.isnullorempty(replyemail) && validateutil.isemail(replyemail))
{
mainentity.replyto = new addresslist();
mainentity.replyto.add(new mailboxaddress(replyemail, replyemail));
}
mimeentity textentity = mainentity.childentities.add();
textentity.contenttype = mediatype_enum.text_html;
textentity.contenttransferencoding = contenttransferencoding_enum.quotedprintable;
textentity.datatext = body;
//附件
foreach (string attach in attachments)
{
mimeentity attachmententity = mainentity.childentities.add();
attachmententity.contenttype = mediatype_enum.application_octet_stream;
attachmententity.contentdisposition = contentdisposition_enum.attachment;
attachmententity.contenttransferencoding = contenttransferencoding_enum.base64;
fileinfo file = new fileinfo(attach);
attachmententity.contentdisposition_filename = file.name;
attachmententity.datafromfile(attach);
}
//嵌入图片
foreach (string key in embedimages.keys)
{
mimeentity attachmententity = mainentity.childentities.add();
attachmententity.contenttype = mediatype_enum.application_octet_stream;
attachmententity.contentdisposition = contentdisposition_enum.inline;
attachmententity.contenttransferencoding = contenttransferencoding_enum.base64;
string imagefile = embedimages[key];
fileinfo file = new fileinfo(imagefile);
attachmententity.contentdisposition_filename = file.name;
//string displayname = path.getfilenamewithoutextension(filename);
attachmententity.contentid = key;//bytestools.bytestohex(encoding.default.getbytes(filename));
attachmententity.datafromfile(imagefile);
}
return m;
}
3、lumisoft.net存储eml邮件文件以及发送eml文件操作
除了上面的发送普通邮件,lumisoft还支持吧邮件序列号存储到文件(.eml邮件文件)里面,然后也可以通过把文件读取到流里面,进行发送,对于某种场合,可以把邮件存储到eml文件是一个很好的操作。
存储eml文件的相关操作如下所示。
//存储为eml文件
string path = path.combine(application.startuppath, "eml");
directoryutil.assertdirexist(path);
string emlfile = string.format("{0}/{1}.eml", path, datetime.now.tofiletime());
mime m = create_html_attachment_image(to, from, from, subject, bodyembedy, attachments, embedlist);
m.tofile(emlfile);
messageutil.showtips("ok");
}
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);
client.rcptto(to);
string path = path.combine(application.startuppath, "eml");
string emlfile = directory.getfiles(path)[0];
var msg = mail_message.parsefromfile(emlfile);
memorystream stream = new memorystream();
msg.tostream(stream, new mime_encoding_encodedword(mime_encodedwordencoding.q, encoding.utf8), encoding.utf8);
stream.position = 0;
client.sendmessage(stream);
client.disconnect();
}
messageutil.showtips("ok");
}
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Net Core Web Api项目与在NginX下发布的方法
asp.net core3.1 引用的元包dll版本兼容性问题解决方案
IdentityServer4实现.Net Core API接口权限认证(快速入门)
ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径的实现
网友评论