سؤال

ها هي النصي الخاص بي:

#!/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 الخاص بها. سوف ترغب في التحقق من بضعة أشياء:

  1. أنك تستخدم نفس العنوان الذي استخدمته للمصادقة كعنوان "من". إذا لم أكن مخطئا، فقد كان الأمر كذلك، فيمكنك أن تضعه كثيرا ما تريده في الحقل من الحقل، ولكن لأغراض أمنية العديد من مواقع مضيف SMTP (بما في ذلك Google) الآن تقييد هذا العنوان الذي تمت مصادقة معهم.

  2. اسمح للوصول إلى حسابك بالوصول إلى "تطبيقات أقل أمانا" (اقرأ: تطبيقات لا نولد إيرادات من). للقيام بذلك تسجيل الدخول إلى حسابك والتنقل هنا:https://www.google.com/settings/security/lesseceRapps.

  3. استخدم المنفذ 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.

ستحتاج إلى التحقق من مجلد "المرسل" الخاص بك في 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)

https://qieta.com/okhrn/items/630A87CE1A44778BBEB1.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top