use oci_api::client::Oci;
use oci_api::services::email::{Email, EmailAddress, EmailDelivery, Recipients};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let _ = dotenvy::dotenv();
println!("Loading OCI configuration from environment variables...");
let oci_client = Oci::from_env()?;
let tenancy_id = oci_client.tenancy_id().to_string();
let compartment_id = std::env::var("OCI_COMPARTMENT_ID").unwrap_or_else(|_| tenancy_id.clone());
println!("Creating Email Delivery client...");
let email_client = EmailDelivery::new(oci_client).await?;
println!("Fetching approved senders...");
let senders = email_client
.list_senders(&compartment_id, Some("ACTIVE"), None)
.await?;
if senders.is_empty() {
eprintln!("❌ No approved senders found!");
eprintln!("Please configure an approved sender in your OCI compartment first.");
return Ok(());
}
let approved_sender = &senders[0];
println!("Using approved sender: {}", approved_sender.email_address);
let html_body = r#"
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
.header { background-color: #4CAF50; color: white; padding: 20px; text-align: center; }
.content { padding: 20px; }
.footer { background-color: #f1f1f1; padding: 10px; text-align: center; font-size: 12px; }
</style>
</head>
<body>
<div class="header">
<h1>Welcome to Our Newsletter!</h1>
</div>
<div class="content">
<p>Dear Subscriber,</p>
<p>Thank you for joining our newsletter. This is a sample HTML email sent using the <strong>OCI Email Delivery API</strong>.</p>
<p>We're excited to keep you updated with our latest news and updates!</p>
</div>
<div class="footer">
<p>© 2025 Example App. All rights reserved.</p>
<p>You can unsubscribe at any time.</p>
</div>
</body>
</html>
"#;
let text_body = r#"
Welcome to Our Newsletter!
Dear Subscriber,
Thank you for joining our newsletter. This is a sample HTML email sent using the OCI Email Delivery API.
We're excited to keep you updated with our latest news and updates!
---
© 2025 Example App. All rights reserved.
You can unsubscribe at any time.
"#;
let email = Email::builder()
.sender(EmailAddress::with_name(
&approved_sender.email_address,
"Example Newsletter",
))
.recipients(Recipients::to(vec![EmailAddress::new(
&approved_sender.email_address,
)]))
.subject("📧 Welcome to Our Newsletter!")
.body_html(html_body)
.body_text(text_body)
.build()?;
println!("Sending HTML email...");
match email_client.send(email).await {
Ok(response) => {
println!("✅ HTML email sent successfully!");
println!("Message ID: {}", response.message_id);
println!("Envelope ID: {}", response.envelope_id);
if let Some(suppressed) = response.suppressed_recipients {
if !suppressed.is_empty() {
println!("⚠️ Suppressed recipients:");
for recipient in suppressed {
println!(" - {}", recipient.email);
}
}
}
}
Err(e) => {
eprintln!("❌ Failed to send email: {}", e);
return Err(e.into());
}
}
Ok(())
}