咋取邮件信息?

package test;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.sun.mail.pop3.POP3Folder;

/**
 * 有一封邮件就需要建立一个ReciveMail对象
 */
public class ReciveOneMail {
    private MimeMessage mimeMessage = null;

    private String dateformat = "yyyy-MM-dd HH:mm"; // 默认的日前显示格式

    public ReciveOneMail(MimeMessage mimeMessage) {
        this.mimeMessage = mimeMessage;
    }

    public void setMimeMessage(MimeMessage mimeMessage) {
        this.mimeMessage = mimeMessage;
    }

    /**
     * 获得发件人的地址和姓名
     */
    public String getFrom() throws Exception {
        InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
        String from = address[0].getAddress();
        if (from == null)
            from = "";
        String personal = address[0].getPersonal(); // 发件人的姓名
        if (personal == null)
            personal = "";
        String fromaddr = personal + "<" + from + ">"; // 发件人的地址
        return fromaddr;
    }

    /**
     * 获得邮件主题
     */
    public String getSubject() throws MessagingException {
        String subject = "";
        try {
            subject = mimeMessage.getSubject();
            String header = ((MimeMessage) mimeMessage).getHeader("SUBJECT")[0];
            if ((header.toLowerCase().indexOf("=?")) > 0) {
                subject = new String((subject.getBytes("ISO-8859-1")), "gb2312");
            }

            if (subject == null)
                subject = "";
        } catch (Exception exce) {
        }
        return subject;
    }

    /**
     * 获得邮件发送日期
     */
    public String getSentDate() throws Exception {
        Date sentdate = mimeMessage.getSentDate();
        SimpleDateFormat format = new SimpleDateFormat(dateformat);
        return format.format(sentdate);
    }

    /**
     * 获得此邮件的Message-ID
     */
    public String getMessageId() throws MessagingException {
        return mimeMessage.getMessageID();
    }

    /**
     * 【设置日期显示格式】
     */
    public void setDateFormat(String format) throws Exception {
        this.dateformat = format;
    }

    /**
     * PraseMimeMessage类测试
     */
    public static void main(String args[]) throws Exception {
        Properties props = System.getProperties();
        props.put("mail.smtp.host", "mail.socix.com");
        props.put("mail.smtp.auth", "true");

        URLName url = new URLName("pop3", "mail.socix.com", 110, null,
                "xcf@socix.com", "111111");
        System.out.println("log on!");
        Session session = Session.getInstance(System.getProperties(), null);
        Store store = session.getStore(url);
        POP3Folder inbox = null;
        try {
            store.connect();
            System.out.println("store connected!");
            inbox = (POP3Folder) store.getFolder("INBOX");
            inbox.open(Folder.READ_ONLY);
            Message[] message = inbox.getMessages();
            for (int i = 0; i < message.length; i++) {
                System.out.println("Message " + i + " UID: "
                        + inbox.getUID(message[i]));
            }
            System.out.println("fetched!");
            for (int i = 0; i < message.length; i++) {
                ReciveOneMail pmm = new ReciveOneMail((MimeMessage) message[i]);
                System.out.println("第" + (i + 1) + "封");
                System.out.println("======================");
                System.out.println("Message " + (i + 1) + " 主题: "
                        + pmm.getSubject()); // 获取主题
                System.out.println("Message " + (i + 1) + " 日期: "
                        + pmm.getSentDate()); // 获取邮件发送日期
                System.out.println("Message " + (i + 1) + " 发件人: "
                        + pmm.getFrom()); // 获取发件人和地址
                System.out.println("Message " + (i + 1) + " UID: "
                        + inbox.getUID(message[i]));
            }
        } finally {
            try {
                inbox.close(false);
            } catch (Exception e) {
            }
            try {
                store.close();
            } catch (Exception e) {
            }
        }
    }
}

