Dostaję błąd "Float" nie ma atrybutu "kodowania" podczas wysyłania wiadomości e-mail z Pythona. Prowadzono to z powodzeniem było ostatnie 6-7 dni bez żadnych problemów.

def create_message(send_from, send_to, cc_to, subject, plain_text_body):
    
    message = MIMEMultipart('alternative')
    message['From'] = send_from
    
    message['To'] =send_to    
    message['Cc'] = cc_to
    message['Date'] = formatdate(localtime=True)
    message['Subject'] = subject
    message.attach(MIMEText(plain_text_body, 'plain'))
    return message

def add_attachment_from_local_disk(message, path):
    with open(path, "rb") as file:
        part = MIMEApplication(file.read(),Name=basename(path))
        part['Content-Disposition'] = 'attachment; filename="%s"' % basename(path)
        message.attach(part)
        
def send_message(message):
    print(message)
    client = boto3.client("ses",region_name='eu-west-1')
    response = client.send_raw_email(RawMessage = {"Data": message.as_string()})

for i, row in final_email.iterrows():
    subject  = row["Subject"]
    to_address = row['fba_to__notifications'] or row['lsp_escalation_back_up'] or "no_address@rs-components.com"
    cc_list =   row['cc_list']
    send_from="ukrd@kuedid.com"
    message = create_message(send_from,to_address, cc_list, subject, plain_text_body=body)
    send_message(message)

Błąd

~\AppData\Local\Continuum\anaconda3\lib\email\_policybase.py in _fold(self, name, value, sanitize)
    367             if self.max_line_length is not None:
    368                 maxlinelen = self.max_line_length
--> 369             parts.append(h.encode(linesep=self.linesep, maxlinelen=maxlinelen))
    370         parts.append(self.linesep)
    371         return ''.join(parts)

AttributeError: 'float' object has no attribute 'encode'

Jak to naprawić?

0
aeapen 22 lipiec 2020, 11:18

1 odpowiedź

Najlepsza odpowiedź

Błąd mówi, że biblioteka otrzymuje pływaka, gdzie spodziewałoby się sznurka. Z twojego kodu spodziewałbym się, że body lub jedno pole z final_email zawiera pływak.

Nie byłbym zaskoczony pływakiem, który będzie Nanem z powodu pustej wartości w Dataframe. Aby upewnić się (lub zrobić kod bardziej solidny), możesz spróbować przefiltrować wyjątek i wyświetlić wartości przestępcze:

for i, row in final_email.iterrows():
    subject  = row["Subject"]
    to_address = row['fba_to__notifications'] or row['lsp_escalation_back_up'] or "no_address@rs-components.com"
    cc_list =   row['cc_list']
    send_from="ukrd@kuedid.com"
    try:
        message = create_message(send_from,to_address, cc_list, subject, plain_text_body=body)
    except AttributeError as e:
        print('Error composing email', send_from,to_address, cc_list, subject, body, '\n', e)
        # raise # optionaly re-raise the exception if you want to stop processing
    send_message(message)

W każdym razie jest tu inny problem. NaN jest postrzegany jako True po przeliczeniu na boolean w kodzie Python. Więc przypisanie to_address nie spowoduje awansowania wyrażenia or, jeśli jest NAN. Więc powinieneś mieć combine_first odpowiednie kolumny, jeśli ma sens (final_email['fba_to__notifications'].combine_first(final_email['lsp_escalation_back_up'].fillna('no_address@rs-components.com')) lub wyraźnie przetestować dla wartości NAN:

to_address = row['fba_to__notifications'] if not np.isnan(row['fba_to__notifications']) \
    else row['lsp_escalation_back_up'] if not isnan(row['lsp_escalation_back_up']) \
    else "no_address@rs-components.com"
1
Serge Ballesta 22 lipiec 2020, 12:19