Python'da Gmail Üzerinden E-posta Nasıl Gönderilir?

Yayınlanan: 2021-06-06

Çok sayıda e-postayı manuel olarak göndermek sıkıcı bir iştir. E-postaları tek seferde toplu olarak göndermek için üçüncü taraf hizmetlerini kullanabilirsiniz.

E-posta göndermek için kendi özelleştirilmiş komut dosyanızı oluşturmaya ne dersiniz?

harika değil mi?

Evet o. E-posta göndermek için Python'da bir komut dosyası yazacağız.

Python, e-posta göndermek için kullanılan smtplib adlı bir kitaplığa sahiptir. smtplib kitaplığı, SMTP'ye (Basit Posta Aktarım Protokolü) dayanmaktadır. SMTP, başkalarına e-posta göndermek için kullanılır.

Gmail'i kurun

Burada, Gmail'i bir e-posta sağlayıcısı olarak kullanacağız. Google, komut dosyalarının oturum açmasına izin vermez. Ayrıca, komut dosyalarının Gmail hesabımızda oturum açmasına izin veren Gmail hesabımızın güvenliğinde bir değişiklik yapmamız gerekiyor.

Gmail hesabımızdaki güvenlik seçeneğini değiştirmek, başkalarının hesaba çok kolay erişmesine izin verdiği için iyi değil. Yeni bir Gmail hesabı oluşturmanız önerilir. Buradaki ayarlara gidin ve Daha az güvenli uygulamalara izin ver: AÇIK ayarını açın.

Yukarıdaki ayarı açmak konusunda rahat değilseniz, Gmail hesabınızda oturum açmak için Google API'yi kullanabilirsiniz. Kimlik doğrulama için Google API'lerini kullanmak için komut dosyasını burada bulabilirsiniz.

Posta Gönderme Adımları

smtplib kütüphanesini kullanarak mail göndermek için belirli adımların yapılması gerekmektedir. Önce adımları görelim ve ardından scripti yazalım.

#1. SMTP sunucusuna bağlanma

Her servis sağlayıcının farklı bir SMTP sunucu alan adı ve bağlantı noktası olacaktır. Komut dosyasında kullanacağımız SMTP sunucu alan adını ve e-posta sağlayıcısının portunu kullanmalıyız. Gmail için SMTP sunucu alan adı ve bağlantı noktası smtp.gmail.com ve <em>465</em> .

TSL şifrelemesinden daha güvenli olduğu için SMTP sunucu bağlantısı için SSL şifrelemesini kullanacağız. TSL şifrelemesini kullanmak istiyorsanız, 465 yerine 587 bağlantı noktasını kullanın. SMTP sunucusu alan adı, e-posta servis sağlayıcısına bağlı olarak farklı olacaktır.

SMTP sunucusuna bağlanma kodu

 server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)

#2. Giriş yapmak

SMTP sunucusuna bağlantı kurulduğunda, login SMTP nesnesi yöntemi ile e-posta adresi ve şifreyi kullanarak giriş yapabiliriz. Kod aşağıdaki gibi görünüyor.

 server.login(sender_email, password)

#3. Posta göndermek

Giriş yaptıktan sonra, postayı göndermek için bekleyemeyiz. sendmail yöntemini kullanarak postayı gönderin. Postayı aşağıdaki biçimde gönderdiğinizden emin olun.

Konu: your_subject_for \newline mail_content

Boşluklar gerekli değildir. Bunlar sadece yukarıdaki formatta açıklama içindir. Örnek kodu görelim.

 server.sendmail(sender_mail, email, f"Subject: {subject}\n{content}")

#4. Çıkış yapmak

SMTP c'den çıkmayı unutmayın

Python kullanarak mail gönderme adımlarını gördük. Ancak, tam kodu tartışmadık. Hemen kodun üzerinden geçelim.

 import smtplib, ssl class Mail: def __init__(self): self.port = 465 self.smtp_server_domain_name = "smtp.gmail.com" self.sender_mail = "GMAIL_ADDRESS" self.password = "SECURE_PASSWORD" def send(self, emails, subject, content): ssl_context = ssl.create_default_context() service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context) service.login(self.sender_mail, self.password) for email in emails: result = service.sendmail(self.sender_mail, email, f"Subject: {subject}\n{content}") service.quit() if __name__ == '__main__': mails = input("Enter emails: ").split() subject = input("Enter subject: ") content = input("Enter content: ") mail = Mail() mail.send(mails, subject, content)

Mail adında bir sınıf oluşturduk. Ve mailleri göndermek için send adında bir metodu var. Ders yazmak ya da yazmamak size kalmış. Sınıf daha okunabilir hale getirir. Gönderme yönteminde yukarıda tartışılan tüm adımları tek tek uyguladık.

Yaşasın! Python betiğini kullanarak bir posta gönderdiniz.

HTML İçeriği

Postayı HTML olarak göndermek isterseniz ne olur? Bu mümkün mü?

Evet neden olmasın. E-postayı email.mime adlı kütüphaneyi HTML kullanarak gönderebiliriz. Yerleşik bir kitaplıktır.

MIME, e-postaların biçimini uygulama programlarını, videoları, resimleri vb. destekleyecek şekilde genişletmek için kullanılan bir standarttır.

