加载中…
个人资料
徐铮律师
徐铮律师 新浪个人认证
  • 博客等级:
  • 博客积分:0
  • 博客访问:21,678
  • 关注人气:2
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

[转载]Word邮件合并批量发送带附件的邮件

(2012-11-28 14:53:22)
标签:

转载

你好。非常有帮助。但是有一点,发出去的邮件正文的格式是丢失的。任何字体等信息都没有了。是否有办法可以保证发出的邮件正文的格式不丢失呢?

应张老师的需求,修改制作了一个可以批量发送带附件的电子邮件VBA。

目的:给N多人发送电子邮件,而不是抄送模式,并带有对方的称谓。

实现:

用到Word的邮件合并功能,以及调用Outlook发送邮件。不过VBA我不太懂,只能用现有的改,有点繁琐。

 

步骤:

1. Word建立一个表,第一列为表头,下面为每个人的记录,从第四列开始为附件列,需要加几个附件,就添加几个列,可以留空,像第五列一样:

Name

Title

Email

Attachment

Xiao Ma

PhD.

someone@some.com

e:test.txt

Copper

Dr.

someone@some.com

e:test2.txt

Marry

Miss.

someone@some.com

e:test.txt

Lisa

Miss

someone@some.com

 

2. 保存该word文件。

3. 新建一个Word文档,我用的是word2010版本,选择邮件选项卡。

4. 选择收件人,使用现有列表,打开之前编辑的word文件
5. 使用插入合并域功能,编辑邮件正文:
    如:

    Dear <<Title>><<Name>>

    I’m mxio. Good 2 c u at 9t.

    Good Luck!

    mxio
    2012.11.13
6. 点击预览结果,更新域
7. 启动编辑宏功能,键盘按ALT+F11
8. 工具引用添加 Microsoft Outlook 14.0 Object Library
9. 新建模块添加如下代码:

Sub eMailMergeWithAttachments()

    Dim docSource As Document, docMaillist As Document

    Dim rngDatarange As Range

    Dim i As Long, j As Long

    Dim lRecordCount As Long

    Dim bStarted As Boolean

    Dim oOutlookApp As Outlook.Application

    Dim oItem As Outlook.MailItem

    Dim oAccount As Outlook.Account

    Dim sMySubject As String, sMessage As String, sTitle As String

    '将当前文档设置为源文档(主文档)

    Set docSource = ActiveDocument
   
    '检查Outlook是不是打开了。如果未打开的话,就打开新的Outlook

    On Error Resume Next

    Set oOutlookApp = GetObject(, "Outlook.Application")

    If Err <> 0 Then

        Set oOutlookApp = CreateObject("Outlook.Application")

        bStarted = True

    End If

    '打开保存有客人的邮件地址和需要发送的附件的路径的word文档。

    With Dialogs(wdDialogFileOpen)

        .Show

    End With

    '将该文档设置为客户邮件(附件)列表文档

    Set docMaillist = ActiveDocument

    '设置发送邮件的账户(账户必须已经在Outlook中设置好了)

    '注意:如果你的Outlook版本低于2007,使用设置发送邮件的账户可能会导致错误,

    '建议将下面的Set oAccount = oOutlookApp.Session.Accounts.Item("someone@examplemail.com")语句删除

    Set oAccount = oOutlookApp.Session.Accounts.Item("someone@examplemail.com")

    '显示一个输入框,询问并让用户输入邮件主题

    sMessage = "请为要发送的邮件输入邮件主题。"

    sTitle = "输入邮件主题"

    sMySubject = InputBox(sMessage, sTitle)

    '循环查找源文档中所有的节(每一节为一封邮件内容),以及循环查找邮件列表文档中所有的客户信息,

    '以便用于插入到生成的邮件中

    '获取需要发送的邮件数,并将当前节置为第一条记录
   
    lRecordCount = docMaillist.Tables(1).Rows.Count
   
    docSource.MailMerge.DataSource.ActiveRecord = wdFirstRecord

    '第一列为表头,需跳过
   
    For j = 2 To lRecordCount
  
        Set oItem = oOutlookApp.CreateItem(olMailItem)

        With oItem

            '注意:如果你的Outlook版本低于2007,使用设置发送邮件的账户可能会导致错误,

            '建议将下面的.SendUsingAccount = oAccount语句删除

            .SendUsingAccount = oAccount

            .Subject = sMySubject
           
            '正文内容,节号1的文字

            .Body = docSource.Sections(1).Range.Text

            Set rngDatarange = docMaillist.Tables(1).Cell(j, 3).Range

            rngDatarange.End = rngDatarange.End - 1

            .To = rngDatarange

            For i = 4 To docMaillist.Tables(1).Columns.Count

                Set rngDatarange = docMaillist.Tables(1).Cell(j, i).Range

                rngDatarange.End = rngDatarange.End - 1

                .Attachments.Add Trim(rngDatarange.Text), olByValue, 1

            Next i

            .Send

        End With

        Set oItem = Nothing
   
            'Word邮件文档下一节
           
        docSource.MailMerge.DataSource.ActiveRecord = wdNextRecord

    Next j

    docMaillist.Close wdDoNotSaveChanges

    '如果Outlook是由该宏打开的,则关闭Outlook

    If bStarted Then

        oOutlookApp.Quit

    End If

    MsgBox "共发送了 " & lRecordCount - 1 & " 封邮件。"

    '清空Outlook实例

    Set oOutlookApp = Nothing

End Sub

10. 执行该代码。


mxio
2012.11.13

0

  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有