1

我的目标是,用户想要发送一封新电子邮件,在填写(.TO.CC.Body)并单击发送按钮后,将显示Form发送选项所在的客户。一种选择是在用户创建电子邮件时发送电子邮件(普通send按钮功能)。是否知道如何以ItemSend自定义形式为按钮分配功能?

ThisAddIn.cs-> 打开自定义表单

public partial class ThisAddIn
{
    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Application.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend);

    }

Application_ItemSend

   private void Application_ItemSend(object Item, ref bool Cancel)
   {
        if (Item is Outlook.MailItem)
        {
            Form1 f = new Form1();
            f.Show();
        }

        Cancel = true;
    }

ChooseFormSend.cs-> 自定义发送按钮,

    public void btn_standard_Click(object sender, System.EventArgs e)
    {
         //mail.Send() -> send email which user whant to send        

    }

更新(所有要求一起,使这项工作)

ThisAddIn.cs

public partial class ThisAddIn
{
    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Application.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend);

    private bool ProcessEmail(Outlook.MailItem mailItem, MailSendType SendType)
    {
        switch (SendType)
        {
            case MailSendType.Normal:
                return false;

            case MailSendType.WithAdverts:
                //mailItem.BCC += "ad@server.xyz";
                mailItem.HTMLBody += @"<b>Some bold text at the end :)</b>";
                mailItem.HTMLBody += @"1233";
                return false; // send the mail

            case MailSendType.WithCoupon:
                mailItem.CC += "coupon@server.xyz";
                mailItem.HTMLBody += @"";
                return false; // send the mail

            // by default don't send the mail
            default:
                return true;
        }
    }

    private void Application_ItemSend(object Item, ref bool Cancel)
    {
        if (Item is MailItem) // ensures Item is a mail item
        {
            using (Form1 form_ChooseForm = new Form1())
            {
                DialogResult dr = form_ChooseForm.ShowDialog();
                if (dr == DialogResult.OK) // shows the form as a dialog
                {
                    Cancel = ProcessEmail((MailItem)Item, form_ChooseForm.SendType);
                    // MessageBox.Show("The OK button on the form was clicked.");                 
                }
                else
                {
                    // MessageBox.Show("Cancel process");
                    Cancel = true;
                }
            }   
        }
    }
}

ChooseFormSend.cs

using Microsoft.Office.Core;
using Microsoft.Office.Interop.Outlook;
using Microsoft.Office.Tools.Outlook;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Mail;
using System.Runtime.InteropServices;

namespace OutlookControll

{
    public enum MailSendType
    {
        NoSend,
        Normal,
        WithAdverts,
        WithCoupon
    }
    public partial class Form1 : Form
    {
    public Form1()
    {
        InitializeComponent();
    }

    public MailSendType SendType = MailSendType.NoSend;

    private void Btn_ShowSecondForm_Click(object sender, EventArgs e)
    {
        AddItemsForm f2 = new AddItemsForm();
        f2.ShowDialog();
        this.Hide();
    }

    private void Btn_cancel_Click(object sender, EventArgs e)
    {
        Button Btn_cancel_Click = new Button();
        Btn_cancel_Click.DialogResult = DialogResult.Cancel;
        this.Hide();
    }

    public void Btn_standard_Click(object sender, EventArgs e)
    {
        Button Btn_standard_Click = new Button();
        Btn_standard_Click.DialogResult = DialogResult.OK;
        Controls.Add(Btn_standard_Click);
        SendType = MailSendType.Normal;
        this.Hide();
    }

}

Btn_standard_Click.DialogResult = DialogResult.OK可以在Properties-> Behavior-> DialogResult-> OK、Cancel、Abort 等中设置。

4

1 回答 1

3

我可以考虑 3 种可能的情况:

  1. 按发送 > 弹出表单 > 选择表单上的选项 >修改电子邮件内容> 发送电子邮件
  2. 按发送 > 弹出表单 > 在表单上选择选项 >创建和发送新电子邮件(发送 1 封或多封新电子邮件)(丢弃旧电子邮件) > 发送电子邮件
  3. 按发送 > 弹出表单 > 在表单上选择选项 >创建和发送新电子邮件(发送 1 封或多封新电子邮件)(发送旧电子邮件) > 发送电子邮件

请注意,一旦修改电子邮件内容可能意味着修改所有内容。更改发件人更改主题等。因此,如果您想创建一封新电子邮件并丢弃旧的一个选项 1 仍然可以完全操纵原始电子邮件。

该对话框允许用户选择相关选项。

注意:放置表单按钮时,请确保DialogResult在属性检查器中的“行为”下设置选项。这允许在DialogResult:OK单击自动关闭并从对话框返回的按钮之一后返回。

public enum MailSendType
{
    NoSend,
    Normal,
    WithAdverts,
    WithCoupon
}

public partial class SendItemForm : Form
{
    public SendItemForm()
    {
        InitializeComponent();
    }

