Truy xuất hộp thư Outlook bằng Java

Đôi khi ứng dụng Java cũng cần liên kết một số tiện ích của Windows như gởi thư hay truy xuất hộp thư trong chương trình Outlook của Microsoft. Chương trình giới thiệu ở đây gồm hai ứng dụng nhỏ, một ứng dụng được viết bằng C để truy xuất hộp thư của Outlook và một ứng dụng viết bằng Java gọi ứng dụng C bằng JNI (Java Native Interface). Nhiệm vụ của chương trình là thực hiện ghi cuộc hẹn (appointment) vào Outlook.

Yêu cầu hệ thống
– JDK 1.2.x hay cao hơn.
– Máy truy xuất hộp thư bằng Office 2000, chạy trên Window 2000.

Thực hiện chương trình

1. Ứng dụng Java

Bạn tạo một class có tên Outlook với một hàm cần gọi để ghi cuộc hẹn với các tham số như năm, tháng, ngày, giờ bắt đầu, phút bắt đầu, giờ kết thúc, phút kết thúc cuộc hẹn trong ngày.

package outlook;

public class Outlook
{
public static native void sendAppointmentItem(int year, int month, int day, int fromhour, int fromminute, int tohour, int tominute);


static
{
System.loadLibrary(“Outlook”);
}

public static void main(String[] args)
{
Outlook.sendAppointmentItem(2004, 7, 6, 8, 30, 9, 30);
}
}

Sau đó bạn dịch file này bằng dòng lệnh:

javac outlook.Outlook.java
javah –jini outlook.Outlook

Khi dịch xong bạn sẽ có được file Outlook.class và outlook_Outlook.h tương ứng.

2. Ứng dụng C

Bạn dùng công cụ Visual C++ để tạo một thư viện DLL. Ứng dụng này được tạo bằng MFC AppWizard(dll) của Visual C++. Bạn include file outlook_Outlook.h vừa được tạo ra vào ứng dụng này. Để biên dịch ứng dụng bạn cần phải include thêm jini.h trong thư mục jdk1.2include.

File outlook_Outlook.h
/* DO NOT EDIT THIS FILE – it is machine generated */
#include <jni.h>
/* Header for class outlook_Outlook */

#ifndef _Included_outlook_Outlook
#define _Included_outlook_Outlook
#ifdef __cplusplus
extern “C” {
#endif
/*
* Class: outlook_Outlook
* Method: sendAppointmentItem
* Signature: (IIIIIII)V
*/
JNIEXPORT void JNICALL Java_outlook_Outlook_sendAppointmentItem
(JNIEnv *, jclass, jint, jint, jint, jint, jint, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

Tiếp theo, bạn tạo một file OutlookImpl.c để thực thi hàm trên, file thực thi này phải include file outlook_Outlook.h được tạo ra ở trên.

File OutlookImpl.c
#include <StdAfx.h>
#include “msoutl9.h”

#include “..OutlookJavaclassesGenerated Sourceoutlook_Outlook.h”

Chương trình này có dùng API của MSOUTL9.DLL để truy xuất các hàm của Outlook. DLL này sẽ được tạo khi máy dùng Outlook 2000. Trước khi tạo đối tượng truy xuất các hàm API của Outlook, bạn phải khai báo toàn cục dòng lệnh sau, có tác dụng đảm bảo cho đối tượng Outlook được tự động khởi tạo và hủy bỏ:

struct StartOle
{
StartOle()
{
CoInitialize(NULL);
}

~StartOle()
{
CoUnitialize();
}

} _inst_StartOle;

Tiếp theo là hàm ghi cuộc hẹn lên Outlook

void SendAppointmentItem(int year, int month, int day, int fromhour, int fromminute, int tohour, int tominute)
{
_Application oApp;
try
{
if(!oApp.CreateDispatch(“Outlook.Application”))
{
return;
}
VARIANT username;
VARIANT password;
VARIANT showDialog;
VARIANT newSession;

VariantInit( &username );
VariantInit( &password );

username.vt = VT_BSTR;
username.bstrVal = ::SysAllocString( L””);

password.vt = VT_BSTR;
password.bstrVal = ::SysAllocString( L”” );

showDialog.vt = VT_BOOL;
showDialog.boolVal = TRUE;

newSession.vt = VT_BOOL;
newSession.boolVal = TRUE;

_NameSpace oNameSpace = (_NameSpace)oApp.GetNamespace(“MAPI”);
oNameSpace.Logon(username, password, showDialog, newSession);

long lAppointmentItem = 1;
_AppointmentItem olAppointmentItem;
olAppointmentItem = (_AppointmentItem)oApp.CreateItem(lAppointmentItem);
olAppointmentItem.SetMeetingStatus(1);

COleDateTime start(year, month, day, fromhour, fromminute, 0);
COleDateTime end(year, month, day, tohour, tominute, 0);

olAppointmentItem.SetStart(start);
olAppointmentItem.SetEnd(end);

Recipients recipients = (Recipients)olAppointmentItem.GetRecipients();
recipients.Add(“ngocloi”);

olAppointmentItem.Send();

oApp.ReleaseDispatch();

::MessageBox(NULL, “Send mail success.”, “Message”, MB_OK);
}
catch(…)
{
::MessageBox(NULL, “General Exception caught.”, “Catch-All”, MB_OK);
oApp.Quit();
oApp.ReleaseDispatch();
}
}

Trong hàm trên, trước tiên khởi tạo đối tượng truy xuất đến API của Outlook. Nếu đối tượng này được khởi tạo thành công, ta tiếp tục gọi hàm đăng nhập vào hộp thư bằng tên và mật mã của hộp thư cần truy xuất. Ở đoạn mã trên, để các thông tin kia bằng rỗng thì nó sẽ tự động đăng nhập bằng tên mặc định mà bạn truy xuất hộp mail. Hai tham số sau của hàm đăng nhập được đặt “TRUE”, trong trường hợp không đăng nhập được thì sẽ hiện lên dialog cho bạn chọn tên phù hợp.
Sau đó, bạn tạo một mục hẹn với các thông tin về ngày giờ bắt đầu và kết thúc, cuối cùng là thông tin của người nhận mục hẹn này, bạn có thể thêm số lượng người nhận mục hẹn này tùy ý.

Cuối cùng là hàm thực thi chính được gọi từ Java:

JNIEXPORT void JNICALL Java_outlook_Outlook_sendAppointmentItem
(JNIEnv *env, jclass, jint year, jint month, jint day, jint fromhour, jint fromminute, jint tohour, jint tominute)
{
try
{
SendAppointmentItem(year, month, day, fromhour, fromminute, tohour, tominute);

}
catch(…)
{
::MessageBox(NULL, “General Exception caught. “, “Catch-All”, MB_OK);
}
}

Lời kết

Ứng dụng trên là một ví dụ điển hình về cách giao tiếp của Java và C. Hy vọng từ ứng dụng nhỏ này, bạn có thể giải quyết các vấn đề cơ bản về truy xuất thành phần Windows bằng Java. Chúc bạn thành công.