2008/12/03

Outlook2007は、メールアドレスに.の連続(hoge...hoge@example.com)や@の前に.がある場合(hoge.hoge.@example.com)にはメールを送信することができません。受信トレイに「システム管理者」から送信不能と通知メッセージが入ります。

これは別にOutlook2007が悪いんじゃなくて、RFCに準拠しているためです。でもDocomoやauなど、このRFCに準拠していないキャリアがあって、結構、よく見ます。その辺の詳しい事情はこちらなどをどうぞ。

で、Outlookユーザーはじゃあこれらのメアドにはメールを送れないのか、と言うとそうではなく、実は裏技があって、@の前の部分を""(ダブルクォーテーション)でくくることで送信可能になります。

"hoge...hoge"@example.comや"hoge.hoge."@example.comなどのようにします。これはOKとRFCで規定されてるらしいですね。

でも毎回これを手で入力するのはメンドイ!

ということでなんとかしてみました。

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Dim oMailItem As MailItem
    Dim bExistInvalidAddress As Boolean
    
    If TypeName(Item) = "MailItem" Then
        Set oMailItem = Item
        
        Dim reAddress As New RegExp
        reAddress.Pattern = "([a-zA-Z0-9\-\_\.]+)\@([a-zA-Z0-9\-\_\.]+)"
        reAddress.Global = True
            
        sMailAddresses = Split(oMailItem.To, ";")
        
        For I = 0 To UBound(sMailAddresses)
            If (InStr(sMailAddresses(I), "..") Or InStr(sMailAddresses(I), ".@")) And _
            InStr(sMailAddresses(I), """") = 0 Then
                sMailAddresses(I) = reAddress.Replace(sMailAddresses(I), """$1""@$2")
                bExistInvalidAddress = True
            End If

        Next
        
        If bExistInvalidAddress Then
            oMailItem.To = Join(sMailAddresses, ";")
            Cancel = True
        End If
        
    End If
End Sub

このようなコードをThisOutlookSessionに埋め込みます。VBエディタでF2キーを押してMicrosoft VBScript Regular Expression 1.0と5.5を参照設定してください。ただしマクロなんで毎回起動時にマクロを有効にするか聞かれます。(以上の意味が分からない方は使わないほうが無難です)

すると、問題あるメールアドレスのメールを送信しようとすると、正しくクォーテーションがつけられたメールアドレスに変換します。ただしTo:だけです。Cc:やBcc:にも対応してもよかったんですがそれは宿題ということで。

Cancel=Trueは要らないと思ったんですが、これを取るとなんかさらに''でクォートされて送信トレイに残骸が残ってしまいます。ので、一度メール編集画面に戻るようにしています。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2008/12/03/162596.aspx

2007/11/08

Scripting Weblog
http://blogs.wankuma.com/mutaguchi/

という文字列を選択して実行すると

Scripting Weblog

というアンカータグをつくってくれるマクロ。IEと連携するにはこのBookmarkletを併用するといい感じです。

URLだけ選択してもそのURLへのアンカータグを作ってくれます。

便利ー。

'URLにアンカータグを付ける
	Set RegEx = New RegExp
	RegEx.Global = True
	RegEx.MultiLine=True
	RegEx.Pattern = "(http\:\/\/[\:\w\/\.\?\&\#\~\=\-\+\@\%\,\(\)]+)"

Set sel=document.selection
If Not sel.IsEmpty Then
	sText=sel.Text
	
	If InStr(sText,vbCrLf)<>0 Then
		sNewLine=vbCrLf
	ElseIf InStr(sText,vbCr)<>0 Then
		sNewLine=vbCr
	ElseIf InStr(sText,vbLf)<>0 Then
		sNewLine=vbLf
	Else
		sNewLine=vbCrLf
	End If
	
	If InStr(sText,sNewLine)<>0 Then
		aLine=Split(sText,sNewLine)
		If Ubound(aLine)=1 Then
			'2行の場合、1行目をタイトル、2行目をURLとみなしてリンク化
			sel.Text="" &  aLine(0) & ""
		Else
			'複数行の場合、URLのみをリンク化
			sel.Text=RegEx.Replace(sText,"$1")
		End If
	Else
		sel.Text=RegEx.Replace(sText,"$1")
	End If 
	
	sel.Collapse
End If
元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/11/08/106982.aspx

.NETアプリをFramework付属のコンパイラを使ってコンパイルし、できあがった実行ファイルexeを実行するというものです。これがまた便利でw *.vbか*.csか*.jsファイルを開いた状態で、コメント行に記述したコンパイラに渡すオプション(VB.NETなら'/r:System.Windows.Forms.Dll /t:winexeという行の/r:System.Windows.Forms.Dll /t:winexeという部分)を選択すると、そのコンパイラオプションをつけてコンパイルします。デフォルトだと/t:exeが渡されます。

'*.cs, *.vb, *.jsをコンパイルして実行
Set regEX = New RegExp
regEx.Global = True
regEX.IgnoreCase = True
Set Fs = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")

sCompilerDir = "C:\windows\Microsoft.NET\Framework\v2.0.50727\"
sDefaultArguments = "/t:exe" 'winexe
sSourcePath = Document.FullName
sEXEPath = Fs.BuildPath(Fs.GetParentFolderName(sSourcePath),Fs.GetBaseName(sSourcePath) & ".exe") 
sExt = LCase(Fs.GetExtensionName(sSourcePath))

Document.Save sSourcePath 'ソース保存

Select Case sExt
	Case "vb" : sCompilerPath = sCompilerDir & "vbc.exe"
	Case "cs" : sCompilerPath = sCompilerDir & "csc.exe"
	Case "js" : sCompilerPath = sCompilerDir & "jsc.exe"
	Case Else : sCompilerPath = ""
End Select

Set sel = Document.Selection

If sel.IsEmpty Then
	sArguments = sDefaultArguments
Else
	regEx.Pattern = "\s?(\/[^\:]+\:\S+)\s?"
	If regEx.Test(sel.Text) Then
		For Each oMatch In regEx.Execute(sel.Text)
			sArguments = sArguments & oMatch.SubMatches(0) & " "
		Next
	Else
		sArguments = ""
	End If
End If

If sCompilerPath="" Then
	Alert sExt & "ファイルに対応するコンパイラがありません。"
Else
	sCommandLine = "cmd.exe /k " & sCompilerPath & " " & _
	"/out:" & """" & sEXEPath & """" & " " & sArguments & " " & _
	"""" & sSourcePath & """"
	WshShell.Run sCommandLine ,,True 'コンパイル実行
	If Fs.FileExists(sEXEPath) Then
		WshShell.Run sEXEPath,,True 'コンパイルしたファイルを実行
	Else
		Alert "コンパイルに失敗したようです。"
	End If
End If
元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/11/08/106978.aspx

HTMLサニタイズ用のマクロです。やはりサニタイズをかけたいところを選択して実行してください。

'サニタイズ
Set sel=document.selection
If Not sel.IsEmpty Then
 sText=sel.Text
 sText=Replace(sText,"&","&")
 sText=Replace(sText,"<","<")
 sText=Replace(sText,">",">")
 sText=Replace(sText,"""",""")
 sel.Text=sText
End If

これも何気に便利で良く使っています。このエントリを投稿するのにも使いましたw

元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/11/08/106969.aspx

EmEditorというテキストエディタはマクロがVBS/JSで書けるのが気に入ってます。私がよく使うマクロをいくつかご紹介します。その1は文字数カウントマクロです。数えたい部分を選択して(ファイル全体を数える時はCtrl+Aして)実行してください。

Set sel = document.selection
alert len(sel.text)

シンプルだけど便利。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/11/08/106967.aspx

Copyright © 2005-2016 Daisuke Mutaguchi All rights reserved

mailto: mutaguchi at roy.hi-ho.ne.jp

Awards

Books

Twitter