我有一个正在运行的 Apache James 邮件服务器,但只是将其转换为使用 MySQL 数据库而不是文件系统。
它创建了(一些)表,但不会写入它们。这使得它无法发送任何邮件。
由于它将与数据库交互并插入用户,我想我已经正确配置了数据库数据源和用户...
<data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource">
<driver>com.mysql.jdbc.Driver</driver>
<dburl>jdbc:mysql://127.0.0.1/james</dburl>
<user>xxxx</user>
<password>yyyy</password>
<max>20</max>
</data-source>
但是当我尝试发送电子邮件时,我没有从客户端收到任何错误,但我在数据库中的任何表中都没有收到任何错误。 我在詹姆斯控制台上得到的只是这个错误......
exception! javax.mail.MessagingException: Exception caught while storing mail Container: ;
nested exception is:
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '' for column 'last_updated' at row 1
这是邮件日志中的完整堆栈跟踪...
10/12/14 16:23:18 INFO James.Mailet: Error while storing mail.
javax.mail.MessagingException: Exception caught while storing mail Container: ;
nested exception is:
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '' for column 'last_updated' at row 1
at org.apache.james.mailrepository.JDBCMailRepository.store(JDBCMailRepository.java:764)
at org.apache.james.transport.mailets.ToMultiRepository.storeMail(ToMultiRepository.java:230)
at org.apache.james.transport.mailets.ToMultiRepository.service(ToMultiRepository.java:154)
at org.apache.james.transport.mailets.LocalDelivery.service(LocalDelivery.java:66)
at org.apache.james.transport.LinearProcessor.service(LinearProcessor.java:424)
at org.apache.james.transport.JamesSpoolManager.process(JamesSpoolManager.java:405)
at org.apache.james.transport.JamesSpoolManager.run(JamesSpoolManager.java:309)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '' for column 'last_updated' at row 1
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2973)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1600)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1129)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:681)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:803)
at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:168)
at org.apache.james.mailrepository.JDBCMailRepository.store(JDBCMailRepository.java:752)
10/12/14 16:23:18 INFO James.Mailet: ToRepository: Storing mail Mail1418257398530-1 in dbfile://maildb/deadletter/error
这是我指定存储库的方式...
<mailet match="All" class="ToRepository">
<repositoryPath> db://maildb/deadletter/error </repositoryPath>
</mailet>
因为它似乎在提示一个空的last_updated日期时间,所以我允许该列为空,但这没有帮助。 我不会以任何方式改变java,所以不应该有任何我搞砸的事情。我什至不知道它从哪里获取日期时间。
有人能看到我错过的东西吗?
最佳答案
已解决:我在 Apache bug 文件中发现了一篇不起眼的帖子,其中提到添加此参数...
<dburl>jdbc:mysql://127.0.0.1/james?useServerPrepStmts=false</dburl>
...到数据源区域。其实帖子说这里加2个parm,但是我发现它只接受1个parm。
我不知道我应该如何了解这些参数或它们的作用,但这让一切都神奇地发挥作用。有时,使用开源软件可以让您更多地了解研究而不是编程。
关于java - Apache James 2.3.2 不会写入 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27413645/