简体   繁体   English

使用Content Navigator插件发送电子邮件

[英]Send email using Content Navigator Plugin

I have a content navigator plugin through which, I need to send out an email. 我有一个内容导航器插件,我需要通过该插件发送电子邮件。 Plugin is deployed in Websphere and below are the steps I followed. 插件已部署在Websphere中,下面是我遵循的步骤。

  1. Created a mail provider in WAS 在WAS中创建了一个邮件提供商
  2. Created mail session and selected 'smtp' as the protocol 创建邮件会话并选择“ smtp”作为协议

I have a java code which sends out email 我有一个发送电子邮件的Java代码

Context context = new InitialContext(); 
Session mailSession = (Session)context.lookup("mail/mySession"); 
Message msg = new MimeMessage(mailSession); 
msg.setFrom(new InternetAddress(email)); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(destinationAddress)); 
// Set the subject and body text 
msg.setSubject(subject); 
msg.setText(messageBody); 
// send message 
Transport.send(msg);

I'm getting error as 我收到错误消息

java.lang.ClassCastException: javax.mail.Session incompatible with javax.mail.Session

My webpshere (C:\\IBM\\WebSphere\\AppServer\\lib)by default has mailapi.jar. 我的webpshere(C:\\ IBM \\ WebSphere \\ AppServer \\ lib)在默认情况下具有mailapi.jar。 Even navigator.war and taskManagerWeb.war also has the same jar. 甚至navigator.war和taskManagerWeb.war也具有相同的jar。 I think the issue is due to having multiple jars within the same websphere. 我认为问题是由于同一个Websphere中有多个jar。 Can anyone help me on how to solve this issue? 谁能帮助我解决这个问题?

Since WebSphere is a Java EE product, it should have a full JavaMail implementation included in it. 由于WebSphere是Java EE产品,因此它应该包含完整的JavaMail实现。 You shouldn't need to include any JavaMail jar files in your application. 您无需在应用程序中包含任何JavaMail jar文件。

It's been a while, but i ran into the same problem a long time ago. 已经有一段时间了,但是很久以前我遇到了同样的问题。 I finally came to the conclusion that Navigator includes it's own javax.mail - and as your plugin is loaded by an ad-hoc navigator-created parent-last classloader, it will not be able to match the EE javax.mail.session to the javax.mail.session found by the plugin classloader. 我最后得出的结论是,导航器包括它自己的javax.mail-并且当您的插件由临时导航器创建的父最后一个类加载器加载时,它将无法将EE javax.mail.session与插件类加载器找到的javax.mail.session。

I'd suggest one of the following two solutions: 我建议以下两种解决方案之一:

  1. Move your mail functionality outside of the navigator plugin. 将邮件功能移到导航插件之外。 Eg Create an EJB that performs your functionality, and from within your plugin inject/lookup the EJB. 例如,创建一个执行您的功能的EJB,并从插件内部插入/查找EJB。
  2. Use the Navigator mail session instead of the Websphere mail-session. 使用Navigator邮件会话而不是Websphere邮件会话。

Two additional alternatives: 两种其他选择:

  1. Don't do the typecasting and use reflection. 不要进行类型转换并使用反射。 I'm unsure though if you'll be able to locate the right MimeMessage constructor with reflection using the wrong class. 我不确定是否可以使用错误的类通过反射找到正确的MimeMessage构造函数。

  2. E-mail from the CPE using a code-module. 使用代码模块从CPE发送电子邮件。 While the problem you described actually applies for the CPE as well, it would give you the choice of using either the PE configured or CE configured mail sessions. 尽管您描述的问题实际上也适用于CPE,但它使您可以选择使用PE配置的邮件会话或CE配置的邮件会话。

The following code might help you. 以下代码可能会对您有所帮助。 Please note that I commented the code to help you use the solution. 请注意,我注释了代码以帮助您使用该解决方案。

 **- **RecoveryBin.js****
