A command-line tool written in Go that helps you create email recipient lists in BCC format from CSV files.
BCCify imports contact data from CSV files and allows you to filter recipients based on custom criteria. It's designed to help you quickly generate BCC recipient lists for bulk email sending.
- CSV Import: Load contacts from CSV files with support for headers
- Flexible Filtering: Filter recipients using custom filter functions
- Recipient Formatting: Automatically formats contacts as
"Name" <email@example.com> - Multiple Export Formats:
- MailTo Export (default): Opens your default email client with recipients in BCC field
- StdOut Export: Outputs recipients to stdout for manual copying
- Multi-Email Support: Handles contacts with multiple email addresses separated by semicolons
go install github.com/codeneuss/bccify@latestOr clone and build from source:
git clone https://github.com/codeneuss/bccify.git
cd bccify
go buildRun BCCify by providing a CSV file as an argument:
bccify contacts.csvYour CSV file should include headers in the first row. For example:
name,emailaddress
John Doe,john@example.com
Jane Smith,jane@example.com
Jack Wilson,jack@example.comBy default, BCCify opens your default email client with all recipients pre-filled in the BCC field:
bccify contacts.csvThis creates a mailto link and opens it in your system's default email application with all contacts ready to send.
bccify/
├── cmd/
│ └── main.go # Application entry point
├── bccify.go # Core BCCify logic and converter
├── importer/
│ ├── importer.go # Importer interface definition
│ └── csv.go # CSV importer implementation
├── models/
│ ├── recipient.go # Recipient model
│ └── recipients.go # Recipients collection and methods
├── exporter/
│ ├── exporter.go # Exporter interface definition
│ ├── mailto.go # MailTo exporter implementation (opens email client)
│ └── stdout.go # Stdout exporter implementation
└── README.md
The Importer interface defines the contract for data importers:
type Importer interface {
Import() error
Filter(func(Record) bool) Records
FilterColumns() []string
}The Exporter interface defines the contract for data exporters:
type Exporter interface {
Export() error
}Recipient: Represents a single email recipient with name and email address.
Recipients: A collection of recipients formatted as strings (Name <email@example.com>).
// Import from CSV
importer := &importer.CSVImporter{
Filename: "contacts.csv",
HasHeaders: true,
}
err := importer.Import()
// Get all records (or filter them)
records := importer.Filter(nil)
// Convert to recipients
converter := RecipientConverter{Records: records}
converter.Convert()
// Export using MailTo (opens email client)
exporter := exporter.MailToExporter{Recipients: converter.Recipents}
exporter.Export()
// Or export to stdout
stdoutExporter := exporter.StdOutExporter{Recipients: converter.Recipents}
stdoutExporter.Export()- Go 1.25.5 or later
go buildgo test ./...Contributions are welcome! Please feel free to submit a Pull Request.
This project is open source and available under the MIT License.
- Import: BCCify reads your CSV file and parses the contacts
- Convert: Contacts are converted to the proper email format:
"Name" <email@example.com> - Export: By default, creates a mailto URL with all recipients in the BCC field and opens your default email client
BCCify currently supports two export methods:
- MailToExporter (default): Generates a mailto link and opens it using the system's
opencommand (macOS/Linux) - StdOutExporter: Prints the recipient list to stdout, semicolon-separated
Future improvements planned:
- Support for additional import formats (Excel, vCard)
- Cross-platform support for mailto export (Windows compatibility)
- Interactive CLI for building custom filters
- Email validation and deduplication
- Custom column mapping configuration
- Command-line flags to choose export format