email has in-reply-to
This commit is contained in:
parent
2df36a387a
commit
e2bd4780a2
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1 +1,3 @@
|
||||||
/target
|
/target
|
||||||
|
/.idea
|
||||||
|
plenum_config.sqlite
|
||||||
|
|
|
@ -15,6 +15,8 @@ headers = "0.4.0"
|
||||||
reqwest = "0.12.5"
|
reqwest = "0.12.5"
|
||||||
lettre = "0.11.7"
|
lettre = "0.11.7"
|
||||||
rand = "0.9.0-alpha.1"
|
rand = "0.9.0-alpha.1"
|
||||||
|
rusqlite = "0.31.0"
|
||||||
|
uuid = { version = "1.10.0", features = ["v4"] }
|
||||||
#mail-core = "0.6.2"
|
#mail-core = "0.6.2"
|
||||||
#mail-headers = "0.6.6"
|
#mail-headers = "0.6.6"
|
||||||
#mail-internals = "0.2.3"
|
#mail-internals = "0.2.3"
|
||||||
|
|
|
@ -1,37 +1,17 @@
|
||||||
# Plenum 23.Juli'24
|
# Plenum vom {Datum}
|
||||||
---
|
|
||||||
Cursorparkplatz (0€/h)
|
|
||||||
v cursor nach unten
|
|
||||||
|
|
||||||
^ cursor nach oben
|
|
||||||
|
|
||||||
---
|
|
||||||
# Meeting Minutes 2024-07-23
|
|
||||||
**Beginn 20:XX**
|
**Beginn 20:XX**
|
||||||
|
|
||||||
## Table of Contents
|
## Themen
|
||||||
[toc]
|
[toc]
|
||||||
|
|
||||||
|
|
||||||
## Anwesend
|
## Anwesend
|
||||||
X
|
X
|
||||||
|
|
||||||
## TOP 1: Der Vorstand berichtet
|
<!-- ## TOP 1: Der Vorstand berichtet -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Ende 2X:XX**
|
**Ende 2X:XX**
|
||||||
|
|
||||||
Nächstes Plenum: Am 13.08.2024 um 20 Uhr
|
Nächstes Plenum: Am {naechstes-plenum} um 20 Uhr
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# Backlog
|
|
||||||
|
|
||||||
|
|
||||||
## TOP: Titel (TOP-Owner)
|
|
||||||
- Beschreibung des TOPs
|
|
||||||
- dies ist ein Template-TOP
|
|
||||||
|
|
||||||
|
|
||||||
## TOP 2: (aus dem Backlog)
|
|
||||||
- TOP aus dem Backlog pullen
|
|
88
src/key_value.rs
Normal file
88
src/key_value.rs
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
use rusqlite::{params, Connection, Result};
|
||||||
|
// use std::collections::HashMap;
|
||||||
|
|
||||||
|
pub struct KeyValueStore {
|
||||||
|
conn: Connection,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl KeyValueStore {
|
||||||
|
// Initialize the database and create the table if it doesn't exist
|
||||||
|
pub fn new(db_path: &str) -> Result<Self> {
|
||||||
|
let conn = Connection::open(db_path)?;
|
||||||
|
conn.execute(
|
||||||
|
"CREATE TABLE IF NOT EXISTS kv_store (
|
||||||
|
key TEXT PRIMARY KEY,
|
||||||
|
value TEXT NOT NULL
|
||||||
|
)",
|
||||||
|
[],
|
||||||
|
)?;
|
||||||
|
Ok(KeyValueStore { conn })
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert or update a key-value pair
|
||||||
|
pub fn set(&self, key: &str, value: &str) -> Result<()> {
|
||||||
|
self.conn.execute(
|
||||||
|
"INSERT INTO kv_store (key, value) VALUES (?1, ?2)
|
||||||
|
ON CONFLICT(key) DO UPDATE SET value = excluded.value",
|
||||||
|
params![key, value],
|
||||||
|
)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn default(&self, key: &str, value: &str) {
|
||||||
|
self.conn.execute(
|
||||||
|
"INSERT INTO kv_store (key, value) VALUES (?1, ?2)
|
||||||
|
ON CONFLICT(key) DO NOTHING",
|
||||||
|
params![key, value],
|
||||||
|
).ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve a value by key
|
||||||
|
pub fn get(&self, key: &str) -> Result<Option<String>> {
|
||||||
|
let mut stmt = self.conn.prepare("SELECT value FROM kv_store WHERE key = ?1")?;
|
||||||
|
let mut rows = stmt.query(params![key])?;
|
||||||
|
|
||||||
|
if let Some(row) = rows.next()? {
|
||||||
|
let value: String = row.get(0)?;
|
||||||
|
Ok(Some(value))
|
||||||
|
} else {
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete a key-value pair
|
||||||
|
pub fn delete(&self, key: &str) -> Result<()> {
|
||||||
|
self.conn.execute("DELETE FROM kv_store WHERE key = ?1", params![key])?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
fn main() -> Result<()> {
|
||||||
|
let kv_store = KeyValueStore::new("kv_store.db")?;
|
||||||
|
|
||||||
|
// Set some key-value pairs
|
||||||
|
kv_store.set("last_week_pad", "pad_id_123")?;
|
||||||
|
kv_store.set("email_id", "email_id_456")?;
|
||||||
|
|
||||||
|
// Retrieve and print values
|
||||||
|
if let Some(value) = kv_store.get("last_week_pad")? {
|
||||||
|
println!("Last week's pad ID: {}", value);
|
||||||
|
} else {
|
||||||
|
println!("Key not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(value) = kv_store.get("email_id")? {
|
||||||
|
println!("Email ID: {}", value);
|
||||||
|
} else {
|
||||||
|
println!("Key not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete a key-value pair
|
||||||
|
kv_store.delete("last_week_pad")?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
79
src/main.rs
79
src/main.rs
|
@ -18,33 +18,46 @@ Pad-ins-Wiki-und-versenden-Skript
|
||||||
• Pad in MediaWiki-Format umwandeln
|
• Pad in MediaWiki-Format umwandeln
|
||||||
• Neue Wiki-Seite erstellen und dort das umgewandelte Pad hochladen
|
• Neue Wiki-Seite erstellen und dort das umgewandelte Pad hochladen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
mod key_value;
|
||||||
|
use key_value::KeyValueStore as KV;
|
||||||
|
|
||||||
|
|
||||||
use chrono::{Datelike, Local, NaiveDate, Weekday};
|
use chrono::{Datelike, Local, NaiveDate, Weekday};
|
||||||
use regex::{Regex};
|
use regex::{Regex};
|
||||||
|
use uuid::Uuid;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
use headers::ContentType;
|
use headers::ContentType;
|
||||||
|
|
||||||
// MAIL START
|
// MAIL START
|
||||||
use lettre::{Message, SmtpTransport, Transport};
|
use lettre::{Message, SmtpTransport, Transport};
|
||||||
use lettre::message::{header, SinglePart};
|
use lettre::message::{header, SinglePart};
|
||||||
|
use lettre::message::header::MessageId;
|
||||||
use lettre::transport::smtp::authentication::Credentials;
|
use lettre::transport::smtp::authentication::Credentials;
|
||||||
// MAIL END
|
// MAIL END
|
||||||
|
|
||||||
use rand::{Rng, thread_rng};
|
use rand::{Rng, thread_rng};
|
||||||
use rand::distributions::Alphanumeric;
|
use rand::distributions::Alphanumeric;
|
||||||
|
|
||||||
|
fn kv_defaults (kv: KV) {
|
||||||
|
kv.default("template-url", "https://md.berlin.ccc.de/plenum-template");
|
||||||
|
kv.default("email-signature", "\n\n[Diese Nachricht wurde automatisiert vom Plenumsbot erstellt und ist daher ohne Unterschrift gültig.]");
|
||||||
|
}
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
// BEGIN ANKÜNDIGUNGSSCRIPT
|
// BEGIN ANKÜNDIGUNGSSCRIPT
|
||||||
|
|
||||||
// Dienstage diesen Monat
|
// config
|
||||||
|
let config = KV::new("plenum_config.sqlite").unwrap();
|
||||||
|
kv_defaults(config);
|
||||||
|
|
||||||
let all_tuesdays: Vec<Option<NaiveDate>> = get2nd_and4th_tuesdays();
|
// Dienstage diesen Monat
|
||||||
|
let all_tuesdays: Vec<Option<NaiveDate>> = get_tuesdays(0);
|
||||||
let zweiter_dienstag: String = all_tuesdays[1].unwrap().to_string(); // z.B. 2024-07-09
|
let zweiter_dienstag: String = all_tuesdays[1].unwrap().to_string(); // z.B. 2024-07-09
|
||||||
let vierter_dienstag: String = all_tuesdays[3].unwrap().to_string(); // z.B. 2024-07-23
|
let vierter_dienstag: String = all_tuesdays[3].unwrap().to_string(); // z.B. 2024-07-23
|
||||||
|
|
||||||
//Dienstage nächsten Monat
|
//Dienstage nächsten Monat
|
||||||
let all_tuesdays_next_month: Vec<Option<NaiveDate>> = get2nd_and4th_tuesdays_of_next_month();
|
let all_tuesdays_next_month: Vec<Option<NaiveDate>> = get_tuesdays(1);
|
||||||
let zweiter_dienstag_nächster_monat: String = all_tuesdays_next_month[1].unwrap().to_string();
|
let zweiter_dienstag_nächster_monat: String = all_tuesdays_next_month[1].unwrap().to_string();
|
||||||
let _vierter_dienstag_nächster_monat: String = all_tuesdays_next_month[3].unwrap().to_string();
|
let _vierter_dienstag_nächster_monat: String = all_tuesdays_next_month[3].unwrap().to_string();
|
||||||
|
|
||||||
|
@ -78,21 +91,24 @@ async fn main() {
|
||||||
let future_pad_id:String = String::from("NOCH NICHT IMPLIMENTIERT");
|
let future_pad_id:String = String::from("NOCH NICHT IMPLIMENTIERT");
|
||||||
let future_pad_link: String = format!("https://md.berlin.ccc.de/{}/download", future_pad_id);
|
let future_pad_link: String = format!("https://md.berlin.ccc.de/{}/download", future_pad_id);
|
||||||
|
|
||||||
|
let mut message_id: String = String::from("FEHLER");
|
||||||
|
|
||||||
|
let in_3_days_is_plenum = true;
|
||||||
if in_1_day_is_plenum {
|
if in_1_day_is_plenum {
|
||||||
let pad_content = download_and_return_pad(current_pad_link.clone()).await.expect("Fehler beim Download des Pads!");
|
let pad_content = download_and_return_pad(current_pad_link.clone()).await.expect("Fehler beim Download des Pads!");
|
||||||
println!("Pad-content geladen!");
|
println!("Pad-content geladen!");
|
||||||
if did_the_pad_change(&pad_content) {
|
if did_the_pad_change(&pad_content) {
|
||||||
// Mail an alle senden, findet statt
|
// Mail an alle senden, findet statt
|
||||||
let message: String = format!("Hallo liebe Mitreisenden,\nEs gibt Themen, deshalb wird das morgige Plenum statt finden.\nAnbei das Plenumspad:\n{current_pad_link}\n Bis morgen, 20 Uhr!\n\n[Diese Nachricht wurde automatisiert vom Plenumsbot erstellt und ist daher ohne Unterschrift gültig.]");
|
let message: String = format!("Hallo liebe Mitreisenden,\nEs gibt Themen, deshalb wird das morgige Plenum statt finden.\nAnbei das Plenumspad:\n{current_pad_link}\n Bis morgen, 20 Uhr!");
|
||||||
println!("{}", message);
|
println!("{}", message);
|
||||||
let betreff = format!("Plenum vom {} findet statt", nächster_plenumtermin);
|
let betreff = format!("Plenum vom {} findet statt", nächster_plenumtermin);
|
||||||
mail_versenden(message, betreff).expect("Plenum findet statt. Mail wurde versucht zu senden, konnte aber nicht gesendet werden!")
|
message_id = mail_versenden(message, betreff).expect("Plenum findet statt. Mail wurde versucht zu senden, konnte aber nicht gesendet werden!")
|
||||||
} else {
|
} else {
|
||||||
// Mail an alle senden und absagen
|
// Mail an alle senden und absagen
|
||||||
let message: String = format!("Hallo liebe Mitreisenden,\nEs sind leider keine Themen zusammengekommen, deshalb wird das morgige Plenum leider nicht statt finden.\nHier ist der Link zum Pad vom nächsten Plenum, das am {} statt finden wird: {future_pad_link} und hier der morgige Padlink, der nicht mehr gebraucht wird: {current_pad_link}\nBis zum nächsten Plenum.\n\n[Diese Nachricht wurde automatisiert vom Plenumsbot erstellt und ist daher ohne Unterschrift gültig.]", nächster_plenumtermin);
|
let message: String = format!("Hallo liebe Mitreisenden,\nEs sind leider keine Themen zusammengekommen, deshalb wird das morgige Plenum leider nicht statt finden.\nHier ist der Link zum Pad vom nächsten Plenum, das am {} statt finden wird: {future_pad_link} und hier der morgige Padlink, der nicht mehr gebraucht wird: {current_pad_link}\nBis zum nächsten Plenum.\n\n[Diese Nachricht wurde automatisiert vom Plenumsbot erstellt und ist daher ohne Unterschrift gültig.]", nächster_plenumtermin);
|
||||||
println!("{}", message);
|
println!("{}", message);
|
||||||
let betreff = format!("Plenum vom {} muss leider ausfallen", nächster_plenumtermin);
|
let betreff = format!("Plenum vom {} muss leider ausfallen", nächster_plenumtermin);
|
||||||
mail_versenden(message, betreff).expect("Plenum wird abgesagt. Mail wurde versucht zu senden, konnte aber nicht gesendet werden!")
|
message_id = mail_versenden(message, betreff).expect("Plenum wird abgesagt. Mail wurde versucht zu senden, konnte aber nicht gesendet werden!")
|
||||||
}
|
}
|
||||||
} else if in_3_days_is_plenum {
|
} else if in_3_days_is_plenum {
|
||||||
let pad_content = download_and_return_pad(current_pad_link.clone()).await.expect("Fehler beim Download des Pads!");
|
let pad_content = download_and_return_pad(current_pad_link.clone()).await.expect("Fehler beim Download des Pads!");
|
||||||
|
@ -102,12 +118,15 @@ async fn main() {
|
||||||
let message: String = format!("Hallo liebe Mitreisenden,\nEs sind leider bisher keine Themen zusammengekommen. Wenn bis Sonntag Abend keine Themen zusammenkommen, wird das Plenum voraussichtlich nicht statt finden.\nHier ist der Link zum Pad, wo ihr noch Themen einragen könnt: {}\n\n[Diese Nachricht wurde automatisiert vom Plenumsbot erstellt und ist daher ohne Unterschrift gültig.]", current_pad_link.clone());
|
let message: String = format!("Hallo liebe Mitreisenden,\nEs sind leider bisher keine Themen zusammengekommen. Wenn bis Sonntag Abend keine Themen zusammenkommen, wird das Plenum voraussichtlich nicht statt finden.\nHier ist der Link zum Pad, wo ihr noch Themen einragen könnt: {}\n\n[Diese Nachricht wurde automatisiert vom Plenumsbot erstellt und ist daher ohne Unterschrift gültig.]", current_pad_link.clone());
|
||||||
let betreff = format!("Plenum vom {}:Bisher noch keine Plenumsthemen", nächster_plenumtermin);
|
let betreff = format!("Plenum vom {}:Bisher noch keine Plenumsthemen", nächster_plenumtermin);
|
||||||
println!("{}", message);
|
println!("{}", message);
|
||||||
mail_versenden(message, betreff).expect("Noch nicht genug Themen. Mail wurde versucht zu senden, konnte aber nicht gesendet werden!")
|
message_id = mail_versenden(message, betreff).expect("Noch nicht genug Themen. Mail wurde versucht zu senden, konnte aber nicht gesendet werden!")
|
||||||
}
|
}
|
||||||
|
println!("message id: {}", message_id)
|
||||||
}
|
}
|
||||||
// END ANKÜNDIGUNGSSCRIPT
|
// END ANKÜNDIGUNGSSCRIPT
|
||||||
let datum = String::from("15.10.24");
|
let datum = String::from("15.10.24");
|
||||||
generate_new_pad_for_following_date(datum);
|
generate_new_pad_for_following_date(datum);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -121,13 +140,13 @@ async fn download_and_return_pad(pad_link: String) -> Result<String, Box<dyn std
|
||||||
Ok(pad_content)
|
Ok(pad_content)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get2nd_and4th_tuesdays() -> Vec<Option<NaiveDate>>{
|
fn get_tuesdays(month_offset: u32) -> Vec<Option<NaiveDate>>{
|
||||||
// Jeden Donnerstag im Monat finden:
|
// Jeden Donnerstag im Monat finden:
|
||||||
let today = Local::now(); // jetzige Zeit abrufen (z.B. 2024-07-17 15:36:31.660997700 +02:00)
|
let today = Local::now(); // jetzige Zeit abrufen (z.B. 2024-07-17 15:36:31.660997700 +02:00)
|
||||||
let current_month = today.month(); // diesen Monat als Zahl (z.B. 7)
|
let current_month = today.month(); // diesen Monat als Zahl (z.B. 7)
|
||||||
let current_year = today.year(); // dieses Jahr als Zahl (z.B. 2024)
|
let current_year = today.year(); // dieses Jahr als Zahl (z.B. 2024)
|
||||||
let first_day: Option<NaiveDate> = NaiveDate::from_ymd_opt(current_year, current_month, 1); // Erster Tag des Monats (z.B. 2024-07-01)
|
let first_day: Option<NaiveDate> = NaiveDate::from_ymd_opt(current_year, current_month+month_offset, 1); // Erster Tag des Monats (z.B. 2024-07-01)
|
||||||
let last_day: Option<NaiveDate> = NaiveDate::from_ymd_opt(current_year, current_month+1, 1).unwrap().pred_opt(); //Letzter Tag des Monats(z.B. 2024-07-31)
|
let last_day: Option<NaiveDate> = NaiveDate::from_ymd_opt(current_year, current_month+1+month_offset, 1).unwrap().pred_opt(); //Letzter Tag des Monats(z.B. 2024-07-31)
|
||||||
// - Vektor mit allen Tagen im Monat erstellen
|
// - Vektor mit allen Tagen im Monat erstellen
|
||||||
let mut days_in_month_vec: Vec<Option<NaiveDate>> = Vec::new();
|
let mut days_in_month_vec: Vec<Option<NaiveDate>> = Vec::new();
|
||||||
let mut all_tuesdays: Vec<Option<NaiveDate>> = Vec::new();
|
let mut all_tuesdays: Vec<Option<NaiveDate>> = Vec::new();
|
||||||
|
@ -148,32 +167,6 @@ fn get2nd_and4th_tuesdays() -> Vec<Option<NaiveDate>>{
|
||||||
all_tuesdays
|
all_tuesdays
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get2nd_and4th_tuesdays_of_next_month() -> Vec<Option<NaiveDate>>{
|
|
||||||
// Jeden Donnerstag im Monat finden:
|
|
||||||
let today = Local::now(); // jetzige Zeit abrufen (z.B. 2024-07-17 15:36:31.660997700 +02:00)
|
|
||||||
let current_month = today.month(); // diesen Monat als Zahl (z.B. 7)
|
|
||||||
let current_year = today.year(); // dieses Jahr als Zahl (z.B. 2024)
|
|
||||||
let first_day: Option<NaiveDate> = NaiveDate::from_ymd_opt(current_year, current_month+1, 1); // Erster Tag des Monats (z.B. 2024-07-01)
|
|
||||||
let last_day: Option<NaiveDate> = NaiveDate::from_ymd_opt(current_year, current_month+2, 1).unwrap().pred_opt(); //Letzter Tag des Monats(z.B. 2024-07-31)
|
|
||||||
// - Vektor mit allen Tagen im Monat erstellen
|
|
||||||
let mut days_in_month_vec: Vec<Option<NaiveDate>> = Vec::new();
|
|
||||||
let mut all_tuesdays: Vec<Option<NaiveDate>> = Vec::new();
|
|
||||||
let mut current_day: Option<NaiveDate> = first_day;
|
|
||||||
while current_day <= last_day {
|
|
||||||
days_in_month_vec.push(current_day);
|
|
||||||
current_day = current_day.unwrap().succ_opt()
|
|
||||||
}
|
|
||||||
// - Alle bis auf Donnerstage raus
|
|
||||||
for element in days_in_month_vec {
|
|
||||||
match element.unwrap().weekday() {
|
|
||||||
Weekday::Tue => {print!("{} ", element.unwrap());
|
|
||||||
all_tuesdays.push(element)},
|
|
||||||
_ => {} // Kein Dienstag,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
all_tuesdays
|
|
||||||
}
|
|
||||||
|
|
||||||
fn check_if_plenum(zweiter_dienstag: String, vierter_dienstag: String, date_to_check: NaiveDate) -> bool {
|
fn check_if_plenum(zweiter_dienstag: String, vierter_dienstag: String, date_to_check: NaiveDate) -> bool {
|
||||||
// Überprüfen, ob an dem Datum Plenum ist
|
// Überprüfen, ob an dem Datum Plenum ist
|
||||||
let date_to_check = date_to_check.to_string();
|
let date_to_check = date_to_check.to_string();
|
||||||
|
@ -192,31 +185,36 @@ fn did_the_pad_change (pad_content: &String) -> bool {
|
||||||
m.is_some()
|
m.is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mail_versenden(inhalt: String, betreff: String) -> std::result::Result<(), Box<dyn std::error::Error>> {
|
fn mail_versenden(inhalt: String, betreff: String) -> std::result::Result<String, Box<dyn std::error::Error>> {
|
||||||
// Define the email
|
// Define the email
|
||||||
|
let message_id: String = Uuid::new_v4().to_string() + &String::from("@berlin.ccc.de");
|
||||||
|
|
||||||
let email = Message::builder()
|
let email = Message::builder()
|
||||||
// Set the sender's name and email address
|
// Set the sender's name and email address
|
||||||
.from("Plenum Bot <plenum-bot@berlin.ccc.de>".parse().unwrap())
|
.from("Plenum Bot <plenum-bot@berlin.ccc.de>".parse().unwrap())
|
||||||
// Set the recipient's name and email address
|
// Set the recipient's name and email address
|
||||||
.to("Marek Krug <mail@marekkrug.de>".parse().unwrap())
|
.to("Marek Krug <mail@marekkrug.de>".parse().unwrap())
|
||||||
|
.message_id(Option::from(message_id.clone()))
|
||||||
|
.in_reply_to("19de3985-05b4-42f3-9a6a-e941479be2ed@berlin.ccc.de".to_string())
|
||||||
// Set the subject of the email
|
// Set the subject of the email
|
||||||
.subject(betreff)
|
.subject(betreff)
|
||||||
.singlepart(SinglePart::builder()
|
.singlepart(SinglePart::builder()
|
||||||
.header(header::ContentType::TEXT_PLAIN)
|
.header(header::ContentType::TEXT_PLAIN)
|
||||||
.body(inhalt))
|
.body(inhalt))
|
||||||
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
// Set up the SMTP client
|
// Set up the SMTP client
|
||||||
let creds = Credentials::new("plenum-bot@berlin.ccc.de".to_string(), "m9yBn16pUtbC".to_string());
|
let creds = Credentials::new("plenum-bot@berlin.ccc.de".to_string(), "m9yBn16pUtbC".to_string());
|
||||||
// Open a remote connection to gmail
|
// Open a remote connection to gmail
|
||||||
|
|
||||||
let mailer = SmtpTransport::starttls_relay("mail.berlin.ccc.de")?
|
let mailer = SmtpTransport::starttls_relay("mail.berlin.ccc.de")?
|
||||||
.credentials(creds)
|
.credentials(creds)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// Send the email
|
// Send the email
|
||||||
match mailer.send(&email) {
|
match mailer.send(&email) {
|
||||||
Ok(_) => println!("Email sent successfully!"),
|
Ok(_) => println!("Email sent successfully!"),
|
||||||
Err(e) => eprintln!("Could not send email: {:?}", e), }
|
Err(e) => eprintln!("Could not send email: {:?}", e), }
|
||||||
Ok(())
|
Ok(message_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_new_pad_for_following_date(datum: String) {
|
fn generate_new_pad_for_following_date(datum: String) {
|
||||||
|
@ -227,5 +225,4 @@ fn generate_new_pad_for_following_date(datum: String) {
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
println!("{}", rand_string)
|
println!("{}", rand_string)
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue