【问题标题】:Convert java code to coldfusion code (CFIMAP)将 java 代码转换为冷融合代码 (CFIMAP)
【发布时间】:2018-07-24 00:35:25
【问题描述】:

我正在尝试建立与 office365 邮箱的连接。此函数基于一个 java 示例(请参阅https://stackoverflow.com/a/28689722/2482184)。我快完成了,但我不知道如何转换原始 java 示例中的以下代码行:

Message[] messages = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false));

下面的完整功能:

<cfscript>
    mailSettings = {};
    mailSettings.server = "outlook.office365.com";
    mailSettings.port = "993";
    mailSettings.username = "xxxx";
    mailSettings.password = "xxxx";
    mailSettings.action = "";
    mailSettings.folder = "INBOX";
    mailSettings.timeout = 5000;

    properties = createObject("Java","java.util.Properties");
    jsession = createObject("Java","javax.mail.Session");
    store = createObject("Java","javax.mail.Store");
    message = CreateObject("Java", "javax.mail.Message");

    properties.init();
    properties.put("mail.store.protocol","imap");
    properties.put("mail.from", mailSettings.username);
    properties.put("mail.imap.port", mailSettings.port);
    properties.put("mail.imap.connectiontimeout",mailSettings.timeout);
    properties.put("mail.imap.timeout",mailSettings.timeout);
    jsession = jsession.getInstance(properties);

    store = jsession.getStore("imaps");
    store.connect(mailSettings.server, mailSettings.username, mailSettings.password);

    inbox  = store.getFolder("#mailSettings.folder#");
    inbox.open( inbox.READ_ONLY );

    /**********
    NEED HELP TO CONVERT THIS LINE BELOW TO COLDFUSION SYNTAX
    ---------
    Message[] messages = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false));
    ---------
    END NEED HELP
    **********/

    inbox.close(true);

</cfscript>

我知道有一个 cfimap 标签。我正在尝试寻找一种更快的方法来下载电子邮件。

【问题讨论】:

  • 随意发布最终代码作为答案,这样更容易发现。为了速度,您尝试过 FetchProfile 吗?从我读过的一点点来看,可能会提高获取标题的速度stackoverflow.com/a/20238586/8895292
  • @Ageax 我一直在使用 Fetch 方法,但我没有正确实施此方法。在我下面的回答中,您可以看到我尝试过的内容以及 imo 应该做什么。但是该功能并没有提高速度。
  • 做错了什么,错误还是别的什么?
  • @Ageax 没有错误消息。从我读到 local.java.folder.fetch(local.java.messages, local.java.profile);方法应该下载所有消息。然后输出主题 (local.java.folder.getMessage(local.settings.x).getSubject()) 不需要再次往返 office365 服务器,而是从缓存中输出数据。然而,主题不是从缓存中检索到的,而是从 office365 服务器下载的(使用网络嗅探器确认)。
  • FetchProfile 是可选的,因此并不总是受支持。不要认为您需要“folder.getMessage(local.settings.x)”。如果我理解正确, fetch(...) 已经填充了消息数组,所以只需在每个元素上调用 getSubject() 即可。

标签: coldfusion


【解决方案1】:

在我编写的实际函数下方,部分基于 Ageax 答案。它比 CFIMAP 快得多,但仍然没有我想要的那么快。 fetch 方法的实现可以真正加快速度。我将 fetch 命令的实现放在 /* */ 之间,因为它不起作用。我想我做错了什么。如果有人知道如何正确实施此方法,我将不胜感激。

