📧 email

SMTP/IMAP Email Client - E-posta Gönderme and Alma

~450 lines ~30 function SMTP/IMAP

📖 Overview

Email modülü, SMTP and IMAP protokolleri ile e-posta gönderme and alma işlevleri sağlar. HTML içerik, dosya ekleri, SSL/TLS güvenliği and çoklu alıcı desteği sunar.

🔑 Key Features

🚀 Quick Start

import email

// Basit e-posta gönder
email.quick_send(
    smtp_server: "smtp.gmail.com",
    port: 587,
    username: "your-email@gmail.com",
    password: "your-password",
    from: "sender@example.com",
    to: "recipient@example.com",
    subject: "Test Email",
    body: "Hello, this is a test email!"
)?

io.println("E-posta gönderildi!")

📦 Email createma

// Email objesi create
let mail = email.new()

// Başlık bilgileri
mail.set_from("sender@example.com")
mail.add_to("recipient1@example.com")
mail.add_to("recipient2@example.com")
mail.add_cc("cc@example.com")
mail.add_bcc("bcc@example.com")
mail.set_subject("İş Toplantısı")

// İçerik
mail.set_text_body("Merhaba,\n\nToplantı 14:00'te başlayacak.")

// Dosya eki
mail.add_attachment("document.pdf", "path/to/document.pdf")?

💡 Example 1: HTML Email Gönderme

import email