require([ "dojo/_base/declare", "dojo/_base/lang", "ecm/model/Request",
        "ecm/model/ResultSet", "recoveryBeanDojo/BestDialog",
        "ecm/widget/ComboBox", "dojo/domReady!" ], function(declare, lang,
        Request, ResultSet, BestDialog, ComboBox) {
    /**
     * Use this function to add any global JavaScript methods your plug-in requires.
     */
    lang.setObject("moveToRB", function(repository, items, callback, teamspace,
            resultSet, parameterMap) {
        /*
         * Add custom code for your action here. For example, your action might launch a dialog or call a plug-in service.
         */
        // Iterating items array --- {d0c1},{doc2}
        var itemsList="";
        console.log("Number of selected documents -- "+ items.length);
        for(var j=0;j<items.length;j++)
        {
            itemsList=itemsList+items[j].id+",";
            console.log("Item is --"+itemsList);
        }
        console.log("New Items String is ---- "+itemsList);
        var bestDialog = null;
        var serviceParams = {
            icnRepository : repository.id,
            serverType : repository.type,
        //  s : items[0].id,
            s : itemsList,
        };

        Request.invokePluginService("RecoveryBean", "MoveToRBService", {

            requestParams : serviceParams,

            requestCompleteCallback : lang.hitch(this, function(response) {
                var rb;
                for (var i = 0; i < response.rb.length; i++) {
                    rb = response.rb[i];
                }// success*/
                console.log("Before New Dialog ");
                bestDialog = new BestDialog();
                //bestDialog.setContentItem(items[0]);
                bestDialog._show(rb, repository, items);
                bestDialog.show();
                console.log("After bin Dialog");

            })

        });
    });
});

**

 - BestDialog.js

**

define([ "dojo/_base/declare", "ecm/widget/dialog/BaseDialog",
        "dijit/form/CurrencyTextBox", "dojo/currency", "ecm/model/ContentItem",
        "dojo/store/Memory", "ecm/model/Request", "ecm/model/ResultSet",
        "dijit/layout/ContentPane", "dojo/dom-attr",
        "ecm/widget/layout/_RepositorySelectorMixin",
        "ecm/widget/listView/ContentList", "ecm/model/Desktop",
        "dojo/_base/lang", "ecm/widget/ComboBox",
        "dojo/text!./templates/BestDialog.html" ], function(declare,
        BaseDialog, CurrencyTextBox, currency, ContentItem, MemoryStore,
        Request, ResultSet, ContentPane, domAttr, _RepositorySelectorMixin,
        ContentList, Desktop, lang, ComboBox, template) {

    /**
     * @name sampleICNPluginDojo.BestDialog
     * @class Provides a dialog that demonstrates the right thing to do. 
     * @augments ecm.widget.BaseDialog
     */
    return declare("newPluginDojo.BestDialog", [ BaseDialog ], {
        /** @lends sampleICNPluginDojo.BestDialog.prototype */

        contentString : template,
        widgetsInTemplate : true,
        contentItem : null,
        _repository : null,
        _items : null,
        itemsList:null,
        _binlist : null,        
        postCreate : function() {
            console.log("Inside BestDialog.js:: postCreate ");
            this.inherited(arguments);
            this.setTitle("Recovery - Beans");

            this.okButton = this.addButton("Ok", "_okClick", false, true);
        },
        _okClick : function() {
            console.log("Inside BestDialog.js:: _okClick ");
            var n = this._binlist.value;

            var serviceParams = {

                icnRepository : this._repository.id,
                serverType : this._repository.type,
                s : this.itemsList,
                rbName : n
            };
            Request.invokePluginService("RecoveryBean", "RecoveryService", {

                requestParams : serviceParams,
                requestCompleteCallback : lang.hitch(this, function(response) {

                    var bestDialog = new BaseDialog();
                    bestDialog.set("title", "Deleted Items Bean");
                    bestDialog.set("content","Document Are Successfully Moved To Recycle Bin");
                    bestDialog.show();
                    console.log("After Recovery Service Dialog");

                })

            });
            this.hide();
            this.destroyRecursive(); // Destroys all child widgets as well
        },

        onCancel : function() {
            this.destroyRecursive();
        },
        // Method responsible to show dialog box:- Documented by Ashok
        _show : function(rb, repository, items) {
            console.log("inside show ");
            this._repository = repository;
            this._items = items;
            this._rb = rb;
            var item = [];

            for ( var key in rb) {
                item.push({
                    "id" : rb[key],
                    "name" : key
                });
                console.log(key + ":" + rb[key]);
            }

            // Create test store.
            comboStore = new MemoryStore({
                data : item
            });
            this._binlist = this.binlist;
            this._binlist.store = comboStore;

            console.log("Completed");

        }

    });
});

