Building E-mail messages in Rust
Using mail-builder is straightforward:
// Build a simple text message with a single attachment let mut message = MessageBuilder::new(); message.subject("Hello, world!"); message.text_body("Message contents go here."); message.binary_attachment("image/png", "image.png", &[1, 2, 3, 4]);
// Write message to memory let mut output = Vec::new(); message.write_to(&mut output).unwrap();More complex messages with grouped addresses, inline parts and multipart/alternative sections can also be easily built:
// Build a multipart message with text and HTML bodies, // inline parts and attachments. let mut message = MessageBuilder::new();
// To recipients message.to(vec![ ]);
// BCC recipients using grouped addresses message.bcc(vec![ ( "My Group", vec![ ], ), ( "Another Group", vec![ ], ), ]);
// Set RFC and custom headers message.subject("Testing multipart messages"); message.in_reply_to(vec!["message-id-1", "message-id-2"]); message.header("List-Archive", URL::new("http://example.com/archive"));
// Set HTML and plain text bodies message.text_body("This is the text body!\n"); message.html_body("<p>HTML body with <img src=\"cid:my-image\"/>!</p>");
// Include an embedded image as an inline part message.binary_inline("image/png", "cid:my-image", &[0, 1, 2, 3, 4, 5]);
// Add a text and a binary attachment message.text_attachment("text/plain", "my fíle.txt", "Attachment contents go here."); message.binary_attachment( "text/plain", "ハロー・ワールド", b"Binary contents go here.", );
// Write the message to a file message .write_to(File::create("message.eml").unwrap()) .unwrap();Nested MIME body structures can be created using the body method:
// Build a nested multipart message let mut message = MessageBuilder::new();
message.subject("Nested multipart message");
// Define the nested MIME body structure message.body(MimePart::new_multipart( "multipart/mixed", vec![ MimePart::new_text("Part A contents go here...").inline(), MimePart::new_multipart( "multipart/mixed", vec![ MimePart::new_multipart( "multipart/alternative", vec![ MimePart::new_multipart( "multipart/mixed", vec![ MimePart::new_text("Part B contents go here...").inline(), MimePart::new_binary( "image/jpeg", "Part C contents go here...".as_bytes(), ) .inline(), MimePart::new_text("Part D contents go here...").inline(), ], ), MimePart::new_multipart( "multipart/related", vec![ MimePart::new_html("Part E contents go here...").inline(), MimePart::new_binary( "image/jpeg", "Part F contents go here...".as_bytes(), ), ], ), ], ), MimePart::new_binary("image/jpeg", "Part G contents go here...".as_bytes()) .attachment("image_G.jpg"), MimePart::new_binary( "application/x-excel", "Part H contents go here...".as_bytes(), ), MimePart::new_binary( "x-message/rfc822", "Part J contents go here...".as_bytes(), ), ], ), MimePart::new_text("Part K contents go here...").inline(), ], ));
// Write the message to a file message .write_to(File::create("nested-message.eml").unwrap()) .unwrap();The library is available at https://crates.io/crates/mail-builder and the documentation at https://docs.rs/mail-builder.