package com.mailserver.config; import com.mailserver.security.LoginGuard; import com.mailserver.imap.DbImapStore; import com.mailserver.imap.ImapServer; import com.mailserver.imap.ImapStore; import com.mailserver.repository.AttachmentRepository; import com.mailserver.repository.MessageRepository; import com.mailserver.repository.UserRepository; import com.mailserver.service.MailService; import com.mailserver.service.MessageSources; import com.mailserver.service.UserService; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.util.unit.DataSize; import java.time.Duration; /** IMAP (75.2): STARTTLS on mailserver.imap.port, implicit TLS on mailserver.imaps.port when set. */ @Configuration public class ImapConfig { @Bean public ImapStore imapStore(DatabaseClient db, UserRepository users, UserService userService, MailService mailService, MessageRepository messages, AttachmentRepository attachments, MessageSources sources, @Value("${mailserver.smtp.hostname:localhost}") String hostname) { return new DbImapStore(db, users, userService, mailService, messages, attachments, sources, hostname); } @Bean(initMethod = "start", destroyMethod = "stop") @ConditionalOnProperty(name = "mailserver.imap.enabled", havingValue = "true", matchIfMissing = true) public ImapServer imapServer(ImapStore store, MailServerConfig.SmtpTlsContext tls, LoginGuard guard, @Value("${mailserver.imap.host:0.0.0.0}") String host, @Value("${mailserver.imap.port:3143}") int port, @Value("${mailserver.smtp.hostname:localhost}") String hostname, @Value("${mailserver.imap.auth-without-tls:false}") boolean authWithoutTls, @Value("${mailserver.imap.max-literal:50MB}") DataSize maxLiteral, @Value("${mailserver.imap.idle-timeout:30m}") Duration idleTimeout, @Value("${mailserver.imap.idle-poll:5s}") Duration idlePoll) { return new ImapServer(new ImapServer.Settings(host, port, hostname, authWithoutTls, tls.context(), false, (int) maxLiteral.toBytes(), idleTimeout, idlePoll), store, guard); } @Bean(initMethod = "start", destroyMethod = "stop") @ConditionalOnExpression("'${mailserver.imap.enabled:true}' == 'true' and ${mailserver.imaps.port:0} > 0 and ${mailserver.tls.enabled:true}") public ImapServer imapsServer(ImapStore store, MailServerConfig.SmtpTlsContext tls, LoginGuard guard, @Value("${mailserver.imap.host:0.0.0.0}") String host, @Value("${mailserver.imaps.port}") int port, @Value("${mailserver.smtp.hostname:localhost}") String hostname, @Value("${mailserver.imap.max-literal:50MB}") DataSize maxLiteral, @Value("${mailserver.imap.idle-timeout:30m}") Duration idleTimeout, @Value("${mailserver.imap.idle-poll:5s}") Duration idlePoll) { return new ImapServer(new ImapServer.Settings(host, port, hostname, false, tls.context(), true, (int) maxLiteral.toBytes(), idleTimeout, idlePoll), store, guard); } }