**MoveToRBService.java**

package com.ibm.demo;

import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;

import javax.security.auth.Subject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.filenet.api.collection.CmRecoveryItemSet;
import com.filenet.api.collection.EventSet;
import com.filenet.api.collection.IndependentObjectSet;
import com.filenet.api.constants.RefreshMode;
import com.filenet.api.core.Document;
import com.filenet.api.core.Factory;
import com.filenet.api.core.ObjectStore;
import com.filenet.api.core.VersionSeries;
import com.filenet.api.events.Event;
import com.filenet.api.query.SearchSQL;
import com.filenet.api.query.SearchScope;
import com.filenet.api.util.CmRecoveryBin;
import com.filenet.api.util.CmRecoveryItem;
import com.filenet.api.util.Id;
import com.filenet.api.util.UserContext;
import com.ibm.ecm.extension.PluginResponseUtil;
import com.ibm.ecm.extension.PluginService;
import com.ibm.ecm.extension.PluginServiceCallbacks;
import com.ibm.ecm.json.JSONMessage;
import com.ibm.ecm.json.JSONResponse;
import com.ibm.ecm.json.JSONResultSetResponse;
import com.ibm.json.java.JSONArray;
import com.ibm.json.java.JSONObject;

/**
 * Provides an abstract class that is extended to create a class implementing
 * each service provided by the plug-in. Services are actions, similar to
 * servlets or Struts actions, that perform operations on the IBM Content
 * Navigator server. A service can access content server application programming
 * interfaces (APIs) and Java EE APIs.
 * <p>
 * Services are invoked from the JavaScript functions that are defined for the
 * plug-in by using the <code>ecm.model.Request.invokePluginService</code>
 * function.
 * </p>
 * Follow best practices for servlets when implementing an IBM Content Navigator
 * plug-in service. In particular, always assume multi-threaded use and do not
 * keep unshared information in instance variables.
 */
public class MoveToRBService extends PluginService {
    public static final String REPOSITORY_ID = "icnRepository";
    public static final String REPOSITORY_TYPE = "serverType";

    /**
     * Returns the unique identifier for this service.
     * <p>
     * <strong>Important:</strong> This identifier is used in URLs so it must
     * contain only alphanumeric characters.
     * </p>
     * 
     * @return A <code>String</code> that is used to identify the service.
     */
    public String getId() {
        return "MoveToRBService";
    }

    /**
     * Returns the name of the IBM Content Navigator service that this service
     * overrides. If this service does not override an IBM Content Navigator
     * service, this method returns <code>null</code>.
     * 
     * @returns The name of the service.
     */
    public String getOverriddenService() {
        return null;
    }

