[Python] iCalendar versturen via mail

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 10:38
Hoi,

Ik probeer via Python, IMAP een agenda invitation te versturen.

Inloggen in IMAP lukt en een mail versturen ook.
Ik probeer aan de hand van dit voorbeeld mijn code aan te passen:

voorbeeld

Echter, ik loop vast bij de variable "self".
Wat bedoelt hij daarmee? Uit de code begrijp ik dat het iets datums gerelateerd moet zijn volgens mij.

Ik roep hem als volgt aan:

code:
1
send_appointment('2013-10-31','ontvanger_email', 'verzender_email', 'Test Calendar', 'Test Description', 'Locatie', '19', '30')


maar krijg dan:
code:
1
2
3
4
5
6
7
Traceback (most recent call last):
  File "C:\Users\\Python Projects\Emailen O365\send_invite.py", line 87, in <module>
    send_appointment('2013-10-31','ontvanger_email', 'verzender_email', 'Test Calendar', 'Test Description', 'Locatie', '19', '30')
  File "C:\Users\Python Projects\Emailen O365\send_invite.py", line 25, in send_appointment
    start = tz.localize(dt.datetime.combine(self.date, dt.time(start_hour, start_minute, 0)))
                                            ^^^^^^^^^
AttributeError: 'str' object has no attribute 'date'


Iemand enig idee wat er mis gaat?

Beste antwoord (via ironheart op 28-11-2023 17:43)


  • matk89
  • Registratie: Oktober 2005
  • Laatst online: 18:40
ironheart schreef op dinsdag 28 november 2023 @ 16:52:
[...]


Thanks, ik ga vanuit hier verder speuren maar niet meer hier op Tweakers. Dank!
Het echte antwoord komt van @remyz : als je eens zoekt op 'python class self' dan wordt het wel duidelijk hopelijk. Helaas is het voorbeeld dat je aan het volgen bent niet heel goed: het neemt aan dat je functie onderdeel is van een class met daarin bepaalde attributen maar geeft deze niet mee in het voorbeeld. Dat moet je dus reverse engineren, wat lastig is als je een beginner bent in de taal.
https://learnpython.com/b...th-icalendar-with-python/ <- dit is een veel betere intro van wat je wilt bereiken.

Alle reacties


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 17:36

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Die vragen die er staan wanneer je een nieuw topic opent staan er niet voor niets:
Mijn vraag
...

Relevante software en hardware die ik gebruik
...

Wat ik al gevonden of geprobeerd heb
...
:)

Dus graag zou ik zien dat je je topicstart even aanvult met die informatie.

Edit: Ik zie dat ik dat al een keer eerder verteld heb. Ik wil je toch vriendelijk verzoeken de aldaar genoemde quickstart (nog) een keertje door te nemen. En dus je topicstart alsnog aan te vullen met wat je zelf al gevonden / geprobeerd hebt. Want "python self" googlen lijkt me niet heel veel moeite, wel?

