많은 검색을 한 후 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"
recipientsin 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()