我必须用Java实现IMAP客户端.
使用Apache Commons Net库有哪些优势?它是否使实现更健壮,更灵活?
我如何处理返回值,它总是产生字符串.
例如:
public static void main(String[] args) throws Exception {
IMAPClient client = new IMAPClient();
client.connect(SERVER);
client.login(USERNAME, PASSWORD);
client.select("INBOX");
client.fetch("1", "body[header]");
}
Run Code Online (Sandbox Code Playgroud)
我们可以将输出定向到字符串
client.addProtocolCommandListener(new PrintCommandListener(System.out, true));
Run Code Online (Sandbox Code Playgroud)
但是,如何将文件夹列表作为文件夹实例而不是纯字符串输出?
我们在Java应用程序中使用SWT浏览器来呈现HTML内容.当环境具有非常高的分辨率(4K)时出现问题.当内容有这样的html时:
<html> <head> <style> .test { font-size: 35px;font-family: Arial;} </style> </head><body><div class='test'>TEST</div></body></html>
Run Code Online (Sandbox Code Playgroud)
用过的java源代码是:
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
public class SWTTest {
public void run() {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("SWT test");
createContents(shell);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private void createContents(Shell shell) {
shell.setLayout(new FillLayout());
Browser browser = new Browser(shell, SWT.NONE);
browser.setText("<html> \r\n" +
"<head> <style> .test { font-size: 85px;font-family: Arial;} </style> </head>\r\n" + …Run Code Online (Sandbox Code Playgroud) 我们使用probatron和saxon在我们的java应用程序中使用给定的sch文件验证测试xml .最近,sch文件中添加了一条新规则,例如
<let name="foo" value="base-uri()">
Run Code Online (Sandbox Code Playgroud)
并且一些规则使用该值,但是$ foo包含空字符串并且规则失败.我在哪里设置这个值?我在测试xml中添加了xml:base标签,如https://www.w3.org/TR/xmlbase/中所述,但它没有用.我是否必须在java方面设置?
编辑 (找到解决方案)我们使用probatron4j进行基于java的schematron处理:
Java源代码:
javax.xml.transform.TransformerFactory t = org.probatron.Utils.getTransformerFactory();
// create xml readers, perfor template processing, apply xslt
// as stated in the probatron4j examples
// ...
t.transform(getCandidateSource(), new StreamResult(baos));
Run Code Online (Sandbox Code Playgroud)
我们的修复包括:
Source source = new StreamSource(new FileInputStream(..
// or
Source source = new StreamSource(canditateURL.openStream()..
// depending on whether input source is file or url based
// below is the fix, we set path of file …Run Code Online (Sandbox Code Playgroud) 我有一个复杂而沉重的 Swing 客户端应用程序,其中包含许多模式组件、jdialogs、内部框架等。在某些情况下,会出现问题,并且不可能再专注于 Swing 文本字段。您可以单击一些 jbuttons、jcheckboxes,但无法再在可编辑的 jtextfields 上聚焦和编辑值。可编辑文本字段的获得焦点事件不再被触发,只有当您单击文本字段时才会调用requestfocus方法。我找到了一种方法(黑客),因此解决了有问题的情况,当出现问题情况时,您显示一些joptionpane消息或模态 jdialog并通过单击或处理将其关闭,问题就会消失,您可以单击文本字段并编辑它们。作为解决方案,我做了一些检查,如果您尝试关注某个组件,我会在单击的文本字段的 requestfocus 事件中启动一个计时器线程,并将该实例保留为focusrequesting组件。一段时间后,我检查了最后一个聚焦的组件
KeyboardManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner()
如果没有出现问题,并且文本字段获得焦点,则返回的对象(getPermanentFocusOwner 的返回值)与焦点请求组件是同一实例。但是,如果发生有问题的情况,返回的对象与请求的焦点不同,我通过以下方式打开临时 jdialog:
JDialog dialog=new OptionPane().createDialog(KeyboardFocusManager.getCurrentFocusManager().getActiveWindow(), "");
dialog.setModal(true);
// MUST be modal to fix the lost focus case
// start closing thread, which closes the dialog after some few time by dialog.dispose
new Closer(dialog).start();
dialog.setVisible(true);
Run Code Online (Sandbox Code Playgroud)
这个机制有效,但现在还不是很稳定。在某些情况下,dialog.dispose()不起作用,临时窗口始终保留在屏幕上,不可关闭,并且由于它是模态的,客户端无法再执行任何操作。对话框必须是模态的才能解决焦点问题,因为非模态对话框不能解决上面声明的焦点问题。jdialog的dispose方法有很多同步块,互斥对象等,我认为发生了一些死锁。
有更好的机制建议、想法吗?我知道最好的解决方案是检查当前的应用程序,分析它或重写它。但它非常复杂、沉重,并且模型和视图组织得不好。我的时间很短,因为客户正在等待,需要一些临时解决方案、技巧或技巧。
我将tinymce编辑器嵌入到javafx WebWiew中.我用webEngine.load方法加载编辑器.复制粘贴出现问题.当我将记事本中的一些内容复制到tinymce时,它会被粘贴.接下来,当我将一些内容从tinymce复制到tinymce时,它会被粘贴.没问题.但是,一旦我将一些来自tinyme的内容粘贴到了自己的内容中,我就无法再从tinymce(webView)之外复制了.例如,当我从记事本中复制文本并执行粘贴时,将忽略从记事本复制的值,并再次粘贴从tinymce复制的先前值.
我将监听器添加到webView并检查了剪贴板值,它们在所有情况下都是正确的:
webView.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent arg0) {
if (arg0.isControlDown() && arg0.getCode() == KeyCode.V) {
final ClipBoard clipBoard = ClipBoard.getSystemClipBoard();
System.out.println(clipBoard.getContent(DataFormat.PLAIN_TEXT));
..
Run Code Online (Sandbox Code Playgroud)
在编辑器方面,在初始化TinyMCE编辑器时:正如您在第三次尝试中看到的那样,args.content是错误的,并且不包含剪贴板中的值.
tinymce.init {
paste_preprocess : function(plugin,args) {
debug(args.content);
Run Code Online (Sandbox Code Playgroud)
第1步:[确定]
从记事本ABCDE复制的值
用于剪贴板的java系统:ABCDE
编辑器html调试说:ABCDE
第2步:[确定]
从tinymce编辑器XYZQ复制的值
用于剪贴板的java系统:XYZQ
编辑器html调试说:XYZQ
第3步:[失败]
从记事本ASDFG复制的值
用于剪贴板的java系统:ASDFG
编辑器html调试说:XYZQ
系统属性:
TinyMCE 4.2.2
Windows 7的
问题出现在java 1.8.65和1.8.66上
java 1.7.40上不会出现此问题
解决方案: 我可以使用执行脚本等手动将内容从java发送到javafx(编辑器),并覆盖tinymce的paste_preprocess函数中的值.但为什么会发生这种事情?(java 1.7上没有出现这种情况)必须有一个更好的解决方案.
假设通过在chrome上按shift + ctrl + delete删除了缓存文件.删除以f_*开头的文件,并减少data_*文件data_0,data_1 .... 所以我们不能使用chrome缓存查看器,因为文件不在了.我尝试使用商业和免费取消删除软件(easeus,recuva,puran,activeundelete),他们找到了删除的f_和data_文件但是当我恢复它们并使用nirsoft google chrome cace viewer时,我看到了损坏的结果.在删除操作之前,我需要缓存中的URL和文件.还有其他方法吗?DNS缓存不是一个选项,计算机已被重置.谷歌我的活动将无济于事,因为它只包含访问过的网址(历史记录),但是第一个网址访问了外部网址.
我想在tinymce编辑器中嵌入一个图像而不是文件,我想用这种形式嵌入它(直接把它的base64数据)
<img src="data:image/png;base64,ABCD..."></img>
Run Code Online (Sandbox Code Playgroud)
我将图像数据存储在一个变量中,
var data= '<img src="data:image/png;base64,ABCD..."></img>';
Run Code Online (Sandbox Code Playgroud)
当我调用
tinyMCE.execCommand('mceInsertContent', false, data);
Run Code Online (Sandbox Code Playgroud)
或者
tinyMCE.execCommand('mceInsertRawHTML', false, data);
Run Code Online (Sandbox Code Playgroud)
或者
tinyMCE.activeEditor.setContent(data, {format:'raw'});
Run Code Online (Sandbox Code Playgroud)
调用后,当我取回 HTML 时,我们有:
<img src="blob:XYZ">
但是 blob 内容与我们提供的数据不同,它非常短,如果我们在另一个浏览器中重用此 HTML,我们将看不到图像。TinyMCE 使用这个 BLOB:... 进行缓存,但我不想要任何缓存。
我正在测试https://javaee.github.io/javamail/FAQ中所述的sendmail示例 .这是一个简单的邮件发送操作,没有SSL,也没有附件.它在任何地方都可以正常工作,但在客户端上,当邮件api变得更新时,我们会有一个去线性能.
服务器是windows,java 1.8.131,在所有测试用例中使用相同的邮件服务器和邮件帐户以及相同的地址和java源.唯一的区别是使用的mailapi.我运行程序
java -cp javax.mail.1.XXjar; sendmailtesttool.jar SendMail
我为每个邮件api尝试了100次并获得平均持续时间.
使用的来源:
Properties properties = new Properties();
properties.put("mail.smtp.host", 192.168.0.X); // use default port25
Session session = Session.getInstance(properties);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(..);
msg.setSubject(..);
msg.setRecipients(..);
//no attachments
MultiPart mp = new MultiPart();
MimeBodyPart bp = new MimeBodyPart();
DataSource ds = ByteArrayDataSource("foo"..);
DataHandler dh = new DataHandler(ds);
bp.setDataHandler(dh);
mp.addBodyPart(bp);
msg.setContent(mp);
Transport transport = session.getTransport("smtp");
transport.connect(host, username, password);
msg.saveChanges(); // is really needed ? (no reply/forward) …Run Code Online (Sandbox Code Playgroud) 我使用JavaMail API获取附件,其中一些是winmail.dat形式.
正如获得的邮件附件中所述的POP 3收到的winmail.dat或如何处理Microsoft Outlook winmail.dat?还有其他惊喜吗?
我试过https://github.com/jukka/jtnef/blob/master/src/net/freeutils/tnef/TNEF.java 和apache:https://poi.apache.org/hmef/
当我解析winmail.dat文件时,我只获得了MAPIProperties但没有附件文件,当我调试构造的Message实例时,附件数组是空的,我们只有一些属性MAPIProperties和0个附件.
但是当我们使用其他工具(例如Zimbra)获取时,我们将真实VCALENDAR文件作为附件获取.
BEGIN:VCALENDAR
方法:REQUEST
CALSCALE:GREGORIAN
BEGIN:VTIMEZONE
问题:我们如何从中提取VCALENDAR文件winmail.dat或有什么方法可以将其转换MAPIProperites为VCALENDAR?
例如,我们在jtnef的输出中有:
MAPIProp:type = PT_UNICODE_STRING name = [GUID = 00 .. id = 0x .. value = MyAttendee
但在真实(正确)的VCalendar文件中:
ATTENDEE;CN=MyAttendee
java ×6
email ×3
jakarta-mail ×3
browser ×2
html ×2
tinymce ×2
clipboard ×1
copy ×1
embed ×1
focus ×1
imap ×1
javafx ×1
javascript ×1
jdialog ×1
paste ×1
performance ×1
saxon ×1
sendmail ×1
swing ×1
swt ×1
undelete ×1
winmail.dat ×1
xml ×1
xml-parsing ×1