[python] python smtplib을 사용하여 여러 수신자에게 이메일을 보내는 방법은 무엇입니까?
많은 검색을 한 후 smtplib.sendmail을 사용하여 여러 수신자에게 보내는 방법을 찾을 수 없었습니다. 문제는 메일을 보낼 때마다 메일 헤더에 여러 주소가 포함 된 것처럼 보이지만 실제로는 첫 번째 수신자 만 전자 메일을받습니다.
문제는 email.Message
모듈이 다른 것과 다른 것을 기대 하는 것 같습니다smtplib.sendmail()
기능 .
즉, 여러 수신자에게 보내려면 헤더를 쉼표로 구분 된 전자 메일 주소 문자열로 설정해야합니다. sendmail()
매개 변수는 to_addrs
그러나 이메일 주소의 목록이어야합니다.
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import smtplib
msg = MIMEMultipart()
msg["Subject"] = "Example"
msg["From"] = "me@example.com"
msg["To"] = "malcom@example.com,reynolds@example.com,firefly@example.com"
msg["Cc"] = "serenity@example.com,inara@example.com"
body = MIMEText("example email body")
msg.attach(body)
smtp = smtplib.SMTP("mailhost.example.com", 25)
smtp.sendmail(msg["From"], msg["To"].split(",") + msg["Cc"].split(","), msg.as_string())
smtp.quit()
답변
이것은 실제로 작동합니다 . 여러 변형을 시도하는 데 많은 시간을 보냈습니다.
import smtplib
from email.mime.text import MIMEText
s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = 'me@example.com'
recipients = ['john.doe@example.com', 'john.smith@example.co.uk']
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = ", ".join(recipients)
s.sendmail(sender, recipients, msg.as_string())
답변
은 msg['To']
문자열이어야합니다 :
msg['To'] = "a@b.com, b@b.com, c@b.com"
recipients
in sendmail(sender, recipients, message)
은 목록이어야 하지만 :
sendmail("a@a.com", ["a@b.com", "b@b.com", "c@b.com"], "Howdy")
답변
이메일 의 보이는 주소와 배달 의 차이점을 이해해야합니다 .
msg["To"]
본질적으로 편지에 인쇄되어 있습니다. 실제로 아무런 영향을 미치지 않습니다. 전자 우편 클라이언트는 정규 우체국과 마찬가지로 전자 우편을 보낼 사람이라고 가정합니다.
그러나 실제 배송은 상당히 다를 수 있습니다. 그래서 당신 은 할 수 있습니다 이메일 (또는 사본)을 완전히 다른 사람의 포스트 박스에 .
여기에는 여러 가지 이유가 있습니다. 예를 들어 전달 . 그만큼To:
헤더 필드가 전달에 변경되지 않습니다, 그러나 이메일은 다른 사서함으로 삭제됩니다.
이 smtp.sendmail
명령은 이제 실제 배달을 처리합니다.email.Message
배달 내용이 아닌 문자의 내용입니다.
하위 수준 SMTP
에서는 수신자에게 하나씩 하나씩 제공해야하므로 주소 목록 (이름 제외)이 합리적인 API입니다.
헤더의 경우 예를 들어 이름을 포함 할 수도 있습니다 To: First Last <email@addr.tld>, Other User <other@mail.tld>
. 따라서 코드 예제는 메일을 분할 ,
하지 않아도 유효한 주소가 없기 때문에이 메일을 전달 하지 못하므로 권장 하지 않습니다!
답변
그것은 나를 위해 작동합니다.
import smtplib
from email.mime.text import MIMEText
s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = 'me@example.com'
recipients = 'john.doe@example.com,john.smith@example.co.uk'
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = recipients
s.sendmail(sender, recipients.split(','), msg.as_string())
답변
나는 아래를 시도했고 그것은 매력처럼 일했다 🙂
rec_list = ['first@example.com', 'second@example.com']
rec = ', '.join(rec_list)
msg['To'] = rec
send_out = smtplib.SMTP('localhost')
send_out.sendmail(me, rec_list, msg.as_string())
답변
실제로 문제는 SMTP.sendmail과 email.MIMEText가 두 가지 다른 것이 필요하다는 것입니다.
email.MIMEText는 이메일 본문에 대한 “To :”헤더를 설정합니다. 사람에게 결과를 다른 쪽 끝에 표시하는 데만 사용되며 모든 전자 메일 헤더와 마찬가지로 단일 문자열이어야합니다. (실제로 메시지를받는 사람들과 관련이있을 필요는 없습니다.)
반면에 SMTP.sendmail은 SMTP 프로토콜에 대한 메시지의 “봉투”를 설정합니다. 파이썬의 문자열 목록이 필요하며 각 문자열에는 단일 주소가 있습니다.
따라서 귀하가해야 할 일은받은 두 개의 회신을 결합하는 것입니다. msg [ ‘To’]를 단일 문자열로 설정하지만 원시 목록을 sendmail에 전달하십시오.
emails = ['a.com','b.com', 'c.com']
msg['To'] = ', '.join( emails )
....
s.sendmail( msg['From'], emails, msg.as_string())
답변
이 수입 가능한 모듈 기능을 생각해 냈습니다. 이 예에서는 Gmail 이메일 서버를 사용합니다. 헤더와 메시지로 나뉘어 진행 상황을 명확하게 볼 수 있습니다.
import smtplib
def send_alert(subject=""):
to = ['email@one.com', 'email2@another_email.com', 'a3rd@email.com']
gmail_user = 'me@gmail.com'
gmail_pwd = 'my_pass'
smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + ", ".join(to) + '\n' + 'From: ' + gmail_user + '\n' + 'Subject: ' + subject + '\n'
msg = header + '\n' + subject + '\n\n'
smtpserver.sendmail(gmail_user, to, msg)
smtpserver.close()