email.mime modülünden ihtiyacımız olan iki sınıf var. Bunlar MIMEText ve MIMEMultipart . Onlar hakkında kısa bir açıklama görelim.

#1. MIMEText

MIMEText sınıfı, posta içeriğimizi HTML olarak yazmak için kullanılır. HTML içeriğini ve içerik türünü ileterek MIMEText sınıfının bir örneğini oluşturacağız. Aşağıdaki örnek koda bakın.

 html_content = MIMEText(html_template, 'html')

Bazı posta hizmetleri HTML oluşturmayı desteklemez. Bu nedenle, düz metin ve HTML için MIMEText sınıfının iki örneğini oluşturmak daha iyidir.

#2. MIMEçok parçalı

MIMEMultipart sınıfı adresinden, biçimlendirme ve yazı konusunu kolaylaştırmak için vs adrese Biz kullanarak MIMEMultipart için MIMEText sınıfıyla oluşturulan içerik verecektir kullanılır attach yöntemi.

MIMEMultipart örneğinin, düz metin veya HTML oluşturmak için alternative argümanla oluşturulduğundan emin olmamız gerekir. HTML içerikli bir mail gönderelim.

 import smtplib, ssl from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart class Mail: def __init__(self): ... def send(self, emails): ssl_context = ssl.create_default_context() service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context) service.login(self.sender_mail, self.password) for email in emails: mail = MIMEMultipart('alternative') mail['Subject'] = 'Geekflare Celebrations' mail['From'] = self.sender_mail mail['To'] = email text_template = """ Geekflare Hi {0}, We are delighted announce that our website hits 10 Million views this month. """ html_template = """ <h1>Geekflare</h1> <p>Hi {0},</p> <p>We are delighted announce that our website hits <b>10 Million</b> views last month.</p> """ html_content = MIMEText(html_template.format(email.split("@")[0]), 'html') text_content = MIMEText(text_template.format(email.split("@")[0]), 'plain') mail.attach(text_content) mail.attach(html_content) service.sendmail(self.sender_mail, email, mail.as_string()) service.quit() if __name__ == '__main__': mails = input("Enter emails: ").split() mail = Mail() mail.send(mails)

MIMEMultipart örneğinde bu Bcc özniteliğini kullanarak kör karbon kopya da ekleyebilirsiniz.

Ek Ekleme

Ekler vb yılında MIMEBase var denir görüntüleri, PDF, DOC, çarşaf, olabilir email.mime sınıfına. Postaya ek eklemek için kullanılır.

Yukarıdaki maile bir ek ekleyelim.

 import smtplib, ssl from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders from pathlib import Path class Mail: def __init__(self): ... def send(self, emails): ## login... for email in emails: ## MIMEMultipart instance ## text and html templates ## MIMEText instances ## attaching messages to MIMEMultipart ## attaching an attachment file_path = "Geekflare-logo.png" mimeBase = MIMEBase("application", "octet-stream") with open(file_path, "rb") as file: mimeBase.set_payload(file.read()) encoders.encode_base64(mimeBase) mimeBase.add_header("Content-Disposition", f"attachment; filename={Path(file_path).name}") mail.attach(mimeBase) ## sending mail service.quit() if __name__ == '__main__': mails = input("Enter emails: ").split() mail = Mail() mail.send(mails)

Tek Seferde Toplu Postalara Posta Gönderme

Aynı postayı birden çok üyeye göndermek için bir döngü kullandık. Bu bir durumdur (alıcıların diğer alıcılar hakkında bilgi sahibi olmasını istemediğinizde).

Aynı e-postayı aynı grubun 1000 üyesine aynı anda göndermeniz gerektiğini varsayalım. Bu gibi durumlarda bir döngü kullanmak uygun olmayacaktır. Genel posta oluşturmada Kime alanına birden fazla e-posta ekleyebiliriz. Python betiğinde nasıl yapılır?

E-posta listesini virgül ve boşlukla ayrılmış bir dize olarak birleştirmemiz gerekiyor. Biz bir dize olarak tüm e-postaları birleştirmek yöntemi dize katılmak kullanabilirsiniz. E-postaları bir dize olarak birleştirmek için koda bakın.

 ", ".join(emails)

Yukarıdaki dizeyi kullanarak yukarıdaki komut dosyasındaki Kime alanını değiştirin. İşte bu kadar, toplu maillere tek seferde mail gönderdiniz.

Çözüm

Python'da e-posta göndermek için bazı üçüncü taraf kitaplıkları vardır. Bunlardan bazıları Envelopes, Yagmail, Flanker, vb., Bu kütüphaneler birkaç satır kod ile scriptler yazmamıza yardımcı olur. Onları da keşfedebilirsiniz.

Artık Python komut dosyalarını kullanarak e-posta öğelerinizi otomatikleştirebilirsiniz. E-posta gönderme yapısı, kullanım durumunuza göre farklı olacaktır. E-posta göndermenin farklı senaryolarını gördük. Öğreticide tartışılan komut dosyalarını kullanım durumunuza göre kolayca özelleştirebilirsiniz. Referansı bu makaleden aldım.

mutlu kodlama