Smtplib و Gmail - مشاكل البرنامج النصي بيثون
سؤال
ها هي النصي الخاص بي:
#!/usr/bin/python
import smtplib
msg = 'Hello world.'
server = smtplib.SMTP('smtp.gmail.com',587) #port 465 or 587
server.ehlo()
server.starttls()
server.ehlo()
server.login('myname@gmail.com','mypass')
server.sendmail('myname@gmail.com','somename@somewhere.com',msg)
server.close()
أحاول فقط إرسال بريد إلكتروني من حساب Gmail الخاص بي. يستخدم البرنامج النصي StartTLs بسبب متطلبات Gmail. لقد جربت هذا على مضيفين على شبكة الإنترنت، 1and1 و Web 1and1 يعطيني خطأ "رفض اتصال" وتقارير فصل الانتظار أي خطأ ولكن فقط لا ترسل البريد الإلكتروني. لا أستطيع أن أرى أي شيء خاطئ في البرنامج النصي، لذلك أعتقد أنه قد يكون مرتبطا بمضيفين الويب. أي أفكار وتعليقات سيكون موضع تقدير كبير.
تحرير: التفت في وضع التصحيح. من الإخراج، يبدو أنه أرسل الرسالة بنجاح ... أنا فقط لا أستلمها أبدا.
send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
STARTTLS
ENHANCEDSTATUSCODES
PIPELINING
send: 'STARTTLS\r\n'
reply: '220 2.0.0 Ready to start TLS\r\n'
reply: retcode (220); Msg: 2.0.0 Ready to start TLS
send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-AUTH LOGIN PLAIN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
AUTH LOGIN PLAIN
ENHANCEDSTATUSCODES
PIPELINING
send: 'AUTH PLAIN *****\r\n'
reply: '235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: 2.7.0 Accepted
send: 'mail FROM:<myname@gmail.com> size=12\r\n'
reply: '250 2.1.0 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.0 OK 4sm652580yxq.48
send: 'rcpt TO:<myname@gmail.com>\r\n'
reply: '250 2.1.5 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.5 OK 4sm652580yxq.48
send: 'data\r\n'
reply: '354 Go ahead 4sm652580yxq.48\r\n'
reply: retcode (354); Msg: Go ahead 4sm652580yxq.48
data: (354, 'Go ahead 4sm652580yxq.48')
send: 'Hello world.\r\n.\r\n'
reply: '250 2.0.0 OK 1240421143 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.0.0 OK 1240421143 4sm652580yxq.48
data: (250, '2.0.0 OK 1240421143 4sm652580yxq.48')
المحلول
أعتقد أن خادم SMTP Gmail يقوم بإجراء بحث عكسي DNS على عنوان IP الذي تتصل به، ويرفض الاتصال إذا لم يتم العثور على مجال. هذا هو تجنب البريد العشوائي من استخدام خادم SMTP الخاص بهم كترحيل مفتوح.
نصائح أخرى
هل حاولت بناء رسالة صالحة؟
from email.MIMEText import MIMEText
msg = MIMEText('body')
msg['Subject'] = 'subject'
msg['From'] = "..."
msg['Reply-to'] = "..."
msg['To'] = "..."
لا أعرف ما إذا كان OP لا يزال يهتم بهذه الإجابة، ولكن بعد أن وجد نفسي هنا في محاولة لاستكشاف مشكلة مماثلة، نأمل أن يجد شخص آخر هذا مفيدا. كما اتضح، فقد غيرت Google الطريقة التي يسمحون باستخدام خادم SMTP الخاص بها. سوف ترغب في التحقق من بضعة أشياء:
أنك تستخدم نفس العنوان الذي استخدمته للمصادقة كعنوان "من". إذا لم أكن مخطئا، فقد كان الأمر كذلك، فيمكنك أن تضعه كثيرا ما تريده في الحقل من الحقل، ولكن لأغراض أمنية العديد من مواقع مضيف SMTP (بما في ذلك Google) الآن تقييد هذا العنوان الذي تمت مصادقة معهم.
اسمح للوصول إلى حسابك بالوصول إلى "تطبيقات أقل أمانا" (اقرأ: تطبيقات لا نولد إيرادات من). للقيام بذلك تسجيل الدخول إلى حسابك والتنقل هنا:https://www.google.com/settings/security/lesseceRapps.
استخدم المنفذ 587 مع TLS. ليس متأكدا حقا لماذا لم أحصل على ميناء 465 للعب لطيف.
آمل أن يساعد هذا شخص آخر خارج.
بعض الترويج الذاتي هنا، ولكن أشعر على أرضية صالحة.
فقط هل تحتاج حرفيا إلى هذا الرمز للقيام بالضبط ما كتبته:
import yagmail
yag = yagmail.SMTP('myname@gmail.com')
yag.send('somename@somewhere.com', subject = None, contents = 'Hello')
أو بطانة واحدة:
yagmail.SMTP('myname@gmail.com').send('somename@somewhere.com', None, 'Hello world.')
ما هو لطيف هو أنني أقترح استخدام كيرينغ لتخزين كلمة المرور الخاصة بك، لذلك لا تحظى أبدا بمخاطر الأشخاص الذين يروا كلمة المرور الخاصة بك في البرنامج النصي الخاص بك.
يمكنك ضبط هذا من خلال تشغيل مرة واحدة في المترجم الخاص بك:
import yagmail
yagmail.register("my@gmail.com", "mypassword")
والخروج. ثم يمكنك فقط استخدام:
import yagmail
yagmail.SMTP("my@gmail.com") # without password
إذا أضفت .yagmail مع "my@gmail.com" في منزلك دير، ثم يمكنك فقط القيام: yagmail.SMTP()
, ، ولكن هذا لا معنى له حتى الآن.
تحذير: إذا كنت تصبح جادا في إرسال الكثير من الرسائل، فأفضل إعداد OAuth2، يمكن أن يساعد Yagmail في ذلك.
yagmail.SMTP("my@gmail.com", oauth2_file="/path/to/save/creds.json")
ركضت المرة الأولى، وسوف يرشدك من خلال عملية الحصول على بيانات اعتماد OAuth2 وتخزينها في الملف بحيث لا تحتاج إلى فعل أي شيء في المرة القادمة. هل تشك في العثور على شخص ما بيانات الاعتماد الخاصة بك؟ سيكون لديهم أذونات محدودة، ولكن عليك إبطال بيانات اعتمادهم بشكل أفضل من خلال Gmail.
للحصول على الحزمة / التثبيت يرجى النظر في شخص سخيف أو ReadTheDocs., ، متاح لكل من بيثون 2 و 3.
انقاذ أنفسكم بعض الصداع واستخدام هذا:
http://mynthon.net/howto/-/python/python٪20-٪20logging.smtphandler-how-use-gmail-sp-server.txt.
SS.
ستحتاج إلى التحقق من مجلد "المرسل" الخاص بك في Gmail، حيث أن هذه الرسالة التي تم إرسالها من حسابك إلى حسابك سوف تظهر على الأرجح.
ذهبت إلى الارتباط المذكور أعلاه وكان 3 مختلفا عن العناوين لإرسالها إلى ولكن تلقيت ثلاث رسائل بريد إلكتروني إلى نفس العنوان وأنها عنوان رقم 3.
http://mynthon.net/howto/-/python/python٪20-٪20logging.smtphandler-how-use-gmail-sp-server.txt.
import logging
import logging.handlers
class TlsSMTPHandler(logging.handlers.SMTPHandler):
def emit(self, record):
"""
Emit a record.
Format the record and send it to the specified addressees.
"""
try:
import smtplib
import string # for tls add this line
try:
from email.utils import formatdate
except ImportError:
formatdate = self.date_time
port = self.mailport
if not port:
port = smtplib.SMTP_PORT
smtp = smtplib.SMTP(self.mailhost, port)
msg = self.format(record)
msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
self.fromaddr,
string.join(self.toaddrs, ","),
self.getSubject(record),
formatdate(), msg)
if self.username:
smtp.ehlo() # for tls add this line
smtp.starttls() # for tls add this line
smtp.ehlo() # for tls add this line
smtp.login(self.username, self.password)
smtp.sendmail(self.fromaddr, self.toaddrs, msg)
smtp.quit()
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
logger = logging.getLogger()
gm = TlsSMTPHandler(("smtp.gmail.com", 587), 'myusername@gmail.com', ['address1@gmail.com', 'address2@gmail.com', 'address3@gmail.com'], 'unable to find Error!', ('myusername@gmail.com', 'mypassword'))
gm.setLevel(logging.ERROR)
logger.addHandler(gm)
try:
1/0
except:
logger.exception('It NO work for me!!-')
انها تعمل
'''
Created on 2017/11/27
@author: devuser
'''
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
FROM_ADDRESS = 'sender@gmail.com'
MY_PASSWORD = 'password'
TO_ADDRESS = 'receiver@test.co.jp'
BCC = 'receiver2@test.net'
SUBJECT = 'GmailのSMTPサーバ経由'
BODY = 'pythonでメール送信'
def create_message(from_addr, to_addr, bcc_addrs, subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = from_addr
msg['To'] = to_addr
msg['Bcc'] = bcc_addrs
msg['Date'] = formatdate()
return msg
def send(from_addr, to_addrs, msg):
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
smtpobj.close()
if __name__ == '__main__':
to_addr = TO_ADDRESS
subject = SUBJECT
body = BODY
msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
send(FROM_ADDRESS, to_addr, msg)