<think>我们之前已经实现了一个基于VBA和Outlook的批量发送邮件的程序,现在需要根据不同的部门使用不同的邮件模板。思路:1.在Excel表中,我们假设已经有一个部门列(比如D列),每个员工属于某个部门。2.我们需要为每个部门准备一个邮件模板,这些模板可以存放在Outlook的草稿箱中,并且我们按照部门来命名这些草稿邮件的主题,以便识别。例如:主题为“部门1_模板”的邮件用于部门1的员工。3.修改之前的代码:不再是只第一封草稿邮件,而是根据当前员工的部门去草稿箱中查找对应的邮件模板。4.如果草稿箱中有多个模板,我们需要建立部门名称和模板邮件之间的映射关系。5.为了提高效率,我们可以预先将每个部门的模板邮件内容(HTMLBody)读出来,存储在一个字典中(部门名称作为键,HTML内容作为值),这样在循环发送邮件时可以直接使用。6.另一种方法:也可以为每个部门在草稿箱中准备一个文件夹,将对应模板放入该文件夹中,这样我们可以根据部门文件夹定位模板。但是考虑到用户当前的需求,我们采用根据邮件主题匹配的方式。步骤:-遍历草稿箱的所有邮件,将主题符合特定格式(例如以部门名称开头,或者包含部门名称)的邮件内容预先加载到内存(字典)。-我们假设模板邮件的主题为“邮件模板_部门名称”,例如“邮件模板_技术部”,“邮件模板_市场部”等。7.如果找不到某个部门的模板,可以使用一个默认模板(比如主题为“邮件模板_默认”)。具体实现:代码调整如下:1.首先,在开始循环员工数据之前,我们预先加载所有模板邮件到字典中。2.然后,在循环每个员工时,根据员工所属部门,从字典中出对应的邮件模板HTML内容。3.如果该部门没有找到模板,则使用默认模板。下面我们将修改代码来实现上述逻辑。注意:为了简化,我们假设模板邮件的主题格式为:以“邮件模板_”开头,后面紧跟部门名称,且部门名称和Excel中的部门名称完全匹配。例如:草稿箱中有主题为“邮件模板_技术部”的邮件,而Excel中部门列有“技术部”这个部门。代码步骤:Step1:获草稿箱中的所有邮件,遍历,提主题以“邮件模板_”开头的邮件Step2:解析出部门名称(将主题中“邮件模板_”之后的部分作为部门名称)Step3:存储到字典中:key为部门名称,value为该邮件的HTMLBodyStep4:查找是否有主题为“邮件模板_默认”的邮件,作为默认模板Step5:循环员工数据时:DimdeptAsStringdept=.Cells(i,列号).Value'假设部门在第4列'检查字典中是否存在该部门对应的模板Ifdict.Exists(dept)ThenhtmlBody=dict(dept)ElsehtmlBody=defaultHtmlBody'如果没有,使用默认模板EndIfStep6:然后替换htmlBody中的占位符注意:需要添加错误处理,防止没有默认模板的情况。代码修改细节:我们将重新组织代码,包括:1.初始化Outlook和Excel对象2.获草稿箱3.加载所有模板邮件到字典4.循环处理员工数据5.发送邮件以下为修改后的完整代码:</think> ## VBA实现不同部门员工邮件模板定制方法 下面是通过VBA实现为不同部门定制邮件模板的完整解决方案,基于Outlook.application早期绑定方法: ```vba Sub SendDeptSpecificEmails() ' 声明对象变量 Dim olApp As Outlook.Application Dim olNS As Outlook.Namespace Dim DraftsFolder As Outlook.MAPIFolder Dim xlApp As Excel.Application Dim xlSheet As Excel.Worksheet Dim i As Long, LastRow As Long Dim dept As String, empNo As String, empName As String ' 设置错误处理 On Error GoTo ErrorHandler ' 初始化Outlook Set olApp = New Outlook.Application Set olNS = olApp.GetNamespace("MAPI") ' 连接到指定邮箱的草稿箱 Set DraftsFolder = GetDraftsFolder("welfare@cht.com.tw") ' 初始化Excel对象 Set xlApp = Excel.Application Set xlSheet = xlApp.ActiveSheet ' 获员工数据 With xlSheet LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row ' 预加载模板邮件 Dim TemplateDict As Object Set TemplateDict = PreloadTemplates(DraftsFolder) For i = 2 To LastRow ' 假设第1行是标题 ' 读员工信息 empNo = .Cells(i, 1).Value empName = .Cells(i, 2).Value dept = .Cells(i, 3).Value ' 为不同部门选择模板 Dim templateName As String templateName = DeptToTemplateName(dept) ' 自定义映射函数 ' 获对应模板 Dim oTemplate As Outlook.MailItem If TemplateDict.Exists(templateName) Then Set oTemplate = TemplateDict(templateName) Else ' 使用默认模板 Set oTemplate = TemplateDict("默认模板") End If ' 创建并发送邮件 SendCustomEmail oTemplate, empNo, empName, dept Next i End With CleanUp: ' 释放对象资源 Set TemplateDict = Nothing Set oTemplate = Nothing Set DraftsFolder = Nothing Set olNS = Nothing Set olApp = Nothing MsgBox "成功发送" & LastRow - 1 & "封定制邮件", vbInformation Exit Sub ErrorHandler: MsgBox "错误 " & Err.Number & ": " & Err.Description, vbCritical Resume CleanUp End Sub ' 获草稿箱函数 Private Function GetDraftsFolder(emailAccount As String) As MAPIFolder On Error Resume Next Set GetDraftsFolder = olNS.Folders(emailAccount).Folders("草稿") If GetDraftsFolder Is Nothing Then Set GetDraftsFolder = olNS.Folders(emailAccount).Folders("Drafts") End If If GetDraftsFolder Is Nothing Then Err.Raise vbObjectError + 1, , "找不到指定邮箱的草稿箱" End If End Function ' 预加载模板到字典 Private Function PreloadTemplates(DraftsFolder As MAPIFolder) As Object Dim dict As Object Set dict = CreateObject("Scripting.Dictionary") Dim item As Object For Each item In DraftsFolder.Items ' 识别模板邮件(主题包含"[模板]") If InStr(1, item.Subject, "[模板]", vbTextCompare) > 0 Then Dim templateKey As String ' 提模板标识(如"[模板]技术部" -> "技术部") templateKey = Mid(item.Subject, InStr(item.Subject, "]") + 1) If templateKey = "" Then templateKey = "默认模板" dict.Add templateKey, item.Copy End If Next ' 确保至少有一个模板 If dict.Count = 0 Then Err.Raise vbObjectError + 2, , "草稿箱中未找到模板邮件" End If Set PreloadTemplates = dict End Function ' 部门到模板名称映射函数 Private Function DeptToTemplateName(dept As String) As String Select Case dept Case "技术部": DeptToTemplateName = "技术部" Case "市场部": DeptToTemplateName = "市场部" Case "人力资源": DeptToTemplateName = "人事模板" Case Else: DeptToTemplateName = "默认模板" End Select End Function ' 邮件发送核心函数 Private Sub SendCustomEmail(oTemplate As MailItem, empNo As String, empName As String, dept As String) Dim newMail As Outlook.MailItem Set newMail = oTemplate.Copy ' 定制内容替换 Dim htmlBody As String htmlBody = oTemplate.HTMLBody ' 通用占位符替换 htmlBody = Replace(htmlBody, "{员工编号}", empNo) htmlBody = Replace(htmlBody, "{姓名}", empName) htmlBody = Replace(htmlBody, "{单位}", dept) ' 部门特定内容定制 Select Case dept Case "技术部" htmlBody = Replace(htmlBody, "{部门通知}", "技术升级公告...") Case "市场部" htmlBody = Replace(htmlBody, "{部门通知}", "市场活动详情...") ' 更多部门定制... End Select newMail.HTMLBody = htmlBody newMail.Send End Sub ``` ### 关键实现说明 1. **模板邮件设计规则**: - 草稿箱中的模板邮件主题需包含`[模板]`标识符 - 格式:`[模板]部门名称`(如`[模板]技术部`) - 默认模板使用`[模板]默认模板`[^1] 2. **部门映射机制**: ```vba Function DeptToTemplateName(dept As String) ' 自定义部门到模板的映射规则 Select Case dept Case "技术部": Return "技术部" Case "人力资源": Return "人事模板" ... End Select End Function ``` 3. **模板预加载优化**: - 启动时一次性加载所有模板到内存字典 - 键值对结构:`dict.Add "部门名称", 邮件副本` - 减少每次发送对Outlook的访问次数 4. **HTML内容定制层级**: - 基础占位符:`{员工编号}`, `{姓名}`, `{单位}` - 部门级占位符:`{部门通知}` - 附件自动继承原模板的附件[^1] ### 使用前准备 **邮件模板设计示例**: ```html <!-- [模板]技术部 --> <html> <body> <h2>技术部公告:{部门通知}</h2> <p>尊敬的{姓名}(工号{员工编号}):</p> <img src="cid:tech_banner"> </body> </html> <!-- [模板]默认模板 --> <html> <body> <p>{姓名}您好:</p> <p>来自{单位}的通用通知...</p> </body> </html> ``` **Excel数据结构**: | 员工编号 | 姓名 | 单位 | |----------|------|------------| | A001 | 张三 | 技术部 | | B002 | 李四 | 人力资源 | ### 注意事项 1. **权限配置**: - Outlook信任中心启用VBA访问 - Excel宏安全设置为启用所有宏[^2] 2. **性能优化**: - 批量发送超过100封时添加延迟 ```vba If i Mod 50 = 0 Then Application.Wait Now + TimeValue("00:00:30") ``` 3. **错误处理增强**: - 添加日志记录失败邮件 - 使用`On Error Resume Next`跳过单次错误 这种方法通过部门级内容分级实现了高效的邮件定制发送,同时保持HTML格式和附件的完整性[^1]。实际部署时建议先进行小批量测试。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值