function send_welcome_email(user_email: str, user_name: str) -> Result[None, Error] do
    // HTML içerik
    let html_body = "
        <html>
        <head>
            <style>
                body { font-family: Arial, sans-serif; }
                .header { background: #4CAF50; color: white; padding: 20px; }
                .content { padding: 20px; }
                .button { background: #008CBA; color: white; padding: 10px 20px;
                         text-decoration: none; border-radius: 5px; }
            </style>
        </head>
        <body>
            <div class='header'>
                <h1>Hoş Geldiniz, {}!</h1>
            </div>
            <div class='content'>
                <p>BERK platformuna katıldığınız for teşekkürler.</p>
                <p>Hesabınızı aktive etmek for aşağıdaki butona tıklayın:</p>
                <p>
                    <a href='https://example.com/activate' class='button'>
                        Hesabı Aktive Et
                    </a>
                </p>
            </div>
        </body>
        </html>
    ".formatla(user_name)
    
    // SMTP setup
    let smtp = email.smtp_new(do
        server: "smtp.gmail.com",
        port: 587,
        username: "noreply@example.com",
        password: "app-password",
        use_tls: true
    end)
    
    // Email create
    let mail = email.new()
    mail.set_from("noreply@example.com")
    mail.add_to(user_email)
    mail.set_subject("Hoş Geldiniz - Hesabınızı Aktive Edin")
    mail.set_html_body(html_body)
    
    // Alternative plain text
    mail.set_text_body("Hoş geldiniz! Hesabınızı aktive etmek for: https://example.com/activate")
    
    // Gönder
    smtp.send(mail)?
    smtp.disconnect()
    
    return Ok(None)
end

function main() do
    send_welcome_email("user@example.com", "Ahmet Yılmaz")?
    io.println("Hoş geldin e-postası gönderildi!")
end

💡 Example 2: Toplu Email Gönderme (Newsletter)

import email, fs, csv

function send_newsletter(subscribers_file: str, template_file: str) -> Result[int, Error] do
    // Email template oku
    let template = fs.read_to_string(template_file)?
    
    // SMTP bağlantısı
    let smtp = email.smtp_new(do
        server: "smtp.mailgun.org",
        port: 587,
        username: "postmaster@example.com",
        password: "mailgun-api-key",
        use_tls: true
    end)
    
    smtp.connect()?
    
    // Abone listesi oku
    let subscribers = csv.read_file(subscribers_file)?
    let sent_count = 0
    
    each subscriber in subscribers for do
        let email_addr = subscriber["email"]
        let name = subscriber["name"]
        
        // Template'i kişiselleştir
        let body = template
            .replace("{name}", name)
            .replace("{email}", email_addr)
        
        // Email gönder
        let mail = email.new()
        mail.set_from("newsletter@example.com")
        mail.add_to(email_addr)
        mail.set_subject("BERK v1.0.0 Yayınlandı! 🎉")
        mail.set_html_body(body)
        
        dene do
            smtp.send(mail)?
            sent_count += 1
            io.println("✓ Gönderildi: {}", email_addr)
        yakala e do
            io.eprintln("✗ Başarısız: {} - {}", email_addr, e)
        end
        
        // Rate limiting (saniyede 5 email)
        thread.sleep_ms(200)
    end
    
    smtp.disconnect()
    return Ok(sent_count)
end

function main() do
    match send_newsletter("subscribers.csv", "newsletter_template.html") do
        Ok(count) => io.println("Newsletter gönderildi: {} abone", count),
        Error(e) => io.eprintln("Error: {}", e)
    end
end

💡 Example 3: IMAP Email Okuma

import email

function check_new_orders() -> Result[Vector[Order], Error] do
    // IMAP bağlantısı
    let imap = email.imap_new(do
        server: "imap.gmail.com",
        port: 993,
        username: "orders@example.com",
        password: "app-password",
        use_ssl: true
    end)
    
    imap.connect()?
    
    // INBOX seç
    imap.select_folder("INBOX")?
    
    // Okunmamış mesajları getir
    let messages = imap.search("UNSEEN")?
    
    let orders = []
    
    each msg_id in messages for do
        let msg = imap.fetch_message(msg_id)?
        
        // Subject'te "Order #" var mı kontrol et
        if msg.subject.contains("Order #")  do
            // Email body'den sipariş detaylarını parse et
            let order = parse_order_email(msg)?
            orders.ekle(order)
            
            // Mesajı okundu işaretle
            imap.mark_read(msg_id)?
            
            // Siparişler klasörüne taşı
            imap.move_message(msg_id, "Orders")?
            
            io.println("Yeni sipariş: #{}", order.order_id)
        end
    end
    
    imap.disconnect()
    return Ok(orders)
end

struct Order do
    order_id: str,
    customer_email: str,
    total_amount: float,
    items: Vector[str]
end

function parse_order_email(msg: email.Message) -> Result[Order, Error] do
    // Email body'den sipariş bilgilerini parse et
    let body = msg.text_body
    
    // Basitleştirilmiş parsing örneği
    let order_id = regex.find(body, r"Order #(\d+)")?.group(1)
    let amount_str = regex.find(body, r"Total: \$([0-9.]+)")?.group(1)
    
    return Ok(Order do
        order_id: order_id,
        customer_email: msg.from,
        total_amount: amount_str.parse_float()?,
        items: []
    end)
end

function main() do
    // each 5 dakikada yeni siparişleri kontrol et
    loop do
        match check_new_orders() do
            Ok(orders) => do
                if orders.uzunluk() > 0  do
                    io.println("✓ {} yeni sipariş bulundu", orders.uzunluk())
                    // Process orders...
                end
            end,
            Error(e) => io.eprintln("Email kontrolü başarısız: {}", e)
        end
        
        thread.sleep(300_000)  // 5 dakika
    end
end

💡 Example 4: Otomatik Rapor Emaili (Attachment ile)

import email, time, fs

function generate_daily_report() -> Result[str, Error] do
    // Rapor create
    let report = "
        Günlük Sistem Raporu - {}
        ========================
        
        Sistem Durumu: ✓ Normal
        İşlem Sayısı: 1,234
        useıcı Sayısı: 567
        Error Sayısı: 3
        
        Detaylar for ek dosyaya bakınız.
    ".formatla(time.now().format("%Y-%m-%d"))
    
    // Raporu dosyaya kaydet
    let filename = "report_{}.txt".formatla(time.now().format("%Y%m%d"))
    fs.write(filename, report)?
    
    return Ok(filename)
end

function send_daily_report() -> Result[None, Error] do
    // Rapor create
    let report_file = generate_daily_report()?
    
    // Email hazırla
    let mail = email.new()
    mail.set_from("system@example.com")
    mail.add_to("admin@example.com")
    mail.add_to("manager@example.com")
    mail.set_subject("Günlük Sistem Raporu - {}", time.now().format("%Y-%m-%d"))
    
    let body = "
        Merhaba,
        
        Günlük sistem raporunu ekte bulabilirsiniz.
        
        Herhangi bir sorun for lütfen sistem ekibiyle iletişime geçiniz.
        
        İyi çalışmalar,
        Otomatik Rapor Sistemi
    "
    mail.set_text_body(body)
    
    // Raporu ek olarak ekle
    mail.add_attachment("daily_report.txt", report_file)?
    
    // CSV formatında detaylı log ekle
    mail.add_attachment("transaction_log.csv", "logs/transactions.csv")?
    
    // SMTP ile gönder
    email.quick_send_with_attachments(
        smtp_server: "smtp.office365.com",
        port: 587,
        username: "system@example.com",
        password: "system-password",
        mail: mail
    )?
    
    io.println("Günlük rapor emaili gönderildi")
    return Ok(None)
end

function main() do
    // each gün saat 09:00'da rapor gönder
    loop do
        let now = time.now()
        
        if now.hour() == 9 and now.minute() == 0  do
            send_daily_report()?
            thread.sleep(60_000)  // 1 dakika bekle (tekrar gönderme)
        end
        
        thread.sleep(30_000)  // 30 saniye
    end
end

⚙️ SMTP Konfigürasyonu

// Gmail
smtp_server: "smtp.gmail.com"
port: 587  // TLS
username: "your-email@gmail.com"
password: "app-specific-password"  // 2FA enabled accounts

// Outlook/Office365
smtp_server: "smtp.office365.com"
port: 587

// Yahoo
smtp_server: "smtp.mail.yahoo.com"
port: 587

// Custom SMTP
smtp_server: "mail.example.com"
port: 25   // Plain
port: 465  // SSL
port: 587  // TLS/STARTTLS

📬 IMAP Konfigürasyonu

// Gmail IMAP
imap_server: "imap.gmail.com"
port: 993  // SSL
use_ssl: true

// Outlook IMAP
imap_server: "outlook.office365.com"
port: 993

// Common IMAP Folders
"INBOX"      // Gelen kutusu
"Sent"       // Gönderilmiş
"Drafts"     // Taslaklar
"Trash"      // Çöp kutusu
"Spam"       // Spam

⚠️ Important Notes

🔗 Related Modules

← All Modules | Ana Sayfa