guicedee-mail-client

Annotation-driven SMTP mail client for GuicedEE with Vert.x 5: @MailConnectionOptions for SMTP server configuration, MailService injection for sending text/HTML/multipart emails with attachments, connection pooling, StartTLS/SSL support, DKIM signing, environment variable overrides, and graceful shutdown. Use when sending emails via SMTP, configuring mail connections, or injecting mail services.

5 stars

Best use case

guicedee-mail-client is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Annotation-driven SMTP mail client for GuicedEE with Vert.x 5: @MailConnectionOptions for SMTP server configuration, MailService injection for sending text/HTML/multipart emails with attachments, connection pooling, StartTLS/SSL support, DKIM signing, environment variable overrides, and graceful shutdown. Use when sending emails via SMTP, configuring mail connections, or injecting mail services.

Teams using guicedee-mail-client should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/guicedee-mail-client/SKILL.md --create-dirs "https://raw.githubusercontent.com/GuicedEE/ai-rules/main/skills/.system/guicedee-mail-client/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/guicedee-mail-client/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How guicedee-mail-client Compares

Feature / Agentguicedee-mail-clientStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Annotation-driven SMTP mail client for GuicedEE with Vert.x 5: @MailConnectionOptions for SMTP server configuration, MailService injection for sending text/HTML/multipart emails with attachments, connection pooling, StartTLS/SSL support, DKIM signing, environment variable overrides, and graceful shutdown. Use when sending emails via SMTP, configuring mail connections, or injecting mail services.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# GuicedEE Mail Client

Annotation-driven SMTP mail client for GuicedEE using the Vert.x Mail Client.

## Core Concept

Declare SMTP connections with annotations — everything is discovered at startup via ClassGraph, wired through Guice, and managed by the Vert.x Mail Client with connection pooling.

## Required Flow

1. Add `com.guicedee:mail-client` dependency.
2. Define a connection on `package-info.java` (preferred) or any class:
   ```java
   @MailConnectionOptions(
       value = "notifications",
       hostname = "smtp.example.com",
       port = 587,
       startTls = MailConnectionOptions.StartTLSMode.REQUIRED,
       login = MailConnectionOptions.LoginMode.REQUIRED,
       username = "user@example.com",
       password = "secret",
       defaultFrom = "noreply@example.com"
   )
   package com.example.mail;
   ```
3. Inject and send:
   ```java
   public class NotificationService {
       @Inject @Named("notifications")
       private MailService mailService;

       public void sendWelcome(String to) {
           mailService.sendHtml(to, "Welcome!", "<h1>Welcome aboard!</h1>");
       }
   }
   ```
4. Or use full MailMessage for attachments:
   ```java
   MailMessage message = new MailMessage()
       .setTo("user@example.com")
       .setSubject("Report")
       .setText("See attached.")
       .setAttachment(List.of(
           MailAttachment.create()
               .setContentType("application/pdf")
               .setName("report.pdf")
               .setData(Buffer.buffer(pdfBytes))
       ));
   mailService.send(message);
   ```
5. Configure `module-info.java`:
   ```java
   module my.app {
       requires com.guicedee.mailclient;
       opens my.app.mail to com.google.guice, com.guicedee.mailclient;
   }
   ```

## Annotations

### `@MailConnectionOptions`
SMTP connection configuration: hostname, port, StartTLS, SSL, login credentials, connection pooling, DKIM, keep-alive, default from address. Targets `TYPE` and `PACKAGE`.

## Injectable Components

| Binding | Key | Description |
|---|---|---|
| `MailService` | `@Named("connection-name")` | High-level mail service with convenience send methods |
| `MailClient` | `@Named("connection-name")` | Raw Vert.x mail client per connection |

## Environment Variable Overrides

Every annotation attribute can be overridden via system properties or environment variables at runtime, scoped by connection name:
- `MAIL_{NORMALIZED_NAME}_{PROPERTY}` — name-specific override
- `MAIL_{PROPERTY}` — global fallback

Examples:
- `MAIL_NOTIFICATIONS_HOSTNAME=smtp.prod.example.com`
- `MAIL_NOTIFICATIONS_USERNAME=prod-user`
- `MAIL_NOTIFICATIONS_PASSWORD=prod-secret`
- `MAIL_PORT=465` (global fallback)

## Startup Flow

```
IGuiceContext.instance().inject()
 └─ MailClientPreStartup (annotation scanning)
     ├─ Discovers @MailConnectionOptions (classes and package-info.java)
     └─ Wraps with environment variable resolution
 └─ MailClientModule (Guice bindings)
     ├─ Creates shared MailClient per connection (pooled)
     ├─ Binds MailClient as @Named("connection-name")
     └─ Binds MailService as @Named("connection-name") singleton
 └─ MailClientPostStartup (initialization logging)
 └─ MailClientPreDestroy (shutdown)
     └─ Closes all mail clients
```

## MailService Methods

| Method | Description |
|---|---|
| `send(MailMessage)` | Send a pre-built message (auto-fills from if defaultFrom set) |
| `sendText(to, subject, text)` | Send plain text using default from |
| `sendText(from, to, subject, text)` | Send plain text with explicit from |
| `sendHtml(to, subject, html)` | Send HTML using default from |
| `sendHtml(from, to, subject, html)` | Send HTML with explicit from |
| `sendMultipart(from, to, subject, text, html)` | Send multipart (text + HTML) |
| `getMailClient()` | Access underlying Vert.x MailClient |

## Non-Negotiable Constraints

- Module must `requires com.guicedee.mailclient;`.
- Packages using injection must `opens` to `com.google.guice` and `com.guicedee.mailclient`.
- `@MailConnectionOptions` can be placed on `package-info.java` (preferred) or any class.
- SPI implementations must be dual-registered (`module-info.java` + `META-INF/services/`).

