Как я могу сделать функцию, которая отправляет несколько электронных писем на адреса, которые я определил в файле? - PullRequest
0 голосов
/ 09 апреля 2020

Я создаю отправителя нескольких электронных писем, однако я не могу найти способ реализовать функцию send_emails, которая просматривает 'for', список адресов, которые я написал в txt, и в то же время Позвольте мне отправлять электронные письма на один адрес, я очень благодарен за помощь.

PS: Если бы вы мне объяснили, я был бы признателен. спасибо

import smtplib
from io import open

def sedns_emails(sender):
    file = open('emails.txt','r')
    read = file.readlines()
    file.close()

    for line in read:
        server.sendmail("Example@gmail.com",sender, Message)
        server.quit()
        print("send emails")        



addressee = input("For: ") 
subject = input("Subject: ")
message = input("Message: ")

Message = "Subject: {}\n\n{}\n\n{}".format(subject, message)

server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login("Example@gmail.com", passw)


server.sendmail("Example@gmail.com", addressee, Message)
server.quit()
print("mail successfully sent")

1 Ответ

0 голосов
/ 19 апреля 2020

То, что вы можете использовать, - это сообщение MIMEMultipart в качестве объекта, а затем отправить этот объект в качестве электронной почты.

Для этого вам нужно будет импортировать следующее:

import smtplib
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 

Далее вам необходимо определить учетные данные, которые будут использоваться вашим сценарием для доступа к электронной почте отправителя. Обратите внимание, что вы не должны жестко кодировать свой пароль в скрипте, в целях безопасности вы должны хранить его в переменной среды, но для демонстрации я жестко закодировал учетные данные.

me = 'YourEmail@mail.com'
my_pass = '*******'

Теперь вы ' Вы готовы открыть файл .txt, содержащий получателей.

emails_file = open('email_addr.txt', 'r')
email_addr = emails_file.read()

Убедитесь, что электронные письма хранятся в следующем формате:

first@mail.com,second@mail.com,third@mail.com...

Вы можете хранить их в другом формате в вашем файле .txt, но вышеизложенное - это то, что собирается принять наше сообщение MIMEMultipart, поэтому просто убедитесь, что это тот формат, который вы переходите к нему.

Как только вы определите свои учетные данные для входа и загрузите получателей из вашего .txt файла, вы можете определить функцию для отправки электронных писем. Мы импортировали MIMEMultipart, и теперь пришло время его использовать.

def sendMail():

    msg = MIMEMultipart()
    msg['Subject'] = 'Hello, this is my test subject!' 
    msg['From'] = me
    msg['To'] = email_addr

msg становится объектом MIMEMultipart и будет хранить информацию для вашего субъекта, от кого получено электронное письмо и кому оно предназначено. Как только это будет определено, вы можете прикрепить тело вашего письма из .txt файла.

    message_file = open('my_message.txt', 'r')
    the_message = MIMEText(message_file.read())
    msg.attach(the_message)

Следующий фрагмент кода будет использовать «ehlo» для идентификации себя на сервере ESMTP, а затем будет использовать «starttls» для установки SMTP-соединения в TLS (Transport Layer Security) mode.

    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()

Последний фрагмент кода позволяет сценарию «войти» в сообщение электронной почты отправителя с использованием ранее определенных учетных данных и затем отправить сообщение.

    s.login(me, my_pass)

    s.send_message(msg, None, None)
    s.quit()
    emails_file.close()

Осталось только вызвать функцию

sendMail()

Обратите внимание:

s.send_message (msg, None, None)

Обычно имеет формат (msg, from_addr, to_addr), но это работает странным образом: msg ['To'] принимает строку в качестве параметра, а s.send_message принимает список ( если я не ошибаюсь). В документации говорится, что

Если from_addr равен None или to_addrs равен None, send_message заполняет эти аргументы адресами, извлеченными из заголовков msg, как указано в RF C 5322

Поэтому я решил установить для from_addr и to_addr значение None, чтобы я мог просто передать строку с несколькими адресами в части кода msg [To].

Вот окончательный код:

#--- Simple mail transfer protocol library ---#
import smtplib
from email.mime.multipart import MIMEMultipart # Message as a multipart
from email.mime.text import MIMEText # Used to attach text

#--- Login info:
#    For security purposes store this info in environment variables
#    For the purpose of demonstration I hardcoded it here ---#

me = 'YourEmail@mail.com'
my_pass = '*******' # Your password

#--- Open your email addresses from a .txt file
#    The format for addresses should be as follows:
#    first@email.com,second@email.com,third@email.com... ---#

emails_file = open('email_addr.txt', 'r')
email_addr = emails_file.read()

#--- Define a function to send your mail:
def sendMail():

    #    Create a MIMEMultipart object 
    msg = MIMEMultipart()
    msg['Subject'] = 'Hello, this is my test subject!' 
    msg['From'] = me
    msg['To'] = email_addr

    #    Attach message from a txt file
    message_file = open('my_message.txt', 'r')
    the_message = MIMEText(message_file.read())
    msg.attach(the_message)

    #    Using GMAIL SMTP in my case ---#
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()

    #    Login 
    s.login(me, my_pass)

    #    Send the message 
    s.send_message(msg, None, None)
    s.quit()
    emails_file.close()

sendMail()
#   Call your function ---#
...