Reset stale hasAttachments on sync and accumulate correctly
- Reset has_attachments=false at start of bulk sync so stale true values from old false-positive MIME detection are cleared before re-indexing - Accumulate ha...
Send에 지원 fromAddress override
Adds FromAddressRequest to EmailSendRequest 그래서 프론트엔드를 지정할 수 있습니다. alias/shared/mailbox 주소로 전송합니다. SmtpOnlyProvider 지금 헤더의 주소는 현재가 떨어지면 공급자 설정하지 않을 때 이메일.
Fix attachment parsing and hasAttachment false positives
Three fixes to EmailImapService: 1. toEnvelope: narrow multipart check to multipart/mixed only — plain HTML+text emails (multipart/alternative) no longer sh...
Add com.kamo.z.shared.commerce to EnableJpaRepositories scan
**************** (required by **************** in the shared library) lives under com.kamo.z.shared.commerce but was not included in the JPA repository scan, ca...
Correct field name and type in getFromAddresses response
Backend was sending 'email' key but frontend expected 'address', and sent type 'shared_mailbox' when frontend expected 'shared'. Also fixes hasMailboxes flag wh...
이메일 provider domains 기본 설정이 없는 경우 org domains로 돌아가기
KamoMailDomainValidator는 403 의 orgs에 대 한 어려운 실패 org domains의 DNS 인증 도메인은 아니지만 이메일에 추가하지 않습니다. 공급자 도메인 등록. 첫 번째 활성을 사용하는 fallback을 추가하십시오. DNS 인증, 최고 수준의 org dom...
상태 필터 및 목록에 자동 입력된 필수 템플릿
- EmailTemplateController.list()는 이제 ?status= param 및 필터를 허용합니다. 기존 findByOrgIdAndStatus 저장소 쿼리 사용 - 초기 묘목을 놓은 orgs에 대한 Auto-seeds 필수 템플릿 (seedForOrgIfMisssing ...
Preview uses same auto-vars as sendToUser (org logo + name)
The preview endpoint now injects logoUrl, logoSimpleUrl, and orgName from the org's domain before applying sample content variables, matching the exact variable...
Update EMAIL_VERIFICATION sample vars to match current template
Use expiryText instead of expiryMinutes (renamed variable), and update verifyLink to point to the register subdomain (correct send path).
Preserve DB domain case in NoReply from address
Removed toLowerCase() — the domain already comes from resolvePrimaryDomain which reads org_domains from the database, so case is canonical from DB.
Resolve root domain for NoReply from-address instead of bare subdomain
resolvePrimaryDomain() was returning the first domain entry (e.g. "www") which produced NoReply@www. Now prefers root domains (parent == null) so transactional ...
Add internal.auth.secret to EmailService configmap
InternalAuthFilter was rejecting all service-to-service calls (send, seed-org) with 503 because internal.auth.secret was unconfigured. Matches the same INTERNAL...
Allow transactional send on port-25 relay and auto-seed missing templates
Port-25 SMTP (postfix) requires no auth — transactionalCredentials() was throwing ProviderUnavailableException when user/pass were unconfigured, blocking all ve...
Add dao.repositories to JPA scan so EmailTemplateRepository is found
Same pattern as KamoInitializerService — explicit basePackages overrides default scanning and must include every package that has repositories.
MailboxId→id와 공급자Status→status를 우편함 명부 응답에 지명하십시오
Align 필드 이름 회원 mailbox 목록에 대한 기대.
Support mailbox switching by resolving IMAP credentials per mailboxId
Added getMailCredentialsByEmail to look up virtual_users by email directly, resolveForMailbox to MailProviderResolver with access verification, and optional mai...
Rename DomainService to EmailDomainService to resolve bean name conflict
The shared library's DomainService and EmailService's local DomainService both registered as 'domainService' bean, causing CrashLoopBackOff on deploy.
Correct method signatures in DomainController and MailboxController
- Fix getMemberMailboxes -> getMailboxesForMember in MailboxController - Add missing memberId parameter to getVerificationRecords and verifyDomain in DomainCont...
Extract BCC recipients from IMAP messages
BCC header is retained on sent folder copies. Now extracted alongside To and CC so the frontend can display it in sent item previews.
Provider GET returns both type and providerType, PUT accepts both
GET /api/email/provider now includes both 'type' and 'providerType' fields in the response for frontend compatibility. PUT now accepts 'type' as a fallback when...
Update calendar, contact, and integration ID types from Long to UUID
Calendar entities, contact sub-entities, and ContactIntegration IDs are now UUID. Updates all services, controllers, and DAV endpoints.
Add security-service.*** to K8s ConfigMap
KamoJwtService requires this property for Bearer token validation in DavAuthFilter, but the K8s ConfigMap overrides application.yml and was missing it — causing...
중복 JPA 재포 검사 제거 - 부모 패키지 만 사용
com.kamo.z.shared.email은 metadata.repos를 커버하고, 두 가지를 스캔 BeanDefinitionOverride메시지LabelRepository.
Add rspamd config to K8s ConfigMap and set ddl-auto to none
The rspamd.base-url property was missing from the production ConfigMap, causing CrashLoopBackOff on deploy. Also corrects dev ddl-auto to none.
Remove hardcoded WebSocket headers from email middleware
Traefik v3 handles WebSocket Upgrade/Connection headers natively. Hardcoding them broke SockJS fallback transports (xhr-streaming, xhr-polling). Now matches med...
Use @Value for RspamdConfig and make training non-blocking
RspamdConfig now uses @Value to match existing project patterns. Rspamd training failures no longer prevent the message from being moved.
Save copy to Sent folder after sending email
Transport.send() only sends via SMTP without saving to IMAP. Added saveToSent() to append the message to the Sent folder with the SEEN flag set. Applies to send...
Disable STARTTLS and auth for port 25 internal SMTP
Port 25 on internal Postfix doesn't support STARTTLS and allows relay from cluster IPs via mynetworks. Only enable auth and STARTTLS when using port 587 (submis...
Use SMTP port 25 instead of 587 for internal Postfix
Postfix only listens on port 25 inside the cluster. Port 587 (submission) is not enabled in the container.
Change ddl-auto from none to update for auto schema management
Hibernate was not creating the email_metadata schema and conversations table because ddl-auto was set to none in the k8s configmap.
Use native query for PostgreSQL text[] column in ConversationRepository
MEMBER OF is not supported by Hibernate for @JdbcTypeCode(ARRAY) fields. Switch to native SQL with ANY() for folder_ids array lookup.
Use StringRedisTemplate to read OTK/session values stored as plain strings
The Next.js app stores OTK and *** values as plain strings in Redis. The default RedisTemplate uses JSON serializer which fails to parse them.