mirror of
				https://github.com/lelgenio/maildir-notify-daemon.git
				synced 2025-11-04 08:17:37 -03:00 
			
		
		
		
	init
This commit is contained in:
		
							parent
							
								
									044a9b16fe
								
							
						
					
					
						commit
						a4e4cdd851
					
				
					 4 changed files with 1421 additions and 0 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					/target
 | 
				
			||||||
							
								
								
									
										1306
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										1306
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										13
									
								
								Cargo.toml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Cargo.toml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					[package]
 | 
				
			||||||
 | 
					name = "maildir-notify-daemon"
 | 
				
			||||||
 | 
					version = "0.1.0"
 | 
				
			||||||
 | 
					edition = "2021"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[dependencies]
 | 
				
			||||||
 | 
					hotwatch = "0.4.6"
 | 
				
			||||||
 | 
					mailparse = "0.13.8"
 | 
				
			||||||
 | 
					notify-rust = "4.5.6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[features]
 | 
				
			||||||
							
								
								
									
										101
									
								
								src/main.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								src/main.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,101 @@
 | 
				
			||||||
 | 
					use hotwatch::blocking::{
 | 
				
			||||||
 | 
					    Flow,
 | 
				
			||||||
 | 
					    Hotwatch,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					use mailparse::{
 | 
				
			||||||
 | 
					    self,
 | 
				
			||||||
 | 
					    MailHeaderMap,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					use notify_rust::Notification;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn main() {
 | 
				
			||||||
 | 
					    let args = std::env::args(); // .collect::<Vec<_>>();
 | 
				
			||||||
 | 
					                                 // let path = args.get(1).expect("No path provided, exiting");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut hotwatch =
 | 
				
			||||||
 | 
					        Hotwatch::new_with_custom_delay(std::time::Duration::from_secs(0))
 | 
				
			||||||
 | 
					            .expect("hotwatch failed to initialize!");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    println!("starting");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for arg in args {
 | 
				
			||||||
 | 
					        hotwatch
 | 
				
			||||||
 | 
					            .watch(arg, handle_event)
 | 
				
			||||||
 | 
					            .expect("hotwatch failed to initialize!");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    hotwatch.run();
 | 
				
			||||||
 | 
					    println!("exiting");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn handle_event(event: hotwatch::Event) -> hotwatch::blocking::Flow {
 | 
				
			||||||
 | 
					    _handle_event(event);
 | 
				
			||||||
 | 
					    Flow::Continue
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn _handle_event(event: hotwatch::Event) {
 | 
				
			||||||
 | 
					    let newfile = match dbg! {event} {
 | 
				
			||||||
 | 
					        hotwatch::Event::Create(newfile) => newfile,
 | 
				
			||||||
 | 
					        _ => return,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let raw_content = match std::fs::read_to_string(&newfile) {
 | 
				
			||||||
 | 
					        Ok(c) => c,
 | 
				
			||||||
 | 
					        Err(e) => {
 | 
				
			||||||
 | 
					            eprintln!(
 | 
				
			||||||
 | 
					                "Cannot read file '{}': {:?}",
 | 
				
			||||||
 | 
					                newfile.to_string_lossy(),
 | 
				
			||||||
 | 
					                e
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mail_content = match mailparse::parse_mail(raw_content.as_bytes()) {
 | 
				
			||||||
 | 
					        Ok(c) => c,
 | 
				
			||||||
 | 
					        Err(e) => {
 | 
				
			||||||
 | 
					            eprintln!(
 | 
				
			||||||
 | 
					                "Cannot parse file '{}': {:?}",
 | 
				
			||||||
 | 
					                newfile.to_string_lossy(),
 | 
				
			||||||
 | 
					                e
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let headers = mail_content.get_headers();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    eprintln!("getting from field");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let from = match headers.get_first_value("From") {
 | 
				
			||||||
 | 
					        Some(f) => f,
 | 
				
			||||||
 | 
					        None => {
 | 
				
			||||||
 | 
					            eprintln!("Cannot parse file '{}'", newfile.to_string_lossy(),);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    eprintln!("getting subject field");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let subject = match headers.get_first_value("Subject") {
 | 
				
			||||||
 | 
					        Some(sub) => sub,
 | 
				
			||||||
 | 
					        None => mail_content
 | 
				
			||||||
 | 
					            .get_body()
 | 
				
			||||||
 | 
					            .unwrap_or("".to_string())
 | 
				
			||||||
 | 
					            .lines()
 | 
				
			||||||
 | 
					            .filter(|line| line.len() != 0)
 | 
				
			||||||
 | 
					            .next()
 | 
				
			||||||
 | 
					            .unwrap_or("")
 | 
				
			||||||
 | 
					            .to_string(),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    eprintln!("setting subject field to {}", &subject);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    eprintln!("showing notification");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Notification::new()
 | 
				
			||||||
 | 
					        .summary(&format!("From: {}", from))
 | 
				
			||||||
 | 
					        .body(&format!("Subject: {}", subject))
 | 
				
			||||||
 | 
					        .icon("mail-unread-symbolic")
 | 
				
			||||||
 | 
					        .show()
 | 
				
			||||||
 | 
					        .ok();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue