通过Outlook上的适当帐户发送VBA生成的个性化电子邮件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Outlook上的适当帐户发送VBA生成的个性化电子邮件相关的知识,希望对你有一定的参考价值。

我在学校教书。发送作业时,我会创建一个个性化的文件,希望每个学生都可以处理。

我使用VBA和Excel生成个性化文件。

我将Outlook置于“脱机工作”模式,因此在将Outlook重新联机之前,我可以确保电子邮件具有正确的附件并且是正确的。然后,我通常会点击“发送/接收所有文件夹”按钮,以便它们在我观看时立即消失。

这很好用。我为Outlook配置了我的工作电子邮件。

但是,由于冠状病毒,也是因为夏天,我正在家里工作。

在家里的Outlook上(我正在Windows 10计算机上使用已安装的应用程序),我配置了2个帐户。

帐户1是来自个人域的个人电子邮件。

帐户2是我的工作电子邮件帐户。

我想要的是像在工作中一样生成电子邮件,并让它们进入我的工作帐户中。然后,我将从那里发送它们。

但是,无论我做什么,他们都会进入我的个人帐户。我不希望学生从无法识别的发件人那里收到电子邮件。我也不希望他们用他们的问题回复这些电子邮件。

这是我运行的用于创建电子邮件的代码:

Sub makemail()
    Dim strLocation As String
    Dim OutApp As Object
    Dim OutMail As Object
    Dim OutAccount As Object

    Range("a1").Activate

    eaddy = ActiveCell.Offset(0, 4).Value 'student's e-mail address in a worksheet
    IndivFile = ActiveCell.Offset(0, 8).Value 'this is an identifier for the student's individual file
    LastName = ActiveCell.Offset(0, 1).Value ' student's last name



    Do Until ActiveCell.Value = ""
        Set OutApp = CreateObject("Outlook.Application")

        Set OutMail = OutApp.CreateItem(0)
        Set OutAccount = OutApp.Session.Accounts.Item(1)

        On Error Resume Next
        With OutMail
            .To = eaddy
            .CC = ""
            .BCC = ""
            .Subject = LastName & " (text that describes the assignment)"
            .Body = "(body of message)"
            strLocation = "(location of the individual attachments" & IndivFile & ".xlsx"
            .Attachments.Add (strLocation)
            .Send
        End With
        On Error GoTo 0

        Set OutMail = Nothing
        Set OutApp = Nothing
        Set OutAccount = Nothing

        With Application
            .ScreenUpdating = True
            .EnableEvents = True
        End With

        ActiveCell.Offset(1, 0).Activate
        eaddy = ActiveCell.Offset(0, 4).Value
        IndivFile = ActiveCell.Offset(0, 8).Value
        LastName = ActiveCell.Offset(0, 1).Value
    Loop

End Sub

无论我做什么,它只会将生成的电子邮件转储到Outlook中的#1帐户的存储桶中:我的个人帐户。

我已尝试替换

.Send

with

.SendUsingAccount = OutApp.Session.Accounts.Item(2)

将任何内容放入括号(包括0或1)将意味着我在两个存储桶中都看不到输出。 (不知道电子邮件是否生成过。它们可能位于我未曾浏览过的某个目录中。)

所以,我刚刚生成了所有电子邮件,它们显示在我的个人帐户的存储桶中。

我全部选中了它们,然后将其放入工作帐户的存储桶中。

他们不会发送。我单击“发送/接收”,它们将无处可去。

但是,如果我分别打开每个电子邮件并单击电子邮件中的“发送”按钮?他们去。我在发送的文件夹中看到它们。

我对Outlook不太了解。只是到目前为止,它一直为此起作用。我想知道这是否是电子邮件中某种不匹配的证书问题?但是,如果真是这样,为什么他们不批量购买,但是如果在打开电子邮件的情况下单独发送的话,它们会散去?

((我刚刚测试过。如果电子邮件被标记为已读或未读,则没有区别。)

我的确将工作电子邮件设置为Outlook中的主要电子邮件(文件>帐户设置>将一个帐户指定为主要帐户。

所以,这是我的基本问题:

  1. 是否有办法将其放入第二个帐户的支出(工作)?请记住,
.SendUsingAccount = OutApp.Session.Accounts.Item(2)

不起作用。完全没有。

  1. 如果我做不到,是否有办法更改我的电子邮件帐户,所以工作是#1?除了按特定顺序删除并重新安装以外?我DID进入并把工作电子邮件设为我的主要电子邮件。

  2. 有人知道为什么他们不发送一个桶的原因(因为它们是从另一个桶中拖放的,但是如果您单独打开它们并发送,它们会发送?

答案

似乎您只需要在Outlook中设置/更改默认帐户。

enter image description here

请参阅How To Set An Email Account As The Default Account In Outlook?以获取更多信息。

[此外,您可以使用Outlook项目的SendUsingAccount属性,该属性设置一个Account对象,该对象表示要发送MailItem的帐户。 SendUsingAccount属性可用于指定调用MailItem方法时应用于发送Send的帐户。

         Sub SendEmailFromAccount(ByVal application As Outlook.Application, _ 
            ByVal subject As String, ByVal body As String, ByVal recipients As String, ByVal smtpAddress As String) 

            ' Create a new MailItem and set the To, Subject and Body properties. 
            Dim newMail As Outlook.MailItem = DirectCast(application.CreateItem(Outlook.OlItemType.olMailItem), Outlook.MailItem) 
            newMail.To = recipients 
            newMail.Subject = subject 
            newMail.Body = body 

            ' Retrieve the account that has the specific SMTP address. 
            Dim account As Outlook.Account = GetAccountForEmailAddress(application, smtpAddress) 
            ' Use this account to send the email. 
            newMail.SendUsingAccount = account 
            newMail.Send() 
        End Sub 

        Function GetAccountForEmailAddress(ByVal application As Outlook.Application, ByVal smtpAddress As String) As Outlook.Account 

            ' Loop over the Accounts collection of the current Outlook session. 
            Dim accounts As Outlook.Accounts = application.Session.Accounts 
            Dim account As Outlook.Account 
            For Each account In accounts 
                ' When the email address matches, return the account. 
                If account.SmtpAddress = smtpAddress Then 
                    Return account 
                End If 
            Next             
        End Function 

以上是关于通过Outlook上的适当帐户发送VBA生成的个性化电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何通过Excel VBA和Outlook实现自动发送邮件功能

MS Outlook 干扰 Access vba 程序

如何更改通过 Excel VBA 代码通过 Outlook 发送的电子邮件的字体格式?

使用 Excel VBA 以编程方式禁止 Outlook 电子邮件发送警告消息

通过 Excel VBA 通过 Outlook 发送电子邮件 - 将字符串转换为货币格式或百分比

使用 VBA 禁用 Outlook 安全设置