    /**
     * Performs the action of this service.
     * 
     * @param callbacks
     *            An instance of the <code>PluginServiceCallbacks</code> class
     *            that contains several functions that can be used by the
     *            service. These functions provide access to the plug-in
     *            configuration and content server APIs.
     * @param request
     *            The <code>HttpServletRequest</code> object that provides the
     *            request. The service can access the invocation parameters from
     *            the request.
     * @param response
     *            The <code>HttpServletResponse</code> object that is generated
     *            by the service. The service can get the output stream and
     *            write the response. The response must be in JSON format.
     * @throws Exception
     *             For exceptions that occur when the service is running. If the
     *             logging level is high enough to log errors, information about
     *             the exception is logged by IBM Content Navigator.
     */
    public void execute(PluginServiceCallbacks callbacks, HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        String repositoryId = request.getParameter(REPOSITORY_ID);
        String repositoryType = request.getParameter(REPOSITORY_TYPE);
        JSONResponse jsonResponse = new JSONResponse();
        ObjectStore objectStore = null;
        JSONObject jsonObject = new JSONObject();
        JSONObject finalJsonObj = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        CmRecoveryBin bin = null;
        try {
            if (repositoryType.equals("p8")) {
                Subject subject = callbacks.getP8Subject(repositoryId);
                UserContext.get().pushSubject(subject);
                System.out.println("in first if");
            }
            Object synchObject = callbacks.getSynchObject(repositoryId, repositoryType);
            if (synchObject != null) {
                synchronized (synchObject) {
                    if (repositoryType.equals("p8")) {
                        System.out.println(" synchObject Value :Ashok"+ synchObject.toString());
                        System.out.println("in synchronised block");
                        objectStore = callbacks.getP8ObjectStore(repositoryId);

                        System.out.println("ObjectStore!!!!!!!!!123" + objectStore.get_DisplayName());
                    }
                }
                SearchSQL sqlObject = new SearchSQL("select * from CmRecoveryBin");
                SearchScope searchScope = new SearchScope(objectStore);
                Integer myPageSize = new Integer(1000);
                Boolean continuable = Boolean.valueOf(true);
                IndependentObjectSet binSet = searchScope.fetchObjects(sqlObject, myPageSize, null, continuable);

                // Iterate the set of recovery bins.
                Iterator iterOuter = binSet.iterator();

                while (iterOuter.hasNext()) {
                    bin = (CmRecoveryBin) iterOuter.next();
                    System.out.println("\nRecovery bin: " + bin.get_DisplayName() + "   ID: " + bin.get_Id());
                    jsonObject.put(bin.get_DisplayName(), bin.get_Id().toString());
                    jsonArray.add(jsonObject);
                }

                finalJsonObj.put("rb", jsonArray);
                System.out.println("in cache control!!!!!!!!!!!!!!");
                response.addHeader("Cache-Control", "no-cache");
                response.setContentType("text/plain"); // must be text/plain for
                                                        // firebug
                response.setCharacterEncoding("UTF-8");
                Writer writer = response.getWriter();
                writer.write(finalJsonObj.toString());
                System.out.println("Printing results = " + finalJsonObj.toString());

            }

        } catch (Exception exc) {
            JSONMessage message = new JSONMessage(0,
                    "The document could not be retrieved.  Details have been written to the server error log.", null,
                    null, null, null);
            jsonResponse.addErrorMessage(message);
            exc.printStackTrace();
        }

    }
}


**BestDialog.html**
<div>
<select data-dojo-type="ecm/widget/ComboBox" data-dojo-attach-point="binlist"></select></div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 找不到IBM Content Navigator插件Jar文件 - the IBM Content Navigator Plugin Jar File was not found 无法连接到IBM Content Navigator Web管理 - Can not connect to IBM content navigator web administration 如何使用Java 6 SE发送电子邮件? - How to send Email with Java 6 SE? 使用check_was Nagios插件监视WebSphere Portal线程池时出错 - Error in monitoring WebSphere portal threadpool using check_was Nagios plugin 如何使用 JMeter 将 XML 文件发送到 IBM MQ? - How to send the XML file using JMeter to IBM MQ? ESQL使用IBM Integration Bus中的SOAP请求节点发送附件 - ESQL to send attachments using a SOAP request node in IBM Integration Bus 在使用IIS WebSphere插件的WebSphere 7中使用非英语语言时,CSS不会加载500错误 - CSS Does Not Load With 500 Error When Using Non-English Language in WebSphere 7 Using IIS WebSphere Plugin 在IBM WebSphere Portal 7上使用WSRP远程呈现WCM内容 - Remote rendering WCM content using WSRP on IBM WebSphere Portal 7 在Eclipse中使用M2e插件时,Websphere应用程序服务器类路径容器为空 - Websphere application server classpath container empty while using m2e plugin in Eclipse 如何使用IBM Web服务器插件中的标头值来负载均衡请求? - How to load balance requests using header value in IBM web server plugin?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM