Posts Tagged ‘flex’
I need information whether airxmail work well on ipad or not.
Recently I got same question from some peoples. in Japan and us and etc…
They says.
airxmail work well on ipad simulator, but does NOT work well on real ipad.
But I don’t have ipad or iphone.
So I need information.
If somebody have any information,
Please write comment or send me e-mail.
Regards
I released airxmail version 0.7.
New feature
IMAP4
If you use draft implementation, please change this version.
Can’t get email from POP3 or IMAP4 server with Airxmail.
Can’t send email to SMTP server with Airxmail.
But Why ?
But It is difficult to make the answer.
Because Airxmail is a library to communicate servers.
So you should know which is the problem, server or client ?
But How ??
Airxmail library support flex logging(mx.logging) functions.
So you can get debug logs using this functions.
The log text show you the communication between server and client.
1.Log sample ( IMAP and POP3 )
2.How to use flex logging functions.
2-1 ) Output using standard( trace() ) classes.
2-2 ) Output to file instead of trace()
Log sample
IMAP4
com.coltware.airxmail.imap.IMAP4Client set auth : xxxxxxxx@xxxxxx.com com.coltware.airxmail_internal.IMAP4 CMD[AX1000 CAPABILITY] com.coltware.airxmail_internal.IMAP4 CMD[AX1001 LOGIN username password] com.coltware.airxmail_internal.IMAP4 CMD[AX1002 NAMESPACE] com.coltware.airxmail_internal.IMAP4 CMD[AX1003 LSUB "" "*"] com.coltware.airxmail_internal.IMAP4 CMD[AX1004 SELECT "INBOX"] com.coltware.airxmail.imap.command.SelectCommand OK... com.coltware.airxmail_internal.IMAP4 CMD[AX1005 UID SEARCH SENTSINCE 1-Nov-2010] com.coltware.airxmail.imap.command.IMAP4Command line>* SEARCH 237 238 239 240 241 com.coltware.airxmail_internal.IMAP4 CMD[AX1006 UID FETCH 241 RFC822.HEADER] com.coltware.airxmail.MimeBodyPart create part object : [xxxx][object MimeMessage] com.coltware.airxmail_internal.IMAP4 CMD[AX1007 UID FETCH 240 RFC822.HEADER] com.coltware.airxmail.MimeBodyPart create part object : [xxxx][object MimeMessage] com.coltware.airxmail_internal.IMAP4 CMD[AX1008 UID FETCH 239 RFC822.HEADER] com.coltware.airxmail_internal.IMAP4 CMD[AX1051 SELECT "&TtVOiw-"] com.coltware.airxmail_internal.IMAP4 CMD[AX1052 SELECT "&ZcWITA-"] com.coltware.airxmail_internal.IMAP4 CMD[AX1053 LOGOUT]
“com.coltware.airxmail_internal.IMAP4 CMD[AXxxxx” is a request.
POP3
com.coltware.airxmail.pop3.POP3Client handleNotServiceReady : com.coltware.airxmail.pop3.POP3Client [NO] +OK mail.hosname.ne.jp POP Gateway starting. <7877.94.1295676023hostname.com> com.coltware.airxmail.pop3.POP3Client exec[USER username] com.coltware.airxmail.pop3.POP3Client USER>+OK Password required for usename@hostname.com. com.coltware.airxmail.pop3.POP3Client exec[PASS xxxxxxx] com.coltware.airxmail.pop3.POP3Client PASS>+OK username@hostname.com 8 message(s) (45468 octets). com.coltware.airxmail.pop3.POP3Client exec[UIDL] com.coltware.airxmail.pop3.POP3Client UIDL>+OK uidl command accepted. com.coltware.airxmail.pop3.POP3Client UIDL>1 798898888666525F84ZX55365F999671U com.coltware.airxmail.pop3.POP3Client UIDL>2 798898888278645F84ZX54365F99986YX com.coltware.airxmail.pop3.POP3Client UIDL>3 798898868173705F84ZX5Z365F99930YZ com.coltware.airxmail.pop3.POP3Client UIDL>4 798898858076435F84ZX52365F999679W com.coltware.airxmail.pop3.POP3Client UIDL>5 798898857787865F84ZX54365F99978Z4 com.coltware.airxmail.pop3.POP3Client UIDL>6 798898828171545F84ZX54365F9996X0Z com.coltware.airxmail.pop3.POP3Client UIDL>7 798898808643695F84ZX51365F9994ZUX com.coltware.airxmail.pop3.POP3Client UIDL>8 798898798097665F84ZX5V365F9998X3V com.coltware.airxmail.pop3.POP3Client UIDL>. com.coltware.airxmail.pop3.POP3Client exec[TOP 8 0] com.coltware.airxmail.pop3.POP3Client [RETR]+OK 3082 octets com.coltware.airxmail.pop3.POP3Client exec[QUIT]
2.How to use flex logging functions
Flex logging function is not depends output facility.
So you can decide the log output facility.
1st step: explain how to use flex logging using the class in FLEX SDK ( not depends on any library to output log )
2nd step: explain how to write log file using my classes
Because standard classes in FLEX SDK in only support standard output(?) ( trace() output ) as far as I know.
2-1 )
import mx.logging.Log;
import mx.logging.LogEventLevel;
import mx.logging.LogLogger;
import mx.logging.targets.TraceTarget;
private function init():void{
var logTarget:TraceTarget = new TraceTarget();
logTarget.filters = ["*"];
logTarget.includeCategory = true;
logTarget.level = LogEventLevel.DEBUG;
Log.addTarget(logTarget);
}
Please invoke init method in your initialize step.
In my usual case, I write these code.
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" xmlns:local="*" creationComplete="init()">
That's all.
You don't need to write stace() function in your code.
You can see these code in airxmail library.
private static const log:ILogger = Log.getLogger("com.coltware.airxmail.imap.IMAP4Client");
private static const _log:ILogger = Log.getLogger("com.coltware.airxmail_internal.IMAP4");
:
_log.debug("CMD[" + cmd + "]");
Airxmail output a log automatically using flex logging functions.
You can see more detail at livedocs.adobe.com.
Flex logging function is many functions , like filter output and change output format etc ...
Current Airxmail subversion repository version has these 2 category.
"com.coltware.airxmail_internal.*" is low level log like protocol debug.
"com.coltware.airxmail.*" is more user level log.
But there was not clearly border, so please check the source code if you want to know more detail.
2-2 )
use FileTarget class in airxlib library.
FileTarget class support to write log file on your desktop pc.
import com.coltware.airxlib.log.FileTarget;
private function init():void{
var fileTarget:FileTarget = new FileTarget();
fileTarget.directory = File.desktopDirectory; // set directory path
fileTarget.filename = "airxmail.log"; // set filename
fileTarget.append = false;
fileTarget.filters = ["*"];
fileTarget.includeCategory = true;
fileTarget.level = LogEventLevel.DEBUG;
Log.addTarget(fileTarget);
}
I made airxmail swc file on google codes.
The file is draft implemetation version for IMAP4.
So if you don’t want to use draft version, please wait…
It doen’t support IMAP4 all functions.
But it is available to get e-mail message from imap server, like gmail imap.
These code are sample to connect and get message from gmail account.
Create client instance
import com.coltware.airxmail.imap.IMAP4Client;
:
private var client:IMAP4Client;
public function init():void{
client = new IMAP4Client;
client.host = "imap.gmail.com";
client.port = 993;
client.socketObject = new SecureSocket();
}
mail flow to connect and get e-mail
// Set handler for Folder Result client.addEventListener(IMAP4Event.IMAP4_FOLDER_RESULT,folderListResult); // Set handler for UID list result ( uid is a key to get e-mail from server ) client.addEventListener(IMAP4ListEvent.IMAP4_RESULT_UID_LIST,uidList); // Set message handler client.addEventListener(IMAP4MessageEvent.IMAP4_MESSAGE,handleMessage); // Set username and password, and invoked connect method client.setAuth(username,password); client.connect(); client.login(); // get subscribed folder list client.lsubBlocking(); // logout client.logout();
Implemantation of folder result handler
private function folderListResult(event:IMAP4Event):void{
var folder:IMAP4Folder = event.result as IMAP4Folder;
trace("NAME=>[" + folder.name + " --> " + folder.nameUTF8 + "]");
if(!folder.noselect){
client.selectMailbox(folder).search(IMAP4Search.dateSentSince("2010/10/01"));
}
}
POINT1
if(!folder.noselect){
}
If the folder’s noselect property is true, you can NOT select mailbox,
POINT2
client.selectMailbox(folder).search(IMAP4Search.dateSentSince("2010/10/01"));
If you want to get ALL messages from the folder,
client.selectMailbox(folder).search(IMAP4Search.ALL);
If you know the folder name ( ex “INBOX” ) and want to get ALL messages form the folder,
you don’t need to get folder list, so you can change main flow source as following below..
:
client.login();
// client.lsubBlocking();
client.selectMailbox("INBOX").search(IMAP4Search.ALL);
client.logout();
Implemantation of message get handler
// result for search method
private function uidList(event:IMAP4ListEvent):void{
for(var i:int = 0; i<event.length; i++){
var id:String = event.getValue(i);
client.message(id);
}
}
private function handleMessage(event:IMessageEvent):void{
var msg:MimeMessage = event.getMimeMessage();
trace("SUBJECT : " + msg.subjectUTF8);
}
IMessageEvent does not depends on IMAP4 API.
So you can handle the object like as POP3 API.
If you want to know how to get e-mail message.
Please refer to HERE.
private function messageHandler(e:POP3MessageEvent):void{
var msg:MimeMessage = e.getMimeMessage();
// attachmentChildren are only parts has attachments files.
// Don't need to check all children to extract files
var attaches:Array = msg.attachmentChildren;
if(attaches.length > 0){
for each(var attach:MimeBodyPart in attaches){
if(attach is MimeBinaryPart){
var binPart:MimeBinaryPart = attach as MimeImagePart;
var bytes:ByteArray = attach.bodyByteArray;
// v0.5 and less than r69 version has BUG !!
// binPart.getHeader("Content-Disposition"); is both available
var contentDisposition:MimeHeader = binPart.contentDisposition;
if(contentDisposition){
var filename:String = contentDisposition.getParameter("filename");
filename = MimeUtils.decodeMimeHeader(filename);
log.debug("Filename => " + filename );
// save Desktop directory, plese change following codes as you like
var file:File = File.desktopDirectory.resolvePath(filename);
var fs:FileStream = new FileStream();
fs.open(file,FileMode.APPEND);
fs.writeBytes(bytes);
fs.close();
}
}
}
}
}
Problem
You need to change flex sdk directory ( flex version ) in ANT build.xml file without specifying absolute directory path.
1) use Flex Builder 3 or Flash Builder 4 ‘s Flex SDK directory
2) use enviroment variable
<!-- use 'env' as enviroment variable -->
<property environment="env" />
<!-- Default Flex SDK directory -->
<property name="FLEX_SDK" value="C:\Flex\sdk\3.5.0.12683" />
<!-- Set SDK directory from enviroment variable -->
<condition property="FLEX_HOME" value="${env.FLEX_HOME}">
<isset property="env.FLEX_HOME" />
</condition>
<!--
set Flash(Flex) Builder's SDK directory
In my case value is 'C:\Program Files (x86)\Adobe\Adobe Flash Builder 4\sdks\4.1.0'
-->
<condition property="FLEX_HOME" value="${application.home}">
<isset property="application.home" />
</condition>
<target name="compc">
<echo>FLEX_HOME: ${FLEX_HOME}</echo>
<compc output="dist/swcfilename.swc">
<load-config filename="${FLEX_HOME}/frameworks/air-config.xml" />
<source-path path-element="${basedir}/src" />
<include-sources dir="${basedir}/src" includes="*" />
<include-libraries file="${basedir}/libs" />
</compc>
</target>
You can see complete build.xml file at HERE.
Point1
condition tag.
<condition property="FLEX_HOME" value="${application.home}">
<isset property="application.home" />
</condition>
Point2
When you execute ‘ant’ , please check
[Run in the same JRE as the workspace]
Flash(Flex) builder does not include ANT view by default,
So please see the blog or search yourself.
var contentType:ContentType = ContentType.MULTIPART_MIXED;
var mimeMsg:MimeMessage = new MimeMessage(contentType);
var from:INetAddress = new INetAddress();
from.personal =
from.address = "from.email.address@coltware.com";
mimeMsg.setFrom(from);
mimeMsg.setReplyTo(from);
var toAddr:INetAddress = new INetAddress("to.email.address@coltware.com","hello airxmail");
mimeMsg.addRcpt(RecipientType.TO,toAddr);
// set mail subject
mimeMsg.setSubject("Hello World");
mimeMsg.setTextBody("this is multipart message");
//
// Plain Text Part
//
var textPart:MimeTextPart = new MimeTextPart();
textPart.contentType.setParameter("charset","UTF-8");
textPart.transferEncoding = "8bit";
textPart.setText("This is text body part \n This is 2nd line.");
mimeMsg.addChildPart(textPart);
//
// Attachment part
//
var filePart:MimeImagePart = new MimeImagePart();
filePart.contentType.setMainType("image");
filePart.contentType.setSubType("jpeg");
filePart.setAttachementFile(File.desktopDirectory.resolvePath("image.jpg"),"fireworks.jpg");
mimeMsg.addChildPart(filePart);
The last time I introduced the features of “Airxzip”, this post says one of the features.
Change file system and set filemode and directory mode
var writer:ZipFileWriter = new ZipFileWriter(ZipFileWriter.HOST_UNIX);
writer.open(File.desktopDirectory.resolvePath("airxzip_unix.zip"));
writer.setDirMode("0700");
writer.setFileMode("0700");
writer.addDirectory("Foo1");
writer.addFile(File.desktopDirectory.resolvePath("image.jpg"),"Foo2/image.jpg");
writer.setFileMode("0766");
writer.addFile(File.desktopDirectory.resolvePath("image.jpg"),"Foo3/image.jpg");
writer.close();
unzip -Z airxzip_unix.zip Archive: airxzip_unix.zip 1550668 bytes 3 files drwx------ 1.0 unx 0 b- stor 6-May-10 20:11 Foo1/ -rwx------ 2.0 unx 777835 b- defN 14-Jul-09 14:32 Foo2/image.jpg -rwxrw-rw- 2.0 unx 777835 b- defN 14-Jul-09 14:32 Foo3/image.jpg
Default filetype is “ZipFileWriter.HOST_WIN”.
So If you want to create zip file for Mac or Unix/Linux , Please set “ZipFileWriter.HOST_UNIX”.
var writer:ZipFileWriter = new ZipFileWriter(ZipFileWriter.HOST_UNIX);
Default file system
unzip -Z async_airxzip.zip Archive: async_airxzip.zip 775492 bytes 3 files -rw-a-- 2.0 fat 6 b- defN 6-May-10 20:12 sample.txt drwx--- 1.0 fat 0 b- stor 6-May-10 20:12 Foo1/ -rw-a-- 2.0 fat 777835 b- defN 14-Jul-09 14:32 Foo1/image.jpg
Airxzip
Airxzip is a library in ActionScript3 (AIR).
Fzip is ActionScript3 library too.
But I have some problems to use it.
So I made “Airxzip”.
Airxzip has following features …
1) Specialize in AIR
It becomes possible for the access to begin at the end of the file ( zip entry infomations ),
It does not to depend on the size of zip file.
So It is able to access information quickly.
2) Async upzip
Airxzip has 2 unzip method. ( unzip() and unzipAsync() )
3) PKWare encrypt/decrypt
4) File attribute ( Zip mode only)
Enable to set file attirbute.
ex) “0700″ “0755″
5) Japanese filename
Mac OS and Unix filename is UTF-8, Windows is Shift_JIS.
And Mac OS UTF-8 and Unix UTF-8 is not same to handle Hankaku-kana.
So AIrxzip resolve these difference automatically.
