import yagmail import gradio as gr import os import time import smtplib # Get server configuration from environment variables with defaults SERVER_NAME = os.getenv("GRADIO_SERVER_NAME", "0.0.0.0") SERVER_PORT = int(os.getenv("GRADIO_SERVER_PORT", "7860")) SHARE_APP = os.getenv("GRADIO_SHARE", "false").lower() == "true" def execute(file_txt, user_mail, google_api_key, subject_text, content, attachments=None): # Validate inputs if not file_txt: raise gr.Error("Lütfen mail listesi dosyasını yükleyin") if not user_mail: raise gr.Error("Lütfen gönderen mail adresini girin") if not google_api_key: raise gr.Error("Lütfen Google API anahtarını girin") if not subject_text: raise gr.Error("Lütfen mail konusunu girin") if not content: raise gr.Error("Lütfen mail içeriğini girin") try: # Parse mail list mail_list = str(file_txt.decode("utf-8")).strip().split("\n") #print(mail_list) if mail_list[-1] == "": mail_list = mail_list[:-1] if not mail_list: raise gr.Error("Mail listesi boş") print(f"Mail listesi: {mail_list}") # Initialize yagmail with proper error handling try: yag = yagmail.SMTP(user_mail, google_api_key) except smtplib.SMTPAuthenticationError as e: error_msg = str(e) if "Username and Password not accepted" in error_msg: raise gr.Error(f"Gmail kimlik doğrulama hatası:\n\nKullanıcı adı veya şifre kabul edilmedi.\n\nLütfen şunları kontrol edin:\n1. Gmail adresinizin doğru olduğunu\n2. App Password kullandığınızı (normal şifre değil)\n3. 2-Factor Authentication'ın aktif olduğunu\n\nDetaylar: {error_msg}") else: raise gr.Error(f"SMTP kimlik doğrulama hatası:\n{error_msg}") except smtplib.SMTPException as e: raise gr.Error(f"SMTP bağlantı hatası:\n{str(e)}") except Exception as e: raise gr.Error(f"Mail servisi bağlantı hatası:\n{str(e)}") # Send emails successful_sends = 0 failed_sends = [] for i, mail in enumerate(mail_list): mail = mail.strip() if not mail: # Skip empty lines continue try: # Handle attachments if any if attachments: yag.send(mail, subject_text, content, attachments=attachments) else: yag.send(mail, subject_text, content) successful_sends += 1 print(f"Mail gönderildi: {mail}") time.sleep(0.2) # Rate limiting except Exception as e: failed_sends.append(f"{mail}: {str(e)}") print(f"Mail gönderilemedi {mail}: {str(e)}") # Close connection try: yag.close() except: pass # Ignore close errors # Prepare result message if failed_sends: error_details = "\n".join(failed_sends) if successful_sends > 0: raise gr.Warning(f"Kısmi başarı: {successful_sends} mail gönderildi, {len(failed_sends)} başarısız.\n\nBaşarısız mailler:\n{error_details}") else: raise gr.Error(f"Hiçbir mail gönderilemedi:\n{error_details}") else: return f"✅ Başarılı! {successful_sends} mail gönderildi." except gr.Error: # Re-raise Gradio errors raise except gr.Warning: # Re-raise Gradio warnings raise except Exception as e: # Catch any other unexpected errors raise gr.Error(f"Beklenmeyen hata:\n{str(e)}") with gr.Blocks() as demo: gr.Markdown('# Auto Mailing Tool') gr.Markdown('Gmail üzerinden toplu mail gönderme aracı') with gr.Row(): file_input = gr.File( label='Mail listesini yükle (her satırda bir mail adresi)', type='binary', file_types=['.txt'] ) with gr.Row(): user_mail = gr.Text( label='Gönderen Gmail adresi', placeholder='ornek@gmail.com', value=None ) google_api_key = gr.Text( label="Google App Password (16 haneli)", placeholder='abcd efgh ijkl mnop', type='password', value=None ) with gr.Row(): subject_text = gr.Text( label='Mail konusu', placeholder='Mail konunuzu buraya yazın', value="" ) with gr.Row(): content = gr.Textbox( label='Gönderilecek mail metni', placeholder='Mail içeriğinizi buraya yazın...', value="", lines=5 ) with gr.Row(): attachments = gr.File( label='Eklenecek dosyalar (birden fazla seçebilirsiniz)', file_count='multiple', file_types=['.pdf', '.doc', '.docx', '.txt', '.jpg', '.jpeg', '.png', '.zip'] ) with gr.Row(): create_button = gr.Button('📧 Mail Gönder', variant='primary') with gr.Row(): output = gr.Textbox(label='Sonuç', interactive=False) # Connect the button click to the function create_button.click( fn=execute, inputs=[file_input, user_mail, google_api_key, subject_text, content, attachments], outputs=output ) # Add helpful information gr.Markdown(""" ### 📋 Kullanım Talimatları: 1. **Gmail App Password alın**: Gmail hesabınızda 2-Factor Authentication aktif olmalı ve App Password oluşturmalısınız 2. **Mail listesi**: Her satırda bir mail adresi olan .txt dosyası yükleyin 3. **Gönderen adres**: Kendi Gmail adresinizi girin 4. **App Password**: Normal şifrenizi değil, App Password'u girin 5. **Konu ve içerik**: Mail konusu ve içeriğini doldurun ### ⚠️ Önemli Notlar: - Google App Password kullanmanız gerekiyor (normal şifre çalışmaz) - 2-Factor Authentication aktif olmalı - Günlük gönderim limitlerine dikkat edin - Daha fazla bilgi için https://support.google.com/accounts/answer/185833 """) donation_html = """
""" gr.HTML(donation_html) if __name__ == "__main__": demo.launch( server_name=SERVER_NAME, server_port=SERVER_PORT, share=SHARE_APP )