You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
5.9 KiB
184 lines
5.9 KiB
using Apewer;
|
|
using Apewer.Internals;
|
|
using Apewer.Source;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace Apewer.Network
|
|
{
|
|
|
|
/// <summary>邮件。</summary>
|
|
public sealed class MailMessage : IToJson
|
|
{
|
|
|
|
private MailAddress _sender = null;
|
|
|
|
private List<MailAddress> _receiver = new List<MailAddress>();
|
|
|
|
private List<MailAddress> _carboncopy = new List<MailAddress>();
|
|
|
|
private List<MailAddress> _blindcarboncopy = new List<MailAddress>();
|
|
|
|
private Dictionary<string, byte[]> _attachment = new Dictionary<string, byte[]>();
|
|
|
|
private string _title = Constant.EmptyString;
|
|
|
|
private string _content = Constant.EmptyString;
|
|
|
|
private Encoding _encoding = Encoding.UTF8;
|
|
|
|
private bool _html = false;
|
|
|
|
private MailPriority _priority = MailPriority.Normal;
|
|
|
|
/// <summary>构造函数。</summary>
|
|
public MailMessage() { }
|
|
|
|
/// <summary>编码,默认为 UTF-8。</summary>
|
|
public Encoding Encoding { get { return _encoding; } set { _encoding = value ?? Encoding.UTF8; } }
|
|
|
|
/// <summary>附件。</summary>
|
|
public Dictionary<string, byte[]> Attachment { get { return _attachment; } }
|
|
|
|
/// <summary>发件人。</summary>
|
|
public MailAddress Sender { get { return _sender; } set { _sender = value ?? new MailAddress(); } }
|
|
|
|
/// <summary>收件人。</summary>
|
|
public List<MailAddress> Receiver { get { return _receiver; } }
|
|
|
|
/// <summary>抄送。</summary>
|
|
public List<MailAddress> CarbonCopy { get { return _carboncopy; } }
|
|
|
|
/// <summary>密送。</summary>
|
|
public List<MailAddress> BlindCarbonCopy { get { return _blindcarboncopy; } }
|
|
|
|
/// <summary>主题/标题。</summary>
|
|
public string Title { get { return _title; } set { _title = TextUtility.Trim(value, true); } }
|
|
|
|
/// <summary>正文/内容。</summary>
|
|
public string Content { get { return _content; } set { _content = value ?? Constant.EmptyString; } }
|
|
|
|
/// <summary>使用 HTML 格式,默认为 FALSE 值。</summary>
|
|
public bool Html { get { return _html; } set { _html = value; } }
|
|
|
|
/// <summary>优先级。</summary>
|
|
public MailPriority Priority { get { return _priority; } set { _priority = value; } }
|
|
|
|
/// <summary>获取 JSON 文本。</summary>
|
|
public override string ToString()
|
|
{
|
|
return ToJson().ToString();
|
|
}
|
|
|
|
/// <summary>获取 JSON 对象。</summary>
|
|
public Json ToJson()
|
|
{
|
|
var json = Json.NewObject();
|
|
|
|
json["Priority"] = Priority.ToString();
|
|
json["Encoding"] = Encoding.ToString();
|
|
json["Title"] = Title;
|
|
json["Content"] = Content;
|
|
json["Html"] = Html.ToString();
|
|
|
|
json.SetProperty("Sender", Json.From(Sender));
|
|
|
|
var receiver = Json.NewArray();
|
|
foreach (var account in _receiver) receiver.AddItem(Json.From(account));
|
|
json.SetProperty("Receiver", receiver);
|
|
|
|
var cc = Json.NewArray();
|
|
foreach (var account in _carboncopy) receiver.AddItem(Json.From(account));
|
|
json.SetProperty("CarbonCopy", cc);
|
|
|
|
var bcc = Json.NewArray();
|
|
foreach (var account in _blindcarboncopy) receiver.AddItem(Json.From(account));
|
|
json.SetProperty("BlindCarbonCopy", bcc);
|
|
|
|
var attachment = Json.NewArray();
|
|
foreach (var kvp in _attachment)
|
|
{
|
|
var item = Json.NewObject();
|
|
item["Name"] = TextUtility.Trim(kvp.Key);
|
|
item["Base64"] = BytesUtility.ToBase64(kvp.Value);
|
|
attachment.AddItem(item);
|
|
}
|
|
json.SetProperty("Attachment", attachment);
|
|
|
|
return json;
|
|
}
|
|
|
|
internal System.Net.Mail.MailMessage ToInstance()
|
|
{
|
|
var mm = new System.Net.Mail.MailMessage();
|
|
|
|
#if !NET20
|
|
mm.HeadersEncoding = _encoding;
|
|
#endif
|
|
mm.SubjectEncoding = _encoding;
|
|
mm.BodyEncoding = _encoding;
|
|
|
|
|
|
if (_sender != null)
|
|
{
|
|
var ma = _sender.ToInstance(_encoding);
|
|
if (ma != null) mm.From = ma;
|
|
}
|
|
|
|
foreach (var account in _receiver)
|
|
{
|
|
if (account == null) continue;
|
|
var ma = account.ToInstance(_encoding);
|
|
if (ma != null) mm.To.Add(ma);
|
|
}
|
|
|
|
foreach (var account in _carboncopy)
|
|
{
|
|
if (account == null) continue;
|
|
var ma = account.ToInstance(_encoding);
|
|
if (ma != null) mm.CC.Add(ma);
|
|
}
|
|
|
|
foreach (var account in _blindcarboncopy)
|
|
{
|
|
if (account == null) continue;
|
|
var ma = account.ToInstance(_encoding);
|
|
if (ma != null) mm.Bcc.Add(ma);
|
|
}
|
|
|
|
foreach (var attachment in _attachment)
|
|
{
|
|
var a = GetAttachment(attachment.Key, attachment.Value, _encoding);
|
|
mm.Attachments.Add(a);
|
|
}
|
|
|
|
mm.Subject = _title;
|
|
mm.Body = _content;
|
|
mm.IsBodyHtml = _html;
|
|
|
|
return mm;
|
|
}
|
|
|
|
private static System.Net.Mail.Attachment GetAttachment(string name, byte[] bytes, Encoding encoding)
|
|
{
|
|
if (TextUtility.IsBlank(name)) return null;
|
|
|
|
var data = bytes;
|
|
var memory = new MemoryStream();
|
|
if (data != null)
|
|
{
|
|
if (data.Length > 0) memory.Write((byte[])data);
|
|
}
|
|
memory.ResetPosition();
|
|
|
|
var attachment = new System.Net.Mail.Attachment(memory, TextUtility.Trim(name));
|
|
attachment.NameEncoding = encoding;
|
|
|
|
return attachment;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|