Я создал элемент электронной почты после подготовки электронного письма и открытия окна инспектора. Я получаю визуальный элемент электронной почты после нажатия кнопки Отправить письмо будет перемещено в папку «Исходящие» из Outlook. и окно инспектора закрывается, а приложение Outlook закрывает
, поэтому после этого невозможно создать пространство имен. Мне нужно было освободить ComObjects и поставить все в ноль, если метод send и recive активирован сразу после закрытия окна инспектора, и я получаю ошибки при создании пространства имен, поэтому я подумал о создании таймера для задержки этого.
фоновый работник предназначен для сбора двух сигналов: один, когда дается команда отправки, и один, когда задержка достигнута, тогда будет активирован метод SendReceive ()
У меня есть только одна проблема, и это еслиокно инспектора закрывается вместо отправки, фоновый рабочий не отменяется
, если я смотрю в переменную inspectorWindow, есть закрытие, но это метод. Как создать обработчик событий для закрытия окна инспектора
namespace TrilobesQRCodeReader
{
public partial class TrilobesQRCodeReader : Form
{
/// <summary>
/// Email is Send Syncronize
/// </summary>
bool EmailSendCommand;
/// <summary>
/// Boolean is high when delay is ended
/// </summary>
bool SyncDelay;
/// <summary>
///
/// </summary>
private Timer SyncDelayTimer;
private void Email_Click(object sender, EventArgs e)
{
Outlook.Application outlookApp = new Outlook.Application();
Outlook.MailItem oMailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
Outlook.Recipients oRecips = (Outlook.Recipients)oMailItem.Recipients;
try
{
this.Cursor = Cursors.WaitCursor;
UpdateCursor();
List<string> lstAllRecipients = new List<string>();
//Below is hardcoded - can be replaced with db data
lstAllRecipients.Add(SqliteDatabase[5]);
//Create Table for htmlbody
StringBuilder EmailText = new StringBuilder();
//add the body of the email
EmailText.Append("<table border= 1>");
EmailText.Append("<tr>");
EmailText.Append("<th>Tag Name</th>");
EmailText.Append("<th>Component / Description</th>");
EmailText.Append("<th>Function</th>");
EmailText.Append("<th>Brand</th>");
EmailText.Append("<th>Type</th>");
EmailText.Append("<th>M-Connection</th>");
EmailText.Append("<th>E-Connection</th>");
EmailText.Append("<th>Range</th>");
EmailText.Append("<th>Remark</th>");
EmailText.Append("<th>Ordering Code</th>");
EmailText.Append("<th>Panel</th>");
EmailText.Append("<th>DI</th>");
EmailText.Append("<th>DO</th>");
EmailText.Append("<th>AI</th>");
EmailText.Append("<th>AO</th>");
EmailText.Append("<th>Ethernet</th>");
EmailText.Append("<th>ASI</th>");
EmailText.Append("</tr>");
EmailText.Append("<tr>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[4]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[5]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[6]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[7]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[8]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[9]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[10]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[11]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[12]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[13]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[14]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[15]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[16]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[17]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[18]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[19]) + "</td>");
EmailText.Append("<td>" + Picker(Items, SQLHeaders[20]) + "</td>");
EmailText.Append("</tr>");
EmailText.Append("</table>");
// Force the "HTMLBody" property to be populated with any email signature, so that we can append it to our content.
oMailItem.HTMLBody = EmailText.ToString();
//Add attachments in the E-mail
foreach (PictureBox pictureBox in MailPictureBoxes)
{
if ((Color)pictureBox.Tag == Color.Red)
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
if (!FileInUse(pictureBox.ImageLocation))
{
//Add an attachment.
String sDisplayName = pictureBox.Name;
int iPosition = (int)oMailItem.Body.Length + 1;
int iAttachType = (int)Outlook.OlAttachmentType.olByValue;
//now attached the file
Outlook.Attachment oAttach = oMailItem.Attachments.Add
(pictureBox.ImageLocation, iAttachType, iPosition, sDisplayName);
}
}
}
// Recipient
foreach (String recipient in lstAllRecipients)
{
Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add(recipient);
oRecip.Resolve();
}
//Add Subject
oMailItem.Subject = string.Format("116145 Citrofrut ATF Mexico InstrumentationList Item {0}", Picker(Items, SQLHeaders[4]));
//All Preparation has been done now open Email Item
outlookApp.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(Item_Send);
//inspectorWindow = oMailItem.GetInspector;
Outlook.Inspector inspectorWindow = oMailItem.GetInspector;
//Make the inspectorWindow the active window
inspectorWindow.Activate();
//Go back to normal Cursor
this.Cursor = Cursors.Arrow;
UpdateCursor();
//Open Inspector Window
inspectorWindow.Display(true);
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString(), "Send Email", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
finally
{
if (oRecips != null) Marshal.ReleaseComObject(oRecips);
oRecips = null;
if (oMailItem != null) Marshal.ReleaseComObject(oMailItem);
oMailItem = null;
if (outlookApp != null) Marshal.ReleaseComObject(outlookApp);
outlookApp = null;
}
if (backgroundWorker1.IsBusy != true)
{
// Start the asynchronous operation.
backgroundWorker1.RunWorkerAsync();
}
SyncDelayTimer = new Timer();
SyncDelayTimer.Interval = 200;
SyncDelayTimer.Tick += SyncDelayTimer_Tick;
SyncDelayTimer.Enabled = true;
}
private void Item_Send(object Item, ref bool Cancel)
{
EmailSendCommand = true;
}
private void SyncDelayTimer_Tick(object sender, EventArgs e)
{
SyncDelay = true;
}
private void SendReceive()
{
Outlook.Application outlookApp = new Outlook.Application();
Outlook.NameSpace nameSpace = outlookApp.GetNamespace("MAPI");
try
{
Outlook.SyncObject mysync = outlookApp.Session.SyncObjects["All Accounts"];
mysync.Session.SendAndReceive(true);
//mysync.Progress += new Outlook.SyncObjectEvents_ProgressEventHandler(Sync_Progress);
//mysync.SyncStart += new Outlook.SyncObjectEvents_SyncStartEventHandler(Sync_Start);
//mysync.SyncEnd += new Outlook.SyncObjectEvents_SyncEndEventHandler(Sync_End);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "SendRecieve", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
finally
{
if (nameSpace != null) Marshal.ReleaseComObject(nameSpace);
nameSpace = null;
if (outlookApp != null) Marshal.ReleaseComObject(outlookApp);
outlookApp = null;
}
backgroundWorker1.CancelAsync();
EmailSendCommand = false;
SyncDelay = false;
}
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
System.Threading.Thread.Sleep(500);
if (EmailSendCommand && SyncDelay)
{
SendReceive();
}
}
}
}