由于包含m.saveChanges()
,执行以下测试大约需要5秒。
import org.junit.Before;
import org.junit.Test;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.util.Properties;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@Test
public void test1() throws MessagingException, IOException {
Session s = Session.getDefaultInstance(new Properties());
MimeMessage m = new MimeMessage(s);
m.setContent("<b>Hello</b>", "text/html; charset=utf-8");
m.saveChanges();
assertEquals(m.getContent(), "<b>Hello</b>");
assertEquals(m.getContentType(), "text/html; charset=utf-8");
}
我也嘲笑了与mockito的会议,但它没有帮助:
Session s = mock(Session.class);
when(s.getProperties()).thenReturn(new Properties());
有什么问题吗?我该嘲笑什么来加快进度?
1条答案
按热度按时间myzjeezk1#
首先修复人们在代码中使用JavaMail时最常犯的错误。
DNS查找可能会影响某些计算机的性能。对于JDK,您可以更改缓存DNS查找
networkaddress.cache.ttl
andnetworkaddress.cache.negative.ttl
的安全属性,或者设置系统属性sun.net.inetaddr.ttl
andsun.net.inetaddr.negative.ttl
。JDK 7和更高版本中的默认行为可以很好地进行缓存,因此您不必更改这些设置。您最好使用会话属性来避免这些查找。
1.添加
mail.from
ormail.host
的会话属性(这些确切的键名),因为任何一个属性都将阻止在InternetAddress.getLocalAddress(Session)
内部进行名称查找。这些属性可以在其对应属性(在键名中包含协议)的基础上设置,也可以单独设置这些属性将提高MimeMessage.saveChanges()
、MimeMessage.updateHeaders()
、MimeMessage.updateMessageID()
、和MimeMessage.setFrom()
,它们都调用InternetAddress::getLocalAddress
。如果未设置上述属性,则此方法将尝试查询主机名。通过设置属性,此方法将从会话中提取主机名字符串,而不是尝试代价高昂的DNS查找。1.设置
mail.smtp.localhost
ormail.smtps.localhost
的会话属性,以防止在传输过程中使用HELO命令查找名称。1.设置
mail.smtp.from
或mail.smtps.from
的会话属性,以防止查找传输上的EHLO命令。1.或者,如果您的代码依赖于
setFrom()
,则可以将系统属性mail.mime.address.usecanonicalhostname
设置为false
,但如果应用了第1点,则可以处理此问题。1.对于IMAP,您可以尝试将
mail.imap.sasl.usecanonicalhostname
ormail.imaps.sasl.usecanonicalhostname
设置为默认值false
。由于您不传输邮件,请将代码更改为以下内容以应用规则#1:
如果您正在传输邮件,则合并规则#1、#2和#3,这将阻止访问主机系统进行名称查找。如果您希望在传输期间阻止所有DNS查找,则必须使用IP地址。