Related Skills

jwebmp-tsclient

5
from GuicedEE/ai-rules

TypeScript client generation for JWebMP plugins. Provides annotations and utilities for generating TypeScript interfaces, components, services, and modules from Java code. Supports @TsDependency, @TsDevDependency, @NgComponent, @NgDataService, @NgRestClient annotations. Use when creating JWebMP plugins that generate TypeScript code, defining npm dependencies, building Angular-integrated components, or generating typed Angular REST client services.

jwebmp-client

5
from GuicedEE/ai-rules

Client SPI library for JWebMP — defines AJAX pipeline contracts (AjaxCall/AjaxResponse), page contracts (IPage/IPageConfigurator), component model interfaces, and interceptor SPIs. Use when working with JWebMP client interfaces, AJAX interception, page configuration SPIs, component model interfaces, or extending JWebMP with custom interceptors and configurators.

guicedee-websockets

5
from GuicedEE/ai-rules

RFC 6455 WebSocket support for GuicedEE using Vert.x 5: call-scoped connections, action-based message routing via IWebSocketMessageReceiver SPI, group management and broadcasting, WebSocketServerOptions, and lifecycle hooks. Use when adding WebSocket messaging, implementing real-time communication, managing WebSocket groups, or creating message receivers.

guicedee-webservices

5
from GuicedEE/ai-rules

SOAP web services for GuicedEE using Apache CXF conventions: JAX-WS annotations (@WebService, @WebMethod, @WebParam, @WebResult), code-first and WSDL-first approaches, endpoint publishing, CXF interceptors and logging, MTOM, WS-Security (WSS4J), SOAP 1.1/1.2 bindings, and Guice DI integration. Use when creating SOAP services, publishing JAX-WS endpoints, configuring CXF bindings, or adding WS-Security.

guicedee-web

5
from GuicedEE/ai-rules

Bootstrap reactive HTTP/HTTPS servers with Vert.x 5 inside GuicedEE: Router setup, BodyHandler configuration, TLS/HTTPS, SPI extension points (VertxRouterConfigurator, VertxHttpServerOptionsConfigurator, VertxHttpServerConfigurator), per-verticle sub-routers, and environment-driven configuration. Use when setting up the Vert.x web server, configuring HTTP/HTTPS, adding custom routes or middleware, or managing server options.

guicedee-vertx

5
from GuicedEE/ai-rules

Build reactive services using Vert.x 5 inside the GuicedEE DI lifecycle: event-bus consumers, publishers, verticle deployment, codecs, throttling, clustering, SPI hooks, and JPMS module setup. Use when adding Vert.x event-bus messaging, deploying verticles, wiring reactive endpoints with Guice injection, configuring Vert.x runtime options, or implementing custom codecs and cluster managers.

guicedee-service-registry

5
from GuicedEE/ai-rules

Named service registry with health-aware resolution for GuicedEE. Register services by simple name, auto-construct URLs from cloud DNS suffix, monitor health status, resolve services via registry:name prefix or bare name in rest-client @Endpoint. Supports aliases, multiple external URLs, Kubernetes internal URLs, and per-service health paths. Use when registering named services, checking service health, resolving service URLs by name, or integrating with rest-client for service-to-service calls.

guicedee-rest

5
from GuicedEE/ai-rules

Build Jakarta REST (JAX-RS) services on Vert.x 5 inside GuicedEE: @Path/@GET/@POST route registration, parameter binding (@PathParam, @QueryParam, @HeaderParam, etc.), Guice-managed resource classes, response handling, content negotiation, and JPMS module setup. Use when creating REST endpoints, configuring Jakarta REST resources, or wiring JAX-RS services with Guice injection.

guicedee-rest-client

5
from GuicedEE/ai-rules

Annotation-driven REST client for GuicedEE using Vert.x 5 WebClient: @Endpoint declarations, RestClient<Send, Receive> injection, authentication strategies (Bearer, Basic, API Key, OAuth2, mTLS), path parameters, environment variable overrides, package-level endpoints, service registry integration (bare name or registry: prefix), and RestClientConfigurator SPI. Use when making outbound REST calls, configuring REST client endpoints, or wiring reactive HTTP clients with Guice injection.

guicedee-rabbitmq

5
from GuicedEE/ai-rules

Annotation-driven RabbitMQ integration for GuicedEE with Vert.x 5: @RabbitConnectionOptions, @QueueExchange, @QueueDefinition, QueueConsumer/QueuePublisher injection, exchange management, queue options (priority, TTL, prefetch), publisher confirms, environment variable overrides, and verticle-scoped connections. Use when adding RabbitMQ messaging, declaring exchanges and queues, creating consumers and publishers, or configuring AMQP topology.

guicedee-persistence

5
from GuicedEE/ai-rules

Reactive JPA persistence with Hibernate Reactive 7, Vert.x 5 SQL clients, and Mutiny sessions inside GuicedEE: DatabaseModule setup, persistence.xml configuration, multi-database support, @EntityManager scoping, and environment variable resolution. Use when adding database persistence, configuring Hibernate Reactive, creating DatabaseModule subclasses, wiring Mutiny.SessionFactory, or managing multiple persistence units.

guicedee-openapi

5
from GuicedEE/ai-rules

Automatic OpenAPI 3.1 spec generation and serving for GuicedEE with Vert.x 5: scans Jakarta REST resources at startup, serves /openapi.json and /openapi.yaml endpoints, Swagger annotations support, @OpenAPIDefinition configuration, and companion Swagger UI module. Use when generating API documentation, serving OpenAPI specs, or configuring Swagger annotations on REST resources.