EmailExportForm.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. using System.Text.RegularExpressions;
  5. using FastReport.Forms;
  6. using FastReport.Utils;
  7. namespace FastReport.Export.Email
  8. {
  9. /// <summary>
  10. /// Form for <see cref="EmailExport"/>.
  11. /// For internal use only.
  12. /// </summary>
  13. public partial class EmailExportForm : BaseDialogForm
  14. {
  15. private EmailExport export;
  16. private List<ExportBase> exports;
  17. // Create the ToolTip and associate with the Form container.
  18. private ToolTip ttCC = new ToolTip();
  19. private string ttCCText;
  20. private bool IsValidEmail(string strIn)
  21. {
  22. // Return true if strIn is in valid e-mail format.
  23. return Regex.IsMatch(strIn,
  24. @"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))" +
  25. @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$");
  26. }
  27. private void EmailExportForm_Shown(object sender, EventArgs e)
  28. {
  29. if (String.IsNullOrEmpty(tbAddressFrom.Text) || String.IsNullOrEmpty(tbHost.Text))
  30. {
  31. pageControl1.ActivePageIndex = 1;
  32. if (String.IsNullOrEmpty(tbAddressFrom.Text))
  33. tbAddressFrom.Focus();
  34. else
  35. tbHost.Focus();
  36. }
  37. else
  38. {
  39. cbxAddressTo.Focus();
  40. if (!export.Account.AllowUI)
  41. {
  42. pageControl1.Width -= pageControl1.SelectorWidth;
  43. Width -= pageControl1.SelectorWidth;
  44. pageControl1.SelectorWidth = 0;
  45. }
  46. }
  47. }
  48. private void cbxAttachment_SelectedIndexChanged(object sender, EventArgs e)
  49. {
  50. btnSettings.Enabled = cbxAttachment.SelectedIndex > 0;
  51. }
  52. private void btnSettings_Click(object sender, EventArgs e)
  53. {
  54. ExportBase export = exports[cbxAttachment.SelectedIndex];
  55. export.SetReport(this.export.Report);
  56. export.ShowDialog();
  57. }
  58. private void Init()
  59. {
  60. XmlItem xi = Config.Root.FindItem("EmailExport").FindItem("AccountSettings");
  61. // restore account info from the config
  62. if (String.IsNullOrEmpty(export.Account.Address))
  63. {
  64. export.Account.Address = xi.GetProp("Address");
  65. export.Account.Name = xi.GetProp("Name");
  66. export.Account.MessageTemplate = xi.GetProp("Template");
  67. export.Account.Host = xi.GetProp("Host");
  68. string port = xi.GetProp("Port");
  69. if (port != "")
  70. export.Account.Port = int.Parse(port);
  71. export.Account.UserName = Crypter.DecryptString(xi.GetProp("UserName"));
  72. export.Account.Password = Crypter.DecryptString(xi.GetProp("Password"));
  73. export.Account.EnableSSL = xi.GetProp("EnableSSL") == "1";
  74. }
  75. // fill account info
  76. tbAddressFrom.Text = export.Account.Address;
  77. tbName.Text = export.Account.Name;
  78. tbTemplate.Text = export.Account.MessageTemplate;
  79. tbHost.Text = export.Account.Host;
  80. udPort.Value = export.Account.Port;
  81. tbUserName.Text = export.Account.UserName;
  82. tbPassword.Text = export.Account.Password;
  83. cbEnableSSL.Checked = export.Account.EnableSSL;
  84. // fill email
  85. tbNameAttach.Text = export.Report.GetReportName;
  86. if (!String.IsNullOrEmpty(export.NameAttachmentFile))
  87. {
  88. tbNameAttach.Text = export.NameAttachmentFile;
  89. }
  90. string[] addresses = xi.GetProp("RecentAddresses").Split('\r');
  91. cbxAddressTo.Items.AddRange(addresses);
  92. if (!String.IsNullOrEmpty(export.Address))
  93. cbxAddressTo.Text = export.Address;
  94. else if (cbxAddressTo.Items.Count > 0)
  95. cbxAddressTo.SelectedIndex = 0;
  96. string[] cc = export.CC;
  97. if (cc != null)
  98. {
  99. for (int i = 0; i < cc.Length; i++)
  100. tbCC.Text += cc[i] + (i < cc.Length - 1 ? ";" : "");
  101. }
  102. string[] subjects = xi.GetProp("RecentSubjects").Split('\r');
  103. cbxSubject.Items.AddRange(subjects);
  104. if (!String.IsNullOrEmpty(export.Subject))
  105. cbxSubject.Text = export.Subject;
  106. else if (cbxSubject.Items.Count > 0)
  107. cbxSubject.SelectedIndex = 0;
  108. if (!String.IsNullOrEmpty(export.MessageBody))
  109. tbMessage.Text = export.MessageBody;
  110. else
  111. tbMessage.Text = tbTemplate.Text;
  112. // fill exports
  113. exports = new List<ExportBase>();
  114. List<ObjectInfo> list = new List<ObjectInfo>();
  115. RegisteredObjects.Exports.EnumItems(list);
  116. int exportIndex = 0;
  117. cbxAttachment.Items.Add(Res.Get("Preview,SaveNative"));
  118. exports.Add(null);
  119. foreach (ObjectInfo info in list)
  120. {
  121. if (info.Object != null)
  122. {
  123. cbxAttachment.Items.Add(Res.TryGet(info.Text));
  124. exports.Add(Activator.CreateInstance(info.Object) as ExportBase);
  125. if (export.Export != null && export.Export.GetType() == info.Object)
  126. exportIndex = exports.Count - 1;
  127. }
  128. }
  129. string recentExport = xi.GetProp("RecentExport");
  130. if (exportIndex != 0)
  131. cbxAttachment.SelectedIndex = exportIndex;
  132. else if (recentExport != "")
  133. cbxAttachment.SelectedIndex = int.Parse(recentExport);
  134. else
  135. cbxAttachment.SelectedIndex = 0;
  136. }
  137. private bool Done()
  138. {
  139. if (!IsValidEmail(tbAddressFrom.Text))
  140. {
  141. pageControl1.ActivePageIndex = 1;
  142. FRMessageBox.Error(Res.Get("Export,Email,AddressError"));
  143. tbAddressFrom.Focus();
  144. return false;
  145. }
  146. if (String.IsNullOrEmpty(tbHost.Text))
  147. {
  148. pageControl1.ActivePageIndex = 1;
  149. FRMessageBox.Error(Res.Get("Export,Email,HostError"));
  150. tbHost.Focus();
  151. return false;
  152. }
  153. if (!IsValidEmail(cbxAddressTo.Text))
  154. {
  155. pageControl1.ActivePageIndex = 0;
  156. FRMessageBox.Error(Res.Get("Export,Email,AddressError"));
  157. cbxAddressTo.Focus();
  158. return false;
  159. }
  160. XmlItem xi = Config.Root.FindItem("EmailExport").FindItem("AccountSettings");
  161. // get account info
  162. export.Account.Address = tbAddressFrom.Text;
  163. export.Account.Name = tbName.Text;
  164. export.Account.MessageTemplate = tbTemplate.Text;
  165. export.Account.Host = tbHost.Text;
  166. export.Account.Port = (int)udPort.Value;
  167. export.Account.UserName = tbUserName.Text;
  168. export.Account.Password = tbPassword.Text;
  169. export.Account.EnableSSL = cbEnableSSL.Checked;
  170. // save account info
  171. xi.SetProp("Address", export.Account.Address);
  172. xi.SetProp("Name", export.Account.Name);
  173. xi.SetProp("Template", export.Account.MessageTemplate);
  174. xi.SetProp("Host", export.Account.Host);
  175. xi.SetProp("Port", export.Account.Port.ToString());
  176. xi.SetProp("UserName", Crypter.EncryptString(export.Account.UserName));
  177. xi.SetProp("Password", Crypter.EncryptString(export.Account.Password));
  178. xi.SetProp("EnableSSL", export.Account.EnableSSL ? "1" : "0");
  179. // get email info
  180. export.Address = cbxAddressTo.Text.Trim();
  181. export.CC = tbCC.Text.Trim() == "" ? null : tbCC.Text.Trim().Split(';');
  182. export.Subject = cbxSubject.Text;
  183. export.MessageBody = tbMessage.Text;
  184. export.NameAttachmentFile = tbNameAttach.Text;
  185. export.Export = exports[cbxAttachment.SelectedIndex];
  186. // save email info
  187. string addresses = "\r" + cbxAddressTo.Text + "\r";
  188. foreach (object obj in cbxAddressTo.Items)
  189. {
  190. string address = obj.ToString();
  191. if (!addresses.Contains("\r" + address + "\r"))
  192. addresses += address + "\r";
  193. }
  194. addresses = addresses.Substring(1, addresses.Length - 2);
  195. xi.SetProp("RecentAddresses", addresses);
  196. string subjects = "\r" + cbxSubject.Text + "\r";
  197. foreach (object obj in cbxSubject.Items)
  198. {
  199. string subject = obj.ToString();
  200. if (!subjects.Contains("\r" + subject + "\r"))
  201. subjects += subject + "\r";
  202. }
  203. subjects = subjects.Substring(1, subjects.Length - 2);
  204. xi.SetProp("RecentSubjects", subjects);
  205. xi.SetProp("RecentExport", cbxAttachment.SelectedIndex.ToString());
  206. return true;
  207. }
  208. /// <summary>
  209. /// Hides attachment settings.
  210. /// For internal use only.
  211. /// </summary>
  212. public void HideAttachmentSettings()
  213. {
  214. lblAttachment.Visible = false;
  215. cbxAttachment.Visible = false;
  216. btnSettings.Visible = false;
  217. }
  218. /// <inheritdoc/>
  219. public override void Localize()
  220. {
  221. base.Localize();
  222. MyRes res = new MyRes("Export,Email");
  223. Text = res.Get("");
  224. pgEmail.Text = res.Get("Email");
  225. lblAddressTo.Text = res.Get("Address");
  226. lblCC.Text = res.Get("CC");
  227. ttCCText = res.Get("CCTooltip");
  228. lblSubject.Text = res.Get("Subject");
  229. lblMessage.Text = res.Get("Message");
  230. lblAttachment.Text = res.Get("Attachment");
  231. btnSettings.Text = res.Get("Settings");
  232. pgAccount.Text = res.Get("Account");
  233. lblAddressFrom.Text = res.Get("Address");
  234. lblName.Text = res.Get("Name");
  235. lblTemplate.Text = res.Get("Template");
  236. lblHost.Text = res.Get("Host");
  237. lblPort.Text = res.Get("Port");
  238. lblUserName.Text = res.Get("UserName");
  239. lblPassword.Text = res.Get("Password");
  240. cbEnableSSL.Text = res.Get("EnableSSL");
  241. lblNameAttcach.Text = res.Get("NameAttachmentFile");
  242. }
  243. private void EmailExportForm_FormClosing(object sender, FormClosingEventArgs e)
  244. {
  245. if (DialogResult == DialogResult.OK)
  246. if (!Done())
  247. e.Cancel = true;
  248. }
  249. /// <summary>
  250. /// Initializes a new instance of the <see cref="EmailExportForm"/> class.
  251. /// </summary>
  252. public EmailExportForm(EmailExport export)
  253. {
  254. this.export = export;
  255. InitializeComponent();
  256. Localize();
  257. Init();
  258. UIUtils.CheckRTL(this);
  259. UpdateDpiDependencies();
  260. }
  261. private void tbCC_MouseMove(object sender, MouseEventArgs e)
  262. {
  263. ttCC.SetToolTip(this.tbCC, ttCCText);
  264. }
  265. }
  266. }