powershell 寄送email(內部server)
Send-MailMessage -From "it@test.com" -To "test@test.com" -Subject "subjects" -Body "FYI" -Attachment "C:\sayhello\hello.csv" -SmtpServer "192.1.2.1"
Send-MailMessage -From "it@test.com" -To "test@test.com" -Subject "subjects" -Body "FYI" -Attachment "C:\sayhello\hello.csv" -SmtpServer "192.1.2.1"
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { return $true } $EmailToAddresses = @("test1@test.com", "test2@test.com") $EmailTo = "" $EmailFrom = "it@test.com" $Subject = "subjects" $Body = "FYI" $SMTPServer = "192.1.2.1" $filenameAndPath = "C:\sayhello\sayhello.csv" $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) $SMTPClient.EnableSsl = $true $SMTPClient.Credentials = New-Object System.Net.NetworkCredential("username", "password"); foreach ($EmailTo in $EmailToAddresses) { $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body) $attachment = New-Object System.Net.Mail.Attachment($filenameAndPath) $SMTPMessage.Attachments.Add($attachment) $SMTPClient.Send($SMTPMessage) }
好久沒有打包自己開發的程式,尤其是msi 或是 msix 方便讓網域主控站派送,
因此試用了advanced installer 17.5, 欲藉由匯入visual studio 2019 專案, 打包成msi檔案,
但是出現了,以下錯誤,
.ctor could not load file or assembly system.runtime.compilerservices.unsafe 4.0.4.1
原以為是vs的問題, 後來爬文終於找到解法, 這個問題似乎出現很久, advanced installer 呈現已知但是無解的狀態,看來真的很複雜.
步驟1. 安裝.net framework 4.7.2 (請與vs專案參考版本同步)
步驟2. 以管理者身分執行, developer command prompt for vs 2019
步驟3. 輸入以下指令(請與vs專案參考版本同步)
gacutil /f -i "C:\Program Files\dotnet\sdk\3.1.401\Sdks\Microsoft.NET.Sdk.WindowsDesktop\tools\net472\System.Runtime.CompilerServices.Unsafe.dll" gacutil /f -i "C:\Program Files\dotnet\sdk\3.1.401\Sdks\Microsoft.NET.Sdk.WindowsDesktop\tools\net472\System.Numerics.Vectors.dll"
前陣子使用兩台PC安裝pve, 做成cluster方便管理, 但遇到其中一台只要使用zfs就會出錯, 另一台是正常的.
可是有一天遇到停電. 重開機之後, 另一台原本zfs正常,居然出現找不到zfs的錯誤訊息.
當時我登入到第一台查看, 系統出現zfs硬碟正常的, 但總是無法透過GUI介面新增回來, 最後發現, 我應該要登入第二台,才可讓zfs重新回來, 原來這兩台是合作, 又保有各自隱私呢.
哈!, 使用storage server習慣了, 遇到沒有storage server就手忙腳亂一番, 因此記錄下來.
我個人很喜歡老派這個字, 英文叫做 old school
周遭的人有好多好多老派的人, 他們不喜歡網頁版郵件, 只習慣使用單機版的outlook收發信件, 作業系統更是windows不做他想.
因為公司多了一個越南廠, 考量初期VPN自架, 不作為主力, 該廠的通訊錄就無法透過vpn, 以LDAP方式分享 .
可是outlook通訊錄就只有兩種 : MAPI, LDAP
MAPI可以是離線版, LDAP必須連線才能使用
偏偏老派的做風就是: 離線也要能寫寫郵件, 看看郵件(pop3完全下載), 與存取完整的通訊錄
這下好了, 我得準備離線版的通訊錄, 爬文好幾天, 終於找到一個方式跟大家分享:
網域伺服器上, 可透過powershell執行指令,匯出csv通訊錄
Get-ADUser -Filter 'mail -like "*<domain>"' -SearchBase "<search base>" -Properties * | Select -Property DisplayName,GivenName,Surname,mail,Title,Department,Office | Export-CSV "<csv file location>" -NoTypeInformation -Encoding UTF8
以test.com為例子
Get-ADUser -Filter 'mail -like "*test.com"' -SearchBase "OU=taipei,DC=test,DC=com" -Properties * | Select -Property DisplayName,GivenName,Surname,mail,Title,Department,Office | Export-CSV "c:\aaa.csv" -NoTypeInformation -Encoding UTF8
我開發的windows app, 使用visual studio 2019 community version , 語言使用vb
https://github.com/WilliamFromTW/ImportFromCsvToOutlook https://github.com/WilliamFromTW/ImportFromCsvToOutlook/releases
因為時間不多, 未來也不打算花太多時間在通訊錄上面, 爬文的過程只能找到零星vba for outlook版本或是程式片段, 四處碰壁, 無人可以解答, 頂多就是要你教老派的人, 使用outlook匯出匯入功能, 一堆步驟, 將csv檔案匯入到outlook, 這簡直是天方夜譚.
因此就自行開發,並且開源, 這樣直接編譯成可安裝執行的APP, 讓他們透過定期提供的csv檔案, 就能很方便匯入通訊錄了.
微軟的網域主控站非常好用, 尤其用來管控帳號密碼.
但是修改密碼,就必須透過加入網域的主機才能修改, 有點不方便,
尤其有些人的電腦並沒有加入網域, 要是想改密碼更是麻煩.
基於APACHE 2.0授權的 https://github.com/pwm-project/pwm 就能協助我們修改密碼.
安裝成功後, 請先用管理者帳號登入, 登入時需要額外設定忘記密碼的安全提問(管理者可直接跳過),
此時要選擇修改設定檔案, 將修改密碼的複雜度降低(但不可低於原本網域設定), 我是順便將安全提問改成一個就好.
修改config/config.inc.php
網域伺服器 192.168.1.1
網域: test.com
$config['address_book_type'] = 'ldap'; $config['ldap_public']['Global'] = array( 'name' => '台灣總公司', 'hosts' => array('192.168.1.1'), 'port' => 3268, 'user_specific' => false, 'base_dn' => 'dc=test,dc=com', 'bind_dn' => 'cn=administrator,cn=users,dc=test,dc=com', 'bind_pass' => 'password', 'ldap_version' => 3, 'search_fields' => array ( 'mail','cn',), 'name_field' => 'cn', 'email_field' => 'mail', 'writable' => 'false', 'scope' => 'sub', 'sizelimit' => 6000, 'sort' => 'cn', 'filter' => '(&(mail=)(|(&(objectClass=user)(!(objectClass=computer)))))', 'fuzzy_search' => true, 'global_search' => true );
2022/11/05
我後來使用docker doundcubemail 重新安裝, 因為用latest , 當時版本 1.6.x 版本 , 發現上面的設定已經不能用了, 改用以下設定(紅色部分需調整)
$config['address_book_type'] = 'ldap';
$config['ldap_debug'] = true;
$config['ldap_public'] = array(
'MyAdLdap' => array (
'name' => 'TW',
'hosts' => array('網域主機IP'),
'sizelimit' => 6000,
'port' => 3268,
'use_tls' => false,
'user_specific' => false,
'base_dn' => 'OU=group,DC=test,DC=com',
'bind_dn' => 'user@test.com',
'bind_pass' => 'password',
'writable' => false,
'ldap_version' => 3,
'search_fields' => array(
'mail',
'cn',
),
'fieldmap' => array(
'name' => 'cn',
'email' => 'mail',
'surname' => 'sn',
'firstname' => 'givenName',
),
'sort' => 'sn',
'scope' => 'sub', # or 'list'
'filter' => '(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group)))',
'global_search' => true,
'fuzzy_search' => true,
'vlv' => false,
),
);
詳請參考 https://github.com/roundcube/roundcubemail/wiki/Configuration:-LDAP-Address-Books#prerequisites
這種小細節原本不想寫出來,但是很容易忘,又特別重要,
我在 dovecot v2.2發現的, 舉dovecot-ldap.conf.ext 為例子, 如何將AD的mail屬性值承接起來
user_attrs = mail=sieve=/home/vmail/%$/sieve/dovecot.sieve, mail=sieve_dir=/home/vmail/%$/sieve
上面粗黑體的 mail 傳送給sieve與sieve_dir這兩個變數(沒錯,你沒看錯,一堆等號,超怪異的), 而這兩個變數利用 %$ 這個來承接最左邊的mail的數值: 例如AD上某帳號的數值為:test@kafeou.pw 我們就能輕易變更整個dovecot系統的變數值,而且彈性很大,結果如下: sieve = /home/vmail/test@kafeiou.pw/sieve/dovecot.sieve sieve_dir = /home/vmail/test@kafeiou.pw/sieve
另外要注意的地方是, 這些變數原本所在的位置, 千萬不要移除, 就算預設值不對也沒關係(會被蓋過去),
否則會被當作沒此變數
2017 年曾經在centos 7.3版本讓postfix擁有vacation功能, 當時 dovecot 是1.x版 , 後來不慎直接upgrade 到2.x, 結果整個都不能用, 很慘,
之前2014年也在CentOS 6.x 新增過vacation, 也是耗了極大精神才弄出來. 這就是opensource的最大問題, 他可以直接停止更新舊版本, 新版本又必須大改才能相容.
現在我在 CentOS 7.8 再次挑戰lda managesieve功能, 請到這觀看,
帳密都是guest/guest
https://docs.kafeiou.pw/iammis/技術文章/HowTo/10031_(CEntOS7.8)新增lda_managesieve功能.txt
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install -y opendkim
opendkim-genkey -d <domain name>
cp default.* /etc/opendkim/keys
chown -R opendkim:opendkim /etc/opendkim
Mode sv
Socket inet:8891@127.0.0.1
Canonicalization relaxed/simple
Domain <domain name>
#KeyFile /etc/opendkim/keys/default.private
KeyTable refile:/etc/opendkim/KeyTable
#ps 若使用測試軟體出現invalid data set, 請改成 KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
default._domainkey.<domain name> <domain name>:default:/etc/opendkim/keys/default.private
以 test.com 為例子
default._domainkey.test.com test.com:default:/etc/opendkim/keys/default.private
*@<domain name> default._domainkey.<domain name>
以test.com為例子
*@test.com default._domainkey.test.com
127.0.0.1
<mail host name>
<domain name>
以 test.com 為例子
127.0.0.1
mail.test.com
test.com
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
將/etc/opendkim/key/default.txt的資料更新到dns上
啟用service
systemctl start opendkim ; systemctl enable opendkim ; systemctl restart postfix