<cfscript>
function fecthImap()
{
    var local = {};

    local.settings = {};
    local.settings.server = "outlook.office365.com";
    local.settings.port = "993";
    local.settings.username = "xxxx";
    local.settings.password = "xxxx";
    local.settings.action = "";
    local.settings.folder = "INBOX";
    local.settings.timeout = 5000;
    local.settings.tick = GetTickCount();
    local.settings.x = 1;

    local.java = {};
    local.java.properties = createObject("Java","java.util.Properties");
    local.java.properties.init();
    local.java.properties.put("mail.store.protocol","imap");
    local.java.properties.put("mail.from", local.settings.username);
    local.java.properties.put("mail.imap.port", local.settings.port);
    local.java.properties.put("mail.imap.connectiontimeout",local.settings.timeout);
    local.java.properties.put("mail.imap.timeout",local.settings.timeout);

    local.java.session = createObject("Java","javax.mail.Session");
    local.java.session = local.java.session.getInstance(local.java.properties);

    local.java.store = createObject("Java","javax.mail.Store");
    local.java.store = local.java.session.getStore("imaps");
    local.java.store.connect(local.settings.server, local.settings.username, local.settings.password);

    local.java.folder  = local.java.store.getFolder("#local.settings.folder#");
    local.java.folder.open( local.java.folder.READ_ONLY );

    local.java.mailFlags = createObject("java", "javax.mail.Flags$Flag");
    local.java.mailFlagsSeen = createObject("java", "javax.mail.Flags").init(local.java.mailFlags.SEEN);
    local.java.mailFlagTerm = createObject("java", "javax.mail.search.FlagTerm").init(local.java.mailFlagsSeen, false);

    local.java.messages = local.java.folder.search(local.java.mailFlagTerm);

    /*This part could realy speed thinks up, but it does not work as expected*/
    /****************************
    local.java.profile = createObject("Java","javax.mail.FetchProfile");
    local.java.profileItem = createObject("Java","javax.mail.FetchProfile$Item");
    local.java.profile.add(local.java.profileItem.ENVELOPE);
    local.java.folder.fetch(local.java.messages, local.java.profile);
    ****************************/

    for(local.settings.x=1;local.settings.x<=arraylen(local.java.messages);local.settings.x=local.settings.x+1)
    {
        local.java.message =  local.java.messages[local.settings.x];
        WriteOutput(local.settings.x & ':' & GetTickCount()-local.settings.tick  & ':' & local.java.message.getSubject() & '<br>');
    }

    local.java.folder.close(true);
}
fecthImap();
</cfscript>

【讨论】:

    【解决方案2】:

    创建一个 MailFetch.java 文件。

    imports ....
    .....
    
    public class MailFetch {
    
    public function fetchFolder(String server, String port, String username, String password, String foldername){
    
    
        Session session = Session.getDefaultInstance(new Properties( ));
        Store store = session.getStore("imaps");
        store.connect(server, port, username, password);
        Folder inbox = store.getFolder(foldername);
        inbox.open( Folder.READ_ONLY );
    
        ....
    
        code goes here 
    
        .....
    
        return messages; // Message[]
    
    }
    

    }

    使用 javac 编译文件

    • 启动命令提示符。

    • 导航到保存类文件的文件夹:

      C:>cd \mywork

    • 设置路径以包含 JDK 的 bin。例如:

      C:\mywork> 路径 c:\Program Files\Java\jdk1.8.0_121\bin;%path%

    • 编译你的类:

      C:\mywork> javac *.java

    • 创建一个清单文件和你的 jar 文件:

      C:\mywork> jar cvfm Craps.jar manifest.txt *.class

    将 jar 复制到 \ColdFusion\cfusion\wwwroot\WEB-INF\lib 或 \ColdFusion\cfusion\lib

    重启Coldfusion服务

    访问使用

    mailobj = createObject("java","com.your.path.MailFetch");
    
    messages = mailobj.fetchFolder("outlook.office365.com", "993", "xxxx", "xxxx", "INBOX");
    

    你也可以试试这个

    <cfexchangeConnection action="open" username="xxxx" password="xxxx" port="993" server="outlook.office365.com" connection="testconn1">
    
    <cfexchangemail action="get" name="inbox" connection="testconn1" folder = "INBOX"></cfexchangemail>
    
    <cfexchangeConnection action="close" connection="testconn1">
    

    【讨论】:

    • 不知道 cfexchangeConnection 标签所以 +1 指向我那个方向。显然 office365 需要 cfexchangeConnection 标签的版本参数。此参数在我当前使用的版本 cf9(cf10 及更高版本)上不可用。
    【解决方案3】:

    获取对Flag.SEEN的引用

    Flags.Flag - 这个内部类代表一个单独的系统标志。

    然后用它来构建其他对象(Flags 和 FlagTerm):

    Flag = createObject("java", "javax.mail.Flags$Flag");
    Seen = createObject("java", "javax.mail.Flags").init(Flag.SEEN);
    Term = createObject("java", "javax.mail.search.FlagTerm").init(Seen, false);
    // do search ...
    messages = inbox.search(Term);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 2016-04-14
      相关资源
      最近更新 更多