    public MailSendType SendType = MailSendType.NoSend;

    private void button1_Click(object sender, EventArgs e)
    {
        SendType = MailSendType.Normal;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        SendType = MailSendType.WithAdverts;
    }
}

选项一:只修改邮件内容

请注意显示f.ShowDialog()而不是f.Show()停止当前线程继续发送操作并等待用户选择表单上的按钮。对话框中的 f.SendType设置并用于指示用户选择了哪个选项。使用ProcessEmail电子邮件可以被操纵并return false导致被操纵的电子邮件在false传播到父函数时被发送Cancel = false(不要取消发送)。

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        // create a global event listener for sending items
        Application.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend);
    }

    // this function is used to modify the mail object before sending it (More variables could be added to extend the functionality)
    private bool ProcessEmail(Outlook.MailItem mailItem, MailSendType sendType)
    {
        switch (sendType)
        {
            case MailSendType.Normal:
                return false; // send the mail as is don't mainpulate the mailItem variable

            case MailSendType.WithAdverts:
                mailItem.BCC += "ad@server.xyz";
                mailItem.HTMLBody += @"<b>Some bold text at the end :)</b>";
                mailItem.HTMLBody += @"</img src='https://server.xyz/ad1.png'>";
                return false; // send the mail

            case MailSendType.WithCoupon:
                mailItem.CC += "coupon@server.xyz";
                mailItem.HTMLBody += @"</img src='https://server.xyz/coupon1.png'>";
                return false; // send the mail

            // by default don't send the mail
            default:
                return true;
        }
    }

    private void Application_ItemSend(object Item, ref bool Cancel)
    {
        if (Item is Outlook.MailItem) // ensures Item is a mail item
        {
            using (SendItemForm f = new SendItemForm()) // creates the form
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK) // shows the form as a dialog
                    //if statement ensures the process will only proceed if an OK is returned 
                    //(The form has a cancel button or it could crash or anything else)
                    Cancel = ProcessEmail((Outlook.MailItem)Item, f.SendType); // process the email with the SendType
        }
    }

选项 2/3 发送新电子邮件

此方法重点介绍如何在 Outlook 中发送新电子邮件。注意:测试发送电子邮件,MailItem.Send()它不会Application_ItemSend再次调用

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Application.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend);
    }

    private void SendNewEmail(string to, string greeting, MailSendType sendType)
    {
        Outlook.MailItem newMailItem = Application.CreateItem(Outlook.OlItemType.olMailItem);
        newMailItem.To = to;
        newMailItem.SendUsingAccount = Application.Session.Accounts[1]; // Optional can leave blank to send from default account (Array starts at 1)
        newMailItem.Subject = "New Mail";
        newMailItem.Body = $"{greeting} {newMailItem.To}\nExample Body from {sendType.ToString()}";

        // Part of Original answer but it's not relevant. However I will leave it in the event that it is of use to someone
        //((Outlook.ItemEvents_10_Event)newMailItem).Send += (ref bool Cancel) => { /*do nothing*/ };

        newMailItem.Send(); // send the mail
    }

    private void Application_ItemSend(object Item, ref bool Cancel)
    {
        if (Item is Outlook.MailItem) // ensures Item is a mail item
        {
            using (SendItemForm f = new SendItemForm()) // creates the form
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK) // shows the form as a dialog
                {
                    //if statement ensures the process will only proceed if an OK is returned 
                    //(The form has a cancel button or it could crash or anything else)

                    // send 3 mails
                    SendNewEmail("admin1@server.xyz", "Hi", f.SendType);
                    SendNewEmail("admin2@server.xyz", "Hello", MailSendType.Normal);
                    SendNewEmail("admin3@server.xyz", "Yo", f.SendType);

                    // either send or don't send the orginal one
                    // by default Cancel is set to false (So by default the message will send)

                    // send the 3 mails and send the original one typed up by the user
                    //Cancel = false;

                    // send the 3 mails and do not send the original one currently typed up by the user
                   // Cancel = true;
                }

        }
    }

在这两个示例和f.ShowDialog()设置之间,您应该能够找到您寻求的解决方案。您还可以通过修改原始电子邮件并发送额外的电子邮件来混合搭配。

于 2020-09-01T13:20:37.210 回答