[ Voor 39% gewijzigd door RobIII op 28-11-2023 16:05 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 10:38
Huh, dat heb ik toch al uitgelegd:
Uit de code begrijp ik dat het iets datums gerelateerd moet zijn volgens mij.
Ik heb hier meerdere vormen van datums geprobeerd (20232811, 2023-11-23, enz.) maar blijf op deze foutmelding uitkomen.

Acties:
  • 0 Henk 'm!

  • Snow_King
  • Registratie: April 2001
  • Laatst online: 18:47

Snow_King

Konijn is stoer!

ironheart schreef op dinsdag 28 november 2023 @ 16:12:
Huh, dat heb ik toch al uitgelegd:


[...]


Ik heb hier meerdere vormen van datums geprobeerd (20232811, 2023-11-23, enz.) maar blijf op deze foutmelding uitkomen.
Je geeft nu een string, maar je moet volgens mij een date object aan die functie geven.

Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 10:38
Snow_King schreef op dinsdag 28 november 2023 @ 16:14:
[...]

Je geeft nu een string, maar je moet volgens mij een date object aan die functie geven.
Thanks! Daar heb ik alvast wat aan maar ben er nog niet.

Wat heb ik gedaan?
Google leert mij dat een date object: JavaScript Date objects represent a single moment in time in a platform-independent format. Date objects encapsulate an integral number that represents milliseconds since the midnight at the beginning of January 1, 1970, UTC (the epoch).
Dus dan zou ik moeten calculeren hoeveel seconden er zit tussen 01-01-1970 en nu, eens?
Als ik dus invul 1701129600 dan krijg ik terug:
code:
1
AttributeError: 'int' object has no attribute 'date'

En die snap ik want een integer is geen date object....

[ Voor 3% gewijzigd door ironheart op 28-11-2023 16:29 ]


Acties:
  • 0 Henk 'm!

  • remyz
  • Registratie: Februari 2010
  • Laatst online: 14:33
In het voorbeeld dat je geeft staat het volgende commentaar:
code:
1
# Imagine this function is part of a class which provides the necessary config data


De termen class en self zouden een hint moeten zijn.

Sowieso is het handig als je jouw eigen code even laat zien.

Acties:
  • +1 Henk 'm!

  • Snow_King
  • Registratie: April 2001
  • Laatst online: 18:47

Snow_King

Konijn is stoer!

ironheart schreef op dinsdag 28 november 2023 @ 16:28:
[...]


Thanks! Daar heb ik alvast wat aan maar ben er nog niet.

Wat heb ik gedaan?
Google leert mij dat een date object: JavaScript Date objects represent a single moment in time in a platform-independent format. Date objects encapsulate an integral number that represents milliseconds since the midnight at the beginning of January 1, 1970, UTC (the epoch).
Dus dan zou ik moeten calculeren hoeveel seconden er zit tussen 01-01-1970 en nu, eens?
Als ik dus invul 1701129600 dan krijg ik terug:
code:
1
AttributeError: 'int' object has no attribute 'date'

En die snap ik want een integer is geen date object....
Python:
1
def send_appointment(self, attendee_email, organiser_email, subj, description, location, start_hour, start_minute):


Jij geeft als eerste argument al een datum, maar die functie uit het voorbeeld vereist een mailadres.

Maar kijk voor Python's date module hier eens: https://docs.python.org/3/library/datetime.html

[ Voor 0% gewijzigd door RobIII op 28-11-2023 16:44 . Reden: Code tag gefixed :) ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 17:36

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

ironheart schreef op dinsdag 28 november 2023 @ 16:12:
Huh, dat heb ik toch al uitgelegd:
ironheart schreef op dinsdag 28 november 2023 @ 15:57:
Echter, ik loop vast bij de variable "self".
Wat bedoelt hij daarmee?
We vragen je natuurlijk om aan te geven wat je al gezocht / gevonden hebt met betrekking tot je vraag, niet wat je daarvóór gevonden hebt en aan het verbouwen bent en daardoor op die vraag stuitte ;)
ironheart schreef op dinsdag 28 november 2023 @ 16:28:
Wat heb ik gedaan?
Google leert mij dat een date object: JavaScript Date objects represent a single moment in time in a platform-independent format. Date objects encapsulate an integral number that represents milliseconds since the midnight at the beginning of January 1, 1970, UTC (the epoch).
Dit topic ging toch over Python? Waarom gaat 't nu opeens over javascript :?

[ Voor 31% gewijzigd door RobIII op 28-11-2023 16:45 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 10:38
RobIII schreef op dinsdag 28 november 2023 @ 16:41:
[...]


[...]


We vragen je natuurlijk om aan te geven wat je al gezocht / gevonden hebt met betrekking tot je vraag, niet wat je daarvóór gevonden hebt en aan het verbouwen bent en daardoor op die vraag stuitte ;)


[...]

Dit topic ging toch over Python? Waarom gaat 't nu opeens over javascript :?
Damn kerel, zit je achter me aan? De taal maakt toch niet uit, het gaat erom wat het inhoudt maar laat maar zitten joh, voel me echt welkom zo. Al de zoveelste keer dat je zo doet en niet alleen bij mij.
Snow_King schreef op dinsdag 28 november 2023 @ 16:37:
[...]


Python:
1
def send_appointment(self, attendee_email, organiser_email, subj, description, location, start_hour, start_minute):


Jij geeft als eerste argument al een datum, maar die functie uit het voorbeeld vereist een mailadres.

Maar kijk voor Python's date module hier eens: https://docs.python.org/3/library/datetime.html
Thanks, ik ga vanuit hier verder speuren maar niet meer hier op Tweakers. Dank!

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 17:36

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

ironheart schreef op dinsdag 28 november 2023 @ 16:52:

Damn kerel, zit je achter me aan? De taal maakt toch niet uit
Het is toch niet heel raar dat mensen hun wenkbrauwen fronsen als je in een Python topic opeens JS documentatie aanhaalt? Waar jij het over hebt is een vrij gangbaar fenomeen: Unix time (of Unix Epoch). Dat zijn inderdaad het aantal (milli)seconden sinds 1-1-1970 - afhankelijk van welke taal / definitie je hanteert zijn 't dus secondes (de meeste talen, waaronder Python (waar 't weer POSIX timestamp genoemd wordt)) of millisecondes (javascript). Soms zelfs nanosecondes (APFS, ext 4). Dus, ja, het doet er wel degelijk toe dat je opeens over javascript begint.

En, nee, ik zit niet achter je aan, maar als mod is 't m'n taak m'n eigen forumhoekje bij te lezen. Als je dan niet volgens de regels speelt zeg ik daar, logischerwijs, iets van. Ik had ook je topic kunnen sluiten maar heb je gewoon vriendelijk verzocht je topicstart aan te vullen. Ik zie het hele probleem niet.

[ Voor 7% gewijzigd door RobIII op 28-11-2023 17:04 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • matk89
  • Registratie: Oktober 2005
  • Laatst online: 18:40
ironheart schreef op dinsdag 28 november 2023 @ 16:52:
[...]


Thanks, ik ga vanuit hier verder speuren maar niet meer hier op Tweakers. Dank!
Het echte antwoord komt van @remyz : als je eens zoekt op 'python class self' dan wordt het wel duidelijk hopelijk. Helaas is het voorbeeld dat je aan het volgen bent niet heel goed: het neemt aan dat je functie onderdeel is van een class met daarin bepaalde attributen maar geeft deze niet mee in het voorbeeld. Dat moet je dus reverse engineren, wat lastig is als je een beginner bent in de taal.
https://learnpython.com/b...th-icalendar-with-python/ <- dit is een veel betere intro van wat je wilt bereiken.

Acties:
  • +1 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 10:38
matk89 schreef op dinsdag 28 november 2023 @ 17:04:
[...]


Het echte antwoord komt van @remyz : als je eens zoekt op 'python class self' dan wordt het wel duidelijk hopelijk. Helaas is het voorbeeld dat je aan het volgen bent niet heel goed: het neemt aan dat je functie onderdeel is van een class met daarin bepaalde attributen maar geeft deze niet mee in het voorbeeld. Dat moet je dus reverse engineren, wat lastig is als je een beginner bent in de taal.
https://learnpython.com/b...th-icalendar-with-python/ <- dit is een veel betere intro van wat je wilt bereiken.
Kijk en dat is nou top!

Afbeeldingslocatie: https://tweakers.net/i/-lLR9agFdDwU9vgwWBYGQSxzD-c=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/6gzqGiRq3R7euO6IXYZDmbDc.png?f=user_large

Alleen nou wordt de naam van het event niet meegenomen terwijl ik het op dezelfde manier gevuld heb :?


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from icalendar import Calendar, Event, vCalAddress, vText
from datetime import datetime
from pathlib import Path
import os
import pytz


def create_invite(titel, omschrijving,start_jaar, start_maand, start_dag, start_uur, start_minuut, eind_jaar, eind_maand, eind_dag, eind_uur, eind_minuut, email_verzender, email_ontvanger):
    # init the calendar
    cal = Calendar()

    cal.add('prodid', '-//My calendar product//example.com//')
    cal.add('version', '2.0')

    # Add subcomponents
    event = Event()
    event.add('name', titel)
    event.add('description', omschrijving)
    event.add('dtstart', datetime(start_jaar, start_maand, start_dag, start_uur, start_minuut, 0, tzinfo=pytz.utc))
    event.add('dtend', datetime(eind_jaar, eind_maand, eind_dag, eind_uur, eind_minuut, 0, tzinfo=pytz.utc))

    # Add the organizer
    organizer = vCalAddress('MAILTO:'+email_verzender)

    # Add parameters of the event
    organizer.params['name'] = vText('John Doe')
    organizer.params['role'] = vText('CEO')
    event['organizer'] = email_verzender
    event['location'] = vText('Locatie')

    event['uid'] = '2022125T111010/272356262376@example.com'
    event.add('priority', 5)
    attendee = vCalAddress('MAILTO:'+email_ontvanger)
    attendee.params['name'] = vText('Naam ontvanger')
    attendee.params['role'] = vText('REQ-PARTICIPANT')
    event.add('attendee', attendee, encode=0)

    # Add the event to the calendar
    cal.add_component(event)



        # Write to disk
    directory = Path.cwd() / 'MyCalendar'
    try:
       directory.mkdir(parents=True, exist_ok=False)
    except FileExistsError:
       print("Folder already exists")
    else:
       print("Folder was created")

    f = open(os.path.join(directory, 'example.ics'), 'wb')
    f.write(cal.to_ical())
    f.close()


create_invite('Naam','Locatie',2023, 11, 30, 19, 30, 2023, 11, 30, 20, 00, 'email zender', 'email ontvanger')


Hij komt ook netjes mee in de ICS file zelf (dit heb ik dus zelf gedaan om te onderzoeken waar het misgaat, even voor alle duidelijkheid):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//My calendar product//example.com//
BEGIN:VEVENT
DTSTART:20231130T193000Z
DTEND:20231130T200000Z
UID:2022125T111010/272356262376@example.com
ATTENDEE;NAME="Naam ontvanger";ROLE=REQ-PARTICIPANT:MAILTO:email ontvanger
DESCRIPTION:Fitnesss
LOCATION:Locatie
NAME:Naam
ORGANIZER:Email_verzender
PRIORITY:5
END:VEVENT
END:VCALENDAR


Never mind, ik heb een eigen Outlook item opgeslagen en geopend en daar noemen ze NAME, SUMMARY. Als ik dat aanpas dan gaat het goed. Thanks @matk